diff --git a/debian/control b/debian/control index b0d6e2e..28a062d 100644 --- a/debian/control +++ b/debian/control @@ -31,22 +31,6 @@ Description: nymea.io plugin for Drexel & Weiss heat pumps This package will install the nymea.io plugin for Drexel & Weiss heat pumps -Package: nymea-plugin-fronius -Architecture: any -Section: libs -Depends: ${shlibs:Depends}, - ${misc:Depends}, - nymea-plugins-translations, -Description: nymea.io plugin for Fronius PV inverters - The nymea daemon is a plugin based IoT (Internet of Things) server. The - server works like a translator for devices, things and services and - allows them to interact. - With the powerful rule engine you are able to connect any device available - in the system and create individual scenes and behaviors for your environment. - . - This package will install the nymea.io plugin for Fronius - - Package: nymea-plugin-modbuscommander Architecture: any Multi-Arch: same diff --git a/debian/nymea-plugin-fronius.install.in b/debian/nymea-plugin-fronius.install.in deleted file mode 100644 index 82fff67..0000000 --- a/debian/nymea-plugin-fronius.install.in +++ /dev/null @@ -1 +0,0 @@ -usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_devicepluginfronius.so diff --git a/fronius/README.md b/fronius/README.md deleted file mode 100644 index b074586..0000000 --- a/fronius/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# Fronius - -nymea plug-in for Fronius solar devices. - -## Supported Things - -* PV-Inverter -* Storage -* Data Logger -* Smart Meter - -## Requirements - -* The package "nymea-plugin-fronius" must be installed. - -## More -https://www.fronius.com/en/photovoltaics - diff --git a/fronius/fronius.png b/fronius/fronius.png deleted file mode 100644 index ddd67fd..0000000 Binary files a/fronius/fronius.png and /dev/null differ diff --git a/fronius/fronius.pro b/fronius/fronius.pro deleted file mode 100644 index e213a6a..0000000 --- a/fronius/fronius.pro +++ /dev/null @@ -1,25 +0,0 @@ -include(../plugins.pri) - -QT += \ - serialbus \ - network \ - -SOURCES += \ - integrationpluginfronius.cpp \ - froniusthing.cpp \ - froniuslogger.cpp \ - froniusinverter.cpp \ - froniusstorage.cpp \ - froniusmeter.cpp \ - sunspecthing.cpp \ - ../modbus/modbustcpmaster.cpp \ - -HEADERS += \ - integrationpluginfronius.h \ - froniusthing.h \ - froniuslogger.h \ - froniusinverter.h \ - froniusstorage.h \ - froniusmeter.h \ - sunspecthing.h \ - ../modbus/modbustcpmaster.h \ diff --git a/fronius/froniusinverter.cpp b/fronius/froniusinverter.cpp deleted file mode 100644 index 3f43aed..0000000 --- a/fronius/froniusinverter.cpp +++ /dev/null @@ -1,135 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -* -* Copyright 2013 - 2020, nymea GmbH -* Contact: contact@nymea.io -* -* This file is part of nymea. -* This project including source code and documentation is protected by -* copyright law, and remains the property of nymea GmbH. All rights, including -* reproduction, publication, editing and translation, are reserved. The use of -* this project is subject to the terms of a license agreement to be concluded -* with nymea GmbH in accordance with the terms of use of nymea GmbH, available -* under https://nymea.io/license -* -* GNU Lesser General Public License Usage -* Alternatively, this project may be redistributed and/or modified under the -* terms of the GNU Lesser General Public License as published by the Free -* Software Foundation; version 3. This project is distributed in the hope that -* it will be useful, but WITHOUT ANY WARRANTY; without even the implied -* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License -* along with this project. If not, see . -* -* For any further details and any questions please contact us under -* contact@nymea.io or see our FAQ/Licensing Information on -* https://nymea.io/license/faq -* -* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#include "froniusinverter.h" -#include -#include "extern-plugininfo.h" -#include - -FroniusInverter::FroniusInverter(Thing *thing, QObject *parent) : FroniusThing(thing, parent) -{ - -} - -QString FroniusInverter::activity() const -{ - return m_activity; -} - -void FroniusInverter::setActivity(const QString &activity) -{ - m_activity = activity; -} - -QUrl FroniusInverter::updateUrl() -{ - QUrl requestUrl; - requestUrl.setScheme("http"); - QUrlQuery query; - requestUrl.setHost(hostAddress()); - requestUrl.setPath(baseUrl() + "GetInverterRealtimeData.cgi"); - query.addQueryItem("Scope", "Device"); - query.addQueryItem("DeviceId", deviceId()); - query.addQueryItem("DataCollection", "CommonInverterData"); - requestUrl.setQuery(query); - - return requestUrl; -} - -void FroniusInverter::updateThingInfo(const QByteArray &data) -{ - // Convert the rawdata to a JSON document - QJsonParseError error; - QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &error); - if (error.error != QJsonParseError::NoError) { - qCWarning(dcFronius()) << "FroniusInverter: Failed to parse JSON data" << data << ":" << error.errorString(); - pluginThing()->setStateValue(inverterConnectedStateTypeId,false); - return; - } - - // Parse the data and update the states of our device - QVariantMap dataMap = jsonDoc.toVariant().toMap().value("Body").toMap().value("Data").toMap(); - QVariantMap headMap = jsonDoc.toVariant().toMap().value("Head").toMap(); - - // Set the inverter device state - if (dataMap.contains("PAC")) { - if(dataMap.value("PAC").toMap().values().at(0) == "W") - pluginThing()->setStateValue(inverterCurrentPowerStateTypeId, dataMap.value("PAC").toMap().values().at(1).toInt()); - } - - if (dataMap.contains("DAY_ENERGY")) { - if (dataMap.value("DAY_ENERGY").toMap().values().at(0) == "Wh") - pluginThing()->setStateValue(inverterEdayStateTypeId, dataMap.value("DAY_ENERGY").toMap().values().at(1).toDouble()/1000); - } - - if (dataMap.contains("YEAR_ENERGY")) { - if(dataMap.value("YEAR_ENERGY").toMap().values().at(0) == "Wh") - pluginThing()->setStateValue(inverterEyearStateTypeId, dataMap.value("YEAR_ENERGY").toMap().values().at(1).toInt()/1000); - } - - if (dataMap.contains("TOTAL_ENERGY")) { - if(dataMap.value("TOTAL_ENERGY").toMap().values().at(0) == "Wh") - pluginThing()->setStateValue(inverterTotalEnergyProducedStateTypeId, dataMap.value("TOTAL_ENERGY").toMap().values().at(1).toInt()/1000); - } - - //update successful - pluginThing()->setStateValue(inverterConnectedStateTypeId,true); - -} - -QUrl FroniusInverter::activityUrl() -{ - QUrl requestUrl; - requestUrl.setScheme("http"); - requestUrl.setHost(hostAddress()); - requestUrl.setPath(baseUrl()+"GetPowerFlowRealtimeData.fcgi"); - - return requestUrl; -} - -void FroniusInverter::updateActivityInfo(const QByteArray &data) -{ - // Convert the rawdata to a json document - QJsonParseError error; - QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &error); - if(error.error != QJsonParseError::NoError) { - qCWarning(dcFronius()) << "FroniusInverter: Failed to parse JSON data" << data << ":" << error.errorString(); - return; - } - - // create StorageInfo list map - QVariantMap dataMap = jsonDoc.toVariant().toMap().value("Body").toMap().value("Data").toMap(); - - if (dataMap.value("Site").toMap().value("P_PV").toFloat() > 0) { - pluginThing()->setStateValue(inverterActiveStateTypeId, "production"); - } else { - pluginThing()->setStateValue(inverterActiveStateTypeId, "inactive"); - } -} diff --git a/fronius/froniusinverter.h b/fronius/froniusinverter.h deleted file mode 100644 index 0b67e59..0000000 --- a/fronius/froniusinverter.h +++ /dev/null @@ -1,56 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -* -* Copyright 2013 - 2020, nymea GmbH -* Contact: contact@nymea.io -* -* This file is part of nymea. -* This project including source code and documentation is protected by -* copyright law, and remains the property of nymea GmbH. All rights, including -* reproduction, publication, editing and translation, are reserved. The use of -* this project is subject to the terms of a license agreement to be concluded -* with nymea GmbH in accordance with the terms of use of nymea GmbH, available -* under https://nymea.io/license -* -* GNU Lesser General Public License Usage -* Alternatively, this project may be redistributed and/or modified under the -* terms of the GNU Lesser General Public License as published by the Free -* Software Foundation; version 3. This project is distributed in the hope that -* it will be useful, but WITHOUT ANY WARRANTY; without even the implied -* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License -* along with this project. If not, see . -* -* For any further details and any questions please contact us under -* contact@nymea.io or see our FAQ/Licensing Information on -* https://nymea.io/license/faq -* -* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#ifndef FRONIUSINVERTER_H -#define FRONIUSINVERTER_H - -#include -#include "froniusthing.h" - -class FroniusInverter : public FroniusThing -{ - Q_OBJECT - -public: - explicit FroniusInverter(Thing *thing, QObject *parent = 0); - - QString activity() const; - void setActivity(const QString &activity); - Thing* inverterThing() const; - QUrl updateUrl(); - void updateThingInfo(const QByteArray &data); - QUrl activityUrl(); - void updateActivityInfo(const QByteArray &data); - -private: - QString m_activity; -}; - -#endif // FRONIUSINVERTER_H diff --git a/fronius/froniuslogger.cpp b/fronius/froniuslogger.cpp deleted file mode 100644 index e15651d..0000000 --- a/fronius/froniuslogger.cpp +++ /dev/null @@ -1,145 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -* -* Copyright 2013 - 2020, nymea GmbH -* Contact: contact@nymea.io -* -* This file is part of nymea. -* This project including source code and documentation is protected by -* copyright law, and remains the property of nymea GmbH. All rights, including -* reproduction, publication, editing and translation, are reserved. The use of -* this project is subject to the terms of a license agreement to be concluded -* with nymea GmbH in accordance with the terms of use of nymea GmbH, available -* under https://nymea.io/license -* -* GNU Lesser General Public License Usage -* Alternatively, this project may be redistributed and/or modified under the -* terms of the GNU Lesser General Public License as published by the Free -* Software Foundation; version 3. This project is distributed in the hope that -* it will be useful, but WITHOUT ANY WARRANTY; without even the implied -* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License -* along with this project. If not, see . -* -* For any further details and any questions please contact us under -* contact@nymea.io or see our FAQ/Licensing Information on -* https://nymea.io/license/faq -* -* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#include "froniuslogger.h" -#include "extern-plugininfo.h" - -#include -#include - -FroniusLogger::FroniusLogger(Thing *thing, QObject *parent) : FroniusThing(thing, parent) -{ - -} - -QUrl FroniusLogger::updateUrl() -{ - QUrl requestUrl; - requestUrl.setScheme("http"); - requestUrl.setHost(hostAddress()); - requestUrl.setPath(baseUrl() + "GetLoggerInfo.cgi"); - - return requestUrl; -} - -void FroniusLogger::updateThingInfo(const QByteArray &data) -{ - // Convert the rawdata to a json document - QJsonParseError error; - QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &error); - if (error.error != QJsonParseError::NoError) { - // qCWarning(dcFroniusSolar()) << "Failed to parse JSON data" << data << ":" << error.errorString(); - pluginThing()->setStateValue(dataloggerConnectedStateTypeId,false); - return; - } - - // Parse the data and update the states of our device - QVariantMap dataMap = jsonDoc.toVariant().toMap().value("Body").toMap().value("Data").toMap(); - QVariantMap headMap = jsonDoc.toVariant().toMap().value("Head").toMap(); - QVariantMap bodyMap = jsonDoc.toVariant().toMap().value("Body").toMap(); - - // print the fetched data in dataMap format to stdout - //qCDebug(dcFroniusSolar()) << dataMap; - - // create LoggerInfo list Map - QVariantMap LoggerInfoMap = bodyMap.value("LoggerInfo").toMap(); - - // copy retrieved information to device states - if (LoggerInfoMap.contains("ProductID")) - pluginThing()->setStateValue(dataloggerProductidStateTypeId, LoggerInfoMap.value("ProductID").toString()); - - if (LoggerInfoMap.contains("PlatformID")) - pluginThing()->setStateValue(dataloggerPlatformidStateTypeId, LoggerInfoMap.value("PlatformID").toString()); - - if (LoggerInfoMap.contains("HWVersion")) - pluginThing()->setStateValue(dataloggerHwversionStateTypeId, LoggerInfoMap.value("HWVersion").toString()); - - if (LoggerInfoMap.contains("SWVersion")) - pluginThing()->setStateValue(dataloggerSwversionStateTypeId, LoggerInfoMap.value("SWVersion").toString()); - - if (LoggerInfoMap.contains("TimezoneLocation")) - pluginThing()->setStateValue(dataloggerTzonelocStateTypeId, LoggerInfoMap.value("TimezoneLocation").toString()); - - if (LoggerInfoMap.contains("TimezoneName")) - pluginThing()->setStateValue(dataloggerTzoneStateTypeId, LoggerInfoMap.value("TimezoneName").toString()); - - if (LoggerInfoMap.contains("DefaultLanguage")) - pluginThing()->setStateValue(dataloggerDefaultlangStateTypeId, LoggerInfoMap.value("DefaultLanguage").toString()); - - if (LoggerInfoMap.contains("CashFactor")) - pluginThing()->setStateValue(dataloggerCashfactorStateTypeId, LoggerInfoMap.value("CashFactor").toDouble()); - - if (LoggerInfoMap.contains("CashCurrency")) - pluginThing()->setStateValue(dataloggerCashcurrencyStateTypeId, LoggerInfoMap.value("CashCurrency").toString()); - - if (LoggerInfoMap.contains("CO2Factor")) - pluginThing()->setStateValue(dataloggerCo2factorStateTypeId, LoggerInfoMap.value("CO2Factor").toDouble()); - - if (LoggerInfoMap.contains("CO2Unit")) - pluginThing()->setStateValue(dataloggerCo2unitStateTypeId, LoggerInfoMap.value("CO2Unit").toString()); - - //update successful - pluginThing()->setStateValue(dataloggerConnectedStateTypeId,true); -} - -void FroniusLogger::updatePowerRelayState(const QByteArray &data) -{ - // Convert the rawdata to a json document - QJsonParseError error; - QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &error); - if (error.error != QJsonParseError::NoError) { - // qCWarning(dcFroniusSolar()) << "Failed to parse JSON data" << data << ":" << error.errorString(); - pluginThing()->setStateValue(dataloggerConnectedStateTypeId,false); - return; - } - - // Parse the data and update the states of our device - QVariantMap bodyMap = jsonDoc.toVariant().toMap().value("Body").toMap(); - QVariantMap dataMap = bodyMap.value("Data").toMap(); - QVariantMap emrsMap = dataMap.value("emrs").toMap(); - - // create LoggerInfo list Map - QVariantMap GpiosMap = emrsMap.value("gpios").toMap(); - //qCDebug(dcFroniusSolar()) << "Body: " << GpiosMap; - - // copy retrieved information to device states - if (GpiosMap.contains("Reason")) { - qCDebug(dcFronius()) << "Power Relay State Reason: " << GpiosMap.value("Reason").toString(); - pluginThing()->setStateValue(dataloggerPowerManagmentRelayReasonStateTypeId, GpiosMap.value("Reason").toString()); - } - - if (GpiosMap.contains("State")) { - qCDebug(dcFronius()) << "Power Relay State: " << GpiosMap.value("State").toString(); - pluginThing()->setStateValue(dataloggerPowerManagmentRelayStateTypeId, GpiosMap.value("State").toBool()); - } - - //update successful - pluginThing()->setStateValue(dataloggerConnectedStateTypeId,true); -} diff --git a/fronius/froniuslogger.h b/fronius/froniuslogger.h deleted file mode 100644 index afb94a5..0000000 --- a/fronius/froniuslogger.h +++ /dev/null @@ -1,53 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -* -* Copyright 2013 - 2020, nymea GmbH -* Contact: contact@nymea.io -* -* This file is part of nymea. -* This project including source code and documentation is protected by -* copyright law, and remains the property of nymea GmbH. All rights, including -* reproduction, publication, editing and translation, are reserved. The use of -* this project is subject to the terms of a license agreement to be concluded -* with nymea GmbH in accordance with the terms of use of nymea GmbH, available -* under https://nymea.io/license -* -* GNU Lesser General Public License Usage -* Alternatively, this project may be redistributed and/or modified under the -* terms of the GNU Lesser General Public License as published by the Free -* Software Foundation; version 3. This project is distributed in the hope that -* it will be useful, but WITHOUT ANY WARRANTY; without even the implied -* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License -* along with this project. If not, see . -* -* For any further details and any questions please contact us under -* contact@nymea.io or see our FAQ/Licensing Information on -* https://nymea.io/license/faq -* -* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#ifndef FRONIUSLOGGER_H -#define FRONIUSLOGGER_H - -#include -#include -#include "froniusinverter.h" -#include "froniusmeter.h" -#include "froniusstorage.h" - -class FroniusLogger : public FroniusThing -{ - Q_OBJECT - -public: - explicit FroniusLogger(Thing *thing, QObject *parent = 0); - - QUrl updateUrl(); - - void updateThingInfo(const QByteArray &data); - void updatePowerRelayState(const QByteArray &data); -}; - -#endif // FRONIUSLOGGER_H diff --git a/fronius/froniusmeter.cpp b/fronius/froniusmeter.cpp deleted file mode 100644 index fe66230..0000000 --- a/fronius/froniusmeter.cpp +++ /dev/null @@ -1,127 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -* -* Copyright 2013 - 2020, nymea GmbH -* Contact: contact@nymea.io -* -* This file is part of nymea. -* This project including source code and documentation is protected by -* copyright law, and remains the property of nymea GmbH. All rights, including -* reproduction, publication, editing and translation, are reserved. The use of -* this project is subject to the terms of a license agreement to be concluded -* with nymea GmbH in accordance with the terms of use of nymea GmbH, available -* under https://nymea.io/license -* -* GNU Lesser General Public License Usage -* Alternatively, this project may be redistributed and/or modified under the -* terms of the GNU Lesser General Public License as published by the Free -* Software Foundation; version 3. This project is distributed in the hope that -* it will be useful, but WITHOUT ANY WARRANTY; without even the implied -* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License -* along with this project. If not, see . -* -* For any further details and any questions please contact us under -* contact@nymea.io or see our FAQ/Licensing Information on -* https://nymea.io/license/faq -* -* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#include "froniusmeter.h" -#include "extern-plugininfo.h" - -#include -#include - -FroniusMeter::FroniusMeter(Thing* thing, QObject *parent) : FroniusThing(thing, parent) -{ - -} - -QString FroniusMeter::activity() const -{ - return m_activity; -} - -void FroniusMeter::setActivity(const QString &activity) -{ - m_activity = activity; -} - -QUrl FroniusMeter::updateUrl() -{ - QUrl requestUrl; - requestUrl.setScheme("http"); - QUrlQuery query; - requestUrl.setHost(hostAddress()); - requestUrl.setPath(baseUrl() + "GetMeterRealtimeData.cgi"); - query.addQueryItem("Scope", "Device"); - query.addQueryItem("DeviceId", deviceId()); - requestUrl.setQuery(query); - return requestUrl; -} - -void FroniusMeter::updateThingInfo(const QByteArray &data) -{ - // Convert the rawdata to a JSON document - QJsonParseError error; - QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &error); - if (error.error != QJsonParseError::NoError) { - qCWarning(dcFronius()) << "FroniusMeter: Failed to parse JSON data" << data << ":" << error.errorString(); - pluginThing()->setStateValue(inverterConnectedStateTypeId,false); - return; - } - - // Parse the data and update the states of our thing - QVariantMap dataMap = jsonDoc.toVariant().toMap().value("Body").toMap().value("Data").toMap(); - //QVariantMap headMap = jsonDoc.toVariant().toMap().value("Head").toMap(); - - //Add Smart meter with following states: „PowerReal_P_Sum“, „EnergyReal_WAC_Sum_Produced“, „EnergyReal_WAC_Sum_Consumed“ - - // Set the inverter thing state - if (dataMap.contains("PowerReal_P_Sum")) { - pluginThing()->setStateValue(meterCurrentPowerStateTypeId, dataMap.value("PowerReal_P_Sum").toInt()); - } - - if (dataMap.contains("EnergyReal_WAC_Sum_Produced")) { - pluginThing()->setStateValue(meterTotalEnergyProducedStateTypeId, dataMap.value("EnergyReal_WAC_Sum_Produced").toInt()/1000); - } - - if (dataMap.contains("EnergyReal_WAC_Sum_Consumed")) { - pluginThing()->setStateValue(meterTotalEnergyConsumedStateTypeId, dataMap.value("EnergyReal_WAC_Sum_Consumed").toInt()/1000); - } - - //update successful - pluginThing()->setStateValue(meterConnectedStateTypeId,true); -} - -QUrl FroniusMeter::activityUrl() -{ - QUrl requestUrl; - requestUrl.setScheme("http"); - requestUrl.setHost(hostAddress()); - requestUrl.setPath(baseUrl()+"GetPowerFlowRealtimeData.fcgi"); - - return requestUrl; -} - -void FroniusMeter::updateActivityInfo(const QByteArray &data) -{ - // Convert the rawdata to a json document - QJsonParseError error; - QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &error); - if(error.error != QJsonParseError::NoError) { - qCWarning(dcFronius()) << "FroniusMeter: Failed to parse JSON data" << data << ":" << error.errorString(); - return; - } - - // create Meter Info list map - //QVariantMap dataMap = jsonDoc.toVariant().toMap().value("Body").toMap().value("Data").toMap(); - - //if (dataMap.value("Site").toMap().value("P_PV").toFloat() > 0) { - // pluginThing()->setStateValue(inverteractivStateTypeId, "production"); - //} else { - // pluginThing()->setStateValue(inverteractivStateTypeId, "inactive"); - //} -} diff --git a/fronius/froniusmeter.h b/fronius/froniusmeter.h deleted file mode 100644 index a629d8a..0000000 --- a/fronius/froniusmeter.h +++ /dev/null @@ -1,55 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -* -* Copyright 2013 - 2020, nymea GmbH -* Contact: contact@nymea.io -* -* This file is part of nymea. -* This project including source code and documentation is protected by -* copyright law, and remains the property of nymea GmbH. All rights, including -* reproduction, publication, editing and translation, are reserved. The use of -* this project is subject to the terms of a license agreement to be concluded -* with nymea GmbH in accordance with the terms of use of nymea GmbH, available -* under https://nymea.io/license -* -* GNU Lesser General Public License Usage -* Alternatively, this project may be redistributed and/or modified under the -* terms of the GNU Lesser General Public License as published by the Free -* Software Foundation; version 3. This project is distributed in the hope that -* it will be useful, but WITHOUT ANY WARRANTY; without even the implied -* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License -* along with this project. If not, see . -* -* For any further details and any questions please contact us under -* contact@nymea.io or see our FAQ/Licensing Information on -* https://nymea.io/license/faq -* -* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#ifndef FRONIUSMETER_H -#define FRONIUSMETER_H - -#include -#include "froniusthing.h" - -class FroniusMeter : public FroniusThing -{ - Q_OBJECT -public: - explicit FroniusMeter(Thing* thing, QObject *parent = 0); - - QString activity() const; - void setActivity(const QString &activity); - Thing* inverterThing() const; - QUrl updateUrl(); - void updateThingInfo(const QByteArray &data); - QUrl activityUrl(); - void updateActivityInfo(const QByteArray &data); - -private: - QString m_activity; -}; - -#endif // FRONIUSMETER_H diff --git a/fronius/froniusstorage.cpp b/fronius/froniusstorage.cpp deleted file mode 100644 index 1567a46..0000000 --- a/fronius/froniusstorage.cpp +++ /dev/null @@ -1,138 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -* -* Copyright 2013 - 2020, nymea GmbH -* Contact: contact@nymea.io -* -* This file is part of nymea. -* This project including source code and documentation is protected by -* copyright law, and remains the property of nymea GmbH. All rights, including -* reproduction, publication, editing and translation, are reserved. The use of -* this project is subject to the terms of a license agreement to be concluded -* with nymea GmbH in accordance with the terms of use of nymea GmbH, available -* under https://nymea.io/license -* -* GNU Lesser General Public License Usage -* Alternatively, this project may be redistributed and/or modified under the -* terms of the GNU Lesser General Public License as published by the Free -* Software Foundation; version 3. This project is distributed in the hope that -* it will be useful, but WITHOUT ANY WARRANTY; without even the implied -* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License -* along with this project. If not, see . -* -* For any further details and any questions please contact us under -* contact@nymea.io or see our FAQ/Licensing Information on -* https://nymea.io/license/faq -* -* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#include "froniusstorage.h" -#include -#include "extern-plugininfo.h" -#include - -FroniusStorage::FroniusStorage(Thing* thing, QObject *parent) : FroniusThing(thing, parent) -{ - -} - -QString FroniusStorage::charging_state() const -{ - return m_charging_state; -} - -void FroniusStorage::setChargingState(const QString &charging_state) -{ - m_charging_state = charging_state; -} - -int FroniusStorage::charge() const -{ - return m_charge; -} - -void FroniusStorage::setCharge(const int &charge) -{ - m_charge = charge; -} - -QUrl FroniusStorage::updateUrl() -{ - QUrl requestUrl; - requestUrl.setScheme("http"); - QUrlQuery query; - requestUrl.setHost(hostAddress()); - requestUrl.setPath(baseUrl() + "GetStorageRealtimeData.cgi"); - query.addQueryItem("Scope", "Device"); - query.addQueryItem("DeviceId", deviceId()); - requestUrl.setQuery(query); - - return requestUrl; -} - -void FroniusStorage::updateThingInfo(const QByteArray &data) -{ - // Convert the rawdata to a JSON document - QJsonParseError error; - QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &error); - - if (error.error != QJsonParseError::NoError) { - qCWarning(dcFronius()) << "FroniusStorage: Failed to parse JSON data" << data << ":" << error.errorString(); - pluginThing()->setStateValue(storageConnectedStateTypeId,false); - return; - } - - // Parse the data and update the states of our thing - QVariantMap dataMap = jsonDoc.toVariant().toMap().value("Body").toMap().value("Data").toMap(); - // QVariantMap headMap = jsonDoc.toVariant().toMap().value("Head").toMap(); - - // create StorageInfo list map - QVariantMap storageInfoMap = dataMap.value("Controller").toMap(); - - // copy retrieved information to thing states - if (storageInfoMap.contains("StateOfCharge_Relative")) { - pluginThing()->setStateValue(storageBatteryLevelStateTypeId, storageInfoMap.value("StateOfCharge_Relative").toInt()); - pluginThing()->setStateValue(storageBatteryCriticalStateTypeId, storageInfoMap.value("StateOfCharge_Relative").toInt() < 5); - } - - if (storageInfoMap.contains("Temperature_Cell")) - pluginThing()->setStateValue(storageCellTemperatureStateTypeId, storageInfoMap.value("Temperature_Cell").toDouble()); - - //update successful - pluginThing()->setStateValue(storageConnectedStateTypeId,true); -} - -QUrl FroniusStorage::activityUrl() -{ - QUrl requestUrl; - requestUrl.setScheme("http"); - requestUrl.setHost(hostAddress()); - requestUrl.setPath(baseUrl()+"GetPowerFlowRealtimeData.fcgi"); - - return requestUrl; -} - -void FroniusStorage::updateActivityInfo(const QByteArray &data) -{ - // Convert the rawdata to a json document - QJsonParseError error; - QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &error); - if(error.error != QJsonParseError::NoError) { - qCWarning(dcFronius()) << "FroniusStorage: Failed to parse JSON data" << data << ":" << error.errorString(); - return; - } - - // create StorageInfo list map - QVariantMap dataMap = jsonDoc.toVariant().toMap().value("Body").toMap().value("Data").toMap(); - - float charge_akku = dataMap.value("Site").toMap().value("P_Akku").toFloat(); - if (charge_akku == 0) { - pluginThing()->setStateValue(storageChargingStateTypeId, "inactive"); - } else if (charge_akku < 0) { - pluginThing()->setStateValue(storageChargingStateTypeId, "charging"); - } else { - pluginThing()->setStateValue(storageChargingStateTypeId, "discharging"); - } -} diff --git a/fronius/froniusstorage.h b/fronius/froniusstorage.h deleted file mode 100644 index fd61dd4..0000000 --- a/fronius/froniusstorage.h +++ /dev/null @@ -1,60 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -* -* Copyright 2013 - 2020, nymea GmbH -* Contact: contact@nymea.io -* -* This file is part of nymea. -* This project including source code and documentation is protected by -* copyright law, and remains the property of nymea GmbH. All rights, including -* reproduction, publication, editing and translation, are reserved. The use of -* this project is subject to the terms of a license agreement to be concluded -* with nymea GmbH in accordance with the terms of use of nymea GmbH, available -* under https://nymea.io/license -* -* GNU Lesser General Public License Usage -* Alternatively, this project may be redistributed and/or modified under the -* terms of the GNU Lesser General Public License as published by the Free -* Software Foundation; version 3. This project is distributed in the hope that -* it will be useful, but WITHOUT ANY WARRANTY; without even the implied -* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License -* along with this project. If not, see . -* -* For any further details and any questions please contact us under -* contact@nymea.io or see our FAQ/Licensing Information on -* https://nymea.io/license/faq -* -* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#ifndef FRONIUSSTORAGE_H -#define FRONIUSSTORAGE_H - -#include -#include "froniusthing.h" - -class FroniusStorage : public FroniusThing -{ - Q_OBJECT - -public: - explicit FroniusStorage(Thing *thing, QObject *parent = 0); - - QString charging_state() const; - void setChargingState(const QString &charging_state); - - int charge() const; - void setCharge(const int &charge); - - QUrl updateUrl(); - void updateThingInfo(const QByteArray &data); - QUrl activityUrl(); - void updateActivityInfo(const QByteArray &data); - -private: - QString m_charging_state; - int m_charge; - -}; -#endif // FRONIUSSTORAGE_H diff --git a/fronius/froniusthing.cpp b/fronius/froniusthing.cpp deleted file mode 100644 index af3903c..0000000 --- a/fronius/froniusthing.cpp +++ /dev/null @@ -1,102 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -* -* Copyright 2013 - 2020, nymea GmbH -* Contact: contact@nymea.io -* -* This file is part of nymea. -* This project including source code and documentation is protected by -* copyright law, and remains the property of nymea GmbH. All rights, including -* reproduction, publication, editing and translation, are reserved. The use of -* this project is subject to the terms of a license agreement to be concluded -* with nymea GmbH in accordance with the terms of use of nymea GmbH, available -* under https://nymea.io/license -* -* GNU Lesser General Public License Usage -* Alternatively, this project may be redistributed and/or modified under the -* terms of the GNU Lesser General Public License as published by the Free -* Software Foundation; version 3. This project is distributed in the hope that -* it will be useful, but WITHOUT ANY WARRANTY; without even the implied -* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License -* along with this project. If not, see . -* -* For any further details and any questions please contact us under -* contact@nymea.io or see our FAQ/Licensing Information on -* https://nymea.io/license/faq -* -* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#include "froniusthing.h" - -FroniusThing::FroniusThing(Thing *thing, QObject *parent) : - QObject(parent) -{ - m_thing = thing; -} - -QString FroniusThing::name() const -{ - return m_name; -} - -void FroniusThing::setName(const QString &name) -{ - m_name = name; -} - -QString FroniusThing::hostId() const -{ - return m_hostId; -} - -void FroniusThing::setHostId(const QString &hostId) -{ - m_hostId = hostId; -} - -QString FroniusThing::hostAddress() const -{ - return m_hostAddress; -} - -void FroniusThing::setHostAddress(const QString &hostAddress) -{ - m_hostAddress = hostAddress; -} - -QString FroniusThing::baseUrl() const -{ - return m_baseUrl; -} - -void FroniusThing::setBaseUrl(const QString &baseUrl) -{ - m_baseUrl = baseUrl; -} - -QString FroniusThing::uniqueId() const -{ - return m_uniqueId; -} - -void FroniusThing::setUniqueId(const QString &uniqueId) -{ - m_uniqueId = uniqueId; -} - -QString FroniusThing::deviceId() const -{ - return m_thingId; -} - -void FroniusThing::setDeviceId(const QString &thingId) -{ - m_thingId = thingId; -} - -Thing* FroniusThing::pluginThing() const -{ - return m_thing; -} diff --git a/fronius/froniusthing.h b/fronius/froniusthing.h deleted file mode 100644 index 9f7acbd..0000000 --- a/fronius/froniusthing.h +++ /dev/null @@ -1,82 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -* -* Copyright 2013 - 2020, nymea GmbH -* Contact: contact@nymea.io -* -* This file is part of nymea. -* This project including source code and documentation is protected by -* copyright law, and remains the property of nymea GmbH. All rights, including -* reproduction, publication, editing and translation, are reserved. The use of -* this project is subject to the terms of a license agreement to be concluded -* with nymea GmbH in accordance with the terms of use of nymea GmbH, available -* under https://nymea.io/license -* -* GNU Lesser General Public License Usage -* Alternatively, this project may be redistributed and/or modified under the -* terms of the GNU Lesser General Public License as published by the Free -* Software Foundation; version 3. This project is distributed in the hope that -* it will be useful, but WITHOUT ANY WARRANTY; without even the implied -* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License -* along with this project. If not, see . -* -* For any further details and any questions please contact us under -* contact@nymea.io or see our FAQ/Licensing Information on -* https://nymea.io/license/faq -* -* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#ifndef FRONIUSTHING_H -#define FRONIUSTHING_H - -#include "extern-plugininfo.h" -#include "integrations/thing.h" - -#include -#include -#include - -class FroniusThing : public QObject -{ - Q_OBJECT - -public: - explicit FroniusThing(Thing *thing, QObject *parrent = 0); - - QString name() const; - void setName(const QString &name); - - QString hostId() const; - void setHostId(const QString &hostId); - - QString hostAddress() const; - void setHostAddress(const QString &hostAddress); - - QString baseUrl() const; - void setBaseUrl(const QString &baseUrl); - - QString uniqueId() const; - void setUniqueId(const QString &uniqueId); - - QString deviceId() const; - void setDeviceId(const QString &deviceId); - - Thing* pluginThing() const; - -private: - - Thing* m_thing; - - QString m_name; - QString m_hostId; - QString m_hostAddress; - QString m_apiVersion; - QString m_baseUrl; - QString m_uniqueId; - QString m_thingId; - -}; - -#endif // FRONIUSTHING_H diff --git a/fronius/integrationpluginfronius.cpp b/fronius/integrationpluginfronius.cpp deleted file mode 100644 index e5f0753..0000000 --- a/fronius/integrationpluginfronius.cpp +++ /dev/null @@ -1,582 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -* -* Copyright 2013 - 2020, nymea GmbH -* Contact: contact@nymea.io -* -* This file is part of nymea. -* This project including source code and documentation is protected by -* copyright law, and remains the property of nymea GmbH. All rights, including -* reproduction, publication, editing and translation, are reserved. The use of -* this project is subject to the terms of a license agreement to be concluded -* with nymea GmbH in accordance with the terms of use of nymea GmbH, available -* under https://nymea.io/license -* -* GNU Lesser General Public License Usage -* Alternatively, this project may be redistributed and/or modified under the -* terms of the GNU Lesser General Public License as published by the Free -* Software Foundation; version 3. This project is distributed in the hope that -* it will be useful, but WITHOUT ANY WARRANTY; without even the implied -* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License -* along with this project. If not, see . -* -* For any further details and any questions please contact us under -* contact@nymea.io or see our FAQ/Licensing Information on -* https://nymea.io/license/faq -* -* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#include "integrationpluginfronius.h" -#include "plugintimer.h" -#include "network/networkaccessmanager.h" - -#include -#include -#include -#include -#include "plugininfo.h" -#include - -// Notes: Test IPs: 93.82.221.82 | 88.117.152.99 - -IntegrationPluginFronius::IntegrationPluginFronius(QObject *parent): IntegrationPlugin(parent){ - -} - -void IntegrationPluginFronius::setupThing(ThingSetupInfo *info) -{ - qCDebug(dcFronius()) << "Setting up a new thing:" << info->thing()->name(); - - Thing *thing = info->thing(); - - if (thing->thingClassId() == dataloggerThingClassId) { - //check if a data logger is already added with this IPv4Address - foreach(FroniusLogger *logger, m_froniusLoggers.keys()){ - if(logger->hostAddress() == thing->paramValue(dataloggerThingLoggerHostParamTypeId).toString()){ - //this logger at this IPv4 address is already added - qCWarning(dcFronius()) << "thing at " << thing->paramValue(dataloggerThingLoggerHostParamTypeId).toString() << " already added!"; - info->finish(Thing::ThingErrorThingInUse); - return; - } - } - - // Perform a HTTP request on the given IPv4Address to find things - QUrl requestUrl; - requestUrl.setScheme("http"); - requestUrl.setHost(thing->paramValue(dataloggerThingLoggerHostParamTypeId).toString()); - requestUrl.setPath("/solar_api/GetAPIVersion.cgi"); - - qCDebug(dcFronius()) << "Search at address" << requestUrl.toString(); - - QNetworkReply *reply = hardwareManager()->networkManager()->get(QNetworkRequest(requestUrl)); - connect(reply, &QNetworkReply::finished, reply, &QNetworkReply::deleteLater); - connect(reply, &QNetworkReply::finished, [this, info, thing, reply]() { - QByteArray data = reply->readAll(); - - if (reply->error() != QNetworkReply::NoError) { - qCWarning(dcFronius()) << "Fronius: Network request error:" << reply->error() << reply->errorString() << reply->url(); - info->finish(Thing::ThingErrorHardwareNotAvailable, tr("Device not reachable")); - return; - } - - // Convert the rawdata to a JSON document - QJsonParseError error; - QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &error); - if (error.error != QJsonParseError::NoError) { - qCWarning(dcFronius()) << "Fronius: Failed to parse JSON data" << data << ":" << error.errorString() << data; - info->finish(Thing::ThingErrorHardwareFailure, tr("Please try again")); - return; - } - - FroniusLogger *newLogger = new FroniusLogger(thing, this); - newLogger->setBaseUrl(jsonDoc.toVariant().toMap().value("BaseURL").toString()); - newLogger->setHostAddress(thing->paramValue(dataloggerThingLoggerHostParamTypeId).toString()); - m_froniusLoggers.insert(newLogger, thing); - - info->finish(Thing::ThingErrorNoError); - }); - //Async Setup - } else if (thing->thingClassId() == inverterThingClassId) { - - FroniusInverter *newInverter = new FroniusInverter(thing,this); - newInverter->setDeviceId(thing->paramValue(inverterThingIdParamTypeId).toString()); - newInverter->setBaseUrl(thing->paramValue(inverterThingBaseParamTypeId).toString()); - newInverter->setHostAddress(thing->paramValue(inverterThingHostParamTypeId).toString()); - - m_froniusInverters.insert(newInverter,thing); - - // get inverter unique ID - QUrl requestUrl; - requestUrl.setScheme("http"); - requestUrl.setHost(newInverter->hostAddress()); - requestUrl.setPath(newInverter->baseUrl() + "GetInverterInfo.cgi"); - - QNetworkReply *reply = hardwareManager()->networkManager()->get(QNetworkRequest(requestUrl)); - connect(reply, &QNetworkReply::finished, reply, &QNetworkReply::deleteLater); - connect(reply, &QNetworkReply::finished, [this, info, newInverter, reply]() { - QByteArray data = reply->readAll(); - reply->deleteLater(); - - if (reply->error() != QNetworkReply::NoError) { - qCWarning(dcFronius()) << "Fronius: Network request error:" << reply->error() << reply->errorString(); - info->finish(Thing::ThingErrorHardwareNotAvailable, "Device not reachable"); - return; - } - - // Convert the rawdata to a json document - QJsonParseError error; - QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &error); - if (error.error != QJsonParseError::NoError) { - qCWarning(dcFronius()) << "Fronius: Failed to parse JSON data" << data << ":" << error.errorString(); - info->finish(Thing::ThingErrorHardwareNotAvailable, "Please try again"); - return; - } - - // Check reply information - QVariantMap dataMap = jsonDoc.toVariant().toMap().value("Body").toMap().value("Data").toMap(); - // check for thing id in reply - if (dataMap.contains(newInverter->deviceId())) { - qCDebug(dcFronius()) << "Found Thing with unique:" << dataMap.value(newInverter->deviceId()).toMap().value("UniqueID").toString(); - newInverter->setUniqueId(dataMap.value(newInverter->deviceId()).toMap().value("UniqueID").toString()); - newInverter->pluginThing()->setParamValue(inverterThingUniqueIdParamTypeId,newInverter->uniqueId()); - qCDebug(dcFronius()) << "Stored unique ID:" << newInverter->uniqueId(); - } - info->finish(Thing::ThingErrorNoError); - }); - // Async Setup - } else if (thing->thingClassId() == storageThingClassId) { - - FroniusStorage *newStorage = new FroniusStorage(thing, this); - newStorage->setDeviceId(thing->paramValue(storageThingIdParamTypeId).toString()); - newStorage->setBaseUrl(thing->paramValue(storageThingBaseParamTypeId).toString()); - newStorage->setHostAddress(thing->paramValue(storageThingHostParamTypeId).toString()); - m_froniusStorages.insert(newStorage,thing); - - // Get storage manufacturer and maximum capacity - QUrlQuery query; - QUrl requestUrl; - requestUrl.setScheme("http"); - requestUrl.setHost(newStorage->hostAddress()); - requestUrl.setPath(newStorage->baseUrl() + "GetStorageRealtimeData.cgi"); - query.addQueryItem("Scope","Device"); - query.addQueryItem("DeviceId", newStorage->deviceId()); - requestUrl.setQuery(query); - qCDebug(dcFronius()) << "Get Storage Data at address" << requestUrl.toString(); - QNetworkReply *reply = hardwareManager()->networkManager()->get(QNetworkRequest(requestUrl)); - connect(reply, &QNetworkReply::finished, reply, &QNetworkReply::deleteLater); - connect(reply, &QNetworkReply::finished, [this, info, newStorage, reply]() { - QByteArray data = reply->readAll(); - - if (reply->error() != QNetworkReply::NoError) { - qCWarning(dcFronius()) << "Fronius: Network request error:" << reply->error() << reply->errorString(); - info->finish(Thing::ThingErrorNoError); - return; - } - - // Convert the rawdata to a json document - QJsonParseError error; - QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &error); - if (error.error != QJsonParseError::NoError) { - qCWarning(dcFronius()) << "Fronius: Failed to parse JSON data" << data << ":" << error.errorString(); - info->finish(Thing::ThingErrorHardwareFailure, tr("Please try again")); - return; - } - - // Create StorageInfo list map - QVariantMap storageInfoMap = jsonDoc.toVariant().toMap().value("Body").toMap().value("Data").toMap().value("Controller").toMap(); - - newStorage->pluginThing()->setParamValue(storageThingManufacturerParamTypeId, storageInfoMap.value("Details").toMap().value("Manufacturer").toString()); - newStorage->pluginThing()->setParamValue(storageThingCapacityParamTypeId, storageInfoMap.value("Capacity_Maximum").toInt()); - info->finish(Thing::ThingErrorNoError); - }); - //Async Setup - } else if (thing->thingClassId() == meterThingClassId) { - - FroniusMeter *newMeter = new FroniusMeter(thing, this);; - newMeter->setDeviceId(thing->paramValue(meterThingIdParamTypeId).toString()); - newMeter->setBaseUrl(thing->paramValue(meterThingBaseParamTypeId).toString()); - newMeter->setHostAddress(thing->paramValue(meterThingHostParamTypeId).toString()); - - m_froniusMeters.insert(newMeter, thing); - info->finish(Thing::ThingErrorNoError); - //Async setup - } else if (thing->thingClassId() == sunspecStorageThingClassId) { - SunspecThing *sunspecThings = new SunspecThing(thing, this); - m_sunspecThings.insert(sunspecThings, thing); - info->finish(Thing::ThingErrorNoError); - } else { - Q_ASSERT_X(false, "setupThing", QString("Unhandled thingClassId: %1").arg(thing->thingClassId().toString()).toUtf8()); - } -} - -void IntegrationPluginFronius::postSetupThing(Thing *thing) -{ - qCDebug(dcFronius()) << "Post setup" << thing->name(); - - if (!m_pluginTimer) { - m_pluginTimer = hardwareManager()->pluginTimerManager()->registerTimer(30); - connect(m_pluginTimer, &PluginTimer::timeout, this, [this]() { - foreach (Thing *logger, m_froniusLoggers) - updateThingStates(logger); - - foreach (Thing *inverter, m_froniusInverters) - updateThingStates(inverter); - - foreach (Thing *meter, m_froniusMeters) - updateThingStates(meter); - - foreach (Thing *storage, m_froniusStorages) - updateThingStates(storage); - - foreach (SunspecThing *sunspecThing, m_sunspecThings.keys()) - sunspecThing->update(); - }); - } - - if (thing->thingClassId() == dataloggerThingClassId) { - searchNewThings(m_froniusLoggers.key(thing)); - updateThingStates(thing); - } else if (thing->thingClassId() == inverterThingClassId) { - updateThingStates(thing); - } else if (thing->thingClassId() == meterThingClassId) { - updateThingStates(thing); - } else if (thing->thingClassId() == storageThingClassId) { - updateThingStates(thing); - } else if (thing->thingClassId() == sunspecStorageThingClassId) { - SunspecThing *sunspecThing = m_sunspecThings.key(thing); - sunspecThing->update(); - } else { - Q_ASSERT_X(false, "postSetupThing", QString("Unhandled thingClassId: %1").arg(thing->thingClassId().toString()).toUtf8()); - } -} - -void IntegrationPluginFronius::thingRemoved(Thing *thing) -{ - if (thing->thingClassId() == dataloggerThingClassId) { - FroniusLogger *logger = m_froniusLoggers.key(thing); - m_froniusLoggers.remove(logger); - logger->deleteLater(); - return; - } else if (thing->thingClassId() == inverterThingClassId) { - FroniusInverter *inverter = m_froniusInverters.key(thing); - m_froniusInverters.remove(inverter); - inverter->deleteLater(); - return; - } else if (thing->thingClassId() == meterThingClassId) { - FroniusMeter *meter = m_froniusMeters.key(thing); - m_froniusMeters.remove(meter); - meter->deleteLater(); - return; - } else if (thing->thingClassId() == storageThingClassId) { - FroniusStorage *storage = m_froniusStorages.key(thing); - m_froniusStorages.remove(storage); - storage->deleteLater(); - return; - } else if (thing->thingClassId() == sunspecStorageThingClassId) { - qCDebug(dcFronius()) << "Remove sunspec thing"; - SunspecThing *sunspecThing = m_sunspecThings.key(thing); - m_sunspecThings.remove(sunspecThing); - delete sunspecThing; - qCDebug(dcFronius()) << "Sunspec thing deleted"; - return; - } else { - Q_ASSERT_X(false, "thingRemoved", QString("Unhandled thingClassId: %1").arg(thing->thingClassId().toString()).toUtf8()); - } - - if (myThings().isEmpty()) { - hardwareManager()->pluginTimerManager()->unregisterTimer(m_pluginTimer); - m_pluginTimer = nullptr; - } -} - - -void IntegrationPluginFronius::executeAction(ThingActionInfo *info) -{ - Action action = info->action(); - Thing *thing = info->thing(); - qCDebug(dcFronius()) << "Execute action" << thing->name() << action.actionTypeId().toString(); - - if (thing->thingClassId() == dataloggerThingClassId) { - - if (action.actionTypeId() == dataloggerSearchDevicesActionTypeId) { - searchNewThings(m_froniusLoggers.key(thing)); - info->finish(Thing::ThingErrorNoError); - } else { - Q_ASSERT_X(false, "executeAction", QString("Unhandled action: %1").arg(action.actionTypeId().toString()).toUtf8()); - } - } else if (thing->thingClassId() == sunspecStorageThingClassId) { - SunspecThing *sunspecThing = m_sunspecThings.key(thing); - if (!sunspecThing) { - qWarning(dcFronius()) << "Could not find sunspec instance for thing"; - info->finish(Thing::ThingErrorHardwareNotAvailable); - return; - } - - if (action.actionTypeId() == sunspecStorageGridChargingActionTypeId) { - QUuid requestId = sunspecThing->setGridCharging(action.param(sunspecStorageGridChargingActionGridChargingParamTypeId).value().toBool()); - if (requestId.isNull()) { - info->finish(Thing::ThingErrorHardwareFailure); - } else { - m_asyncActions.insert(requestId, info); - connect(info, &ThingActionInfo::aborted, this, [requestId, this] {m_asyncActions.remove(requestId);}); - } - } else if (action.actionTypeId() == sunspecStorageEnableChargingLimitActionTypeId) { - int value = (action.param(sunspecStorageEnableChargingLimitActionEnableChargingLimitParamTypeId).value().toBool() << 1) | thing->stateValue(sunspecStorageEnableDischargingLimitStateTypeId).toBool(); - QUuid requestId = sunspecThing->setStorageControlMode(value); - if (requestId.isNull()) { - info->finish(Thing::ThingErrorHardwareFailure); - } else { - m_asyncActions.insert(requestId, info); - connect(info, &ThingActionInfo::aborted, this, [requestId, this] {m_asyncActions.remove(requestId);}); - } - } else if (action.actionTypeId() == sunspecStorageChargingRateActionTypeId) { - QUuid requestId = sunspecThing->setChargingRate(action.param(sunspecStorageChargingRateActionChargingRateParamTypeId).value().toInt()); - if (requestId.isNull()) { - info->finish(Thing::ThingErrorHardwareFailure); - } else { - m_asyncActions.insert(requestId, info); - connect(info, &ThingActionInfo::aborted, this, [requestId, this] {m_asyncActions.remove(requestId);}); - } - } else if (action.actionTypeId() == sunspecStorageEnableDischargingLimitActionTypeId) { - int value = (action.param(sunspecStorageEnableDischargingLimitActionEnableDischargingLimitParamTypeId).value().toBool() << 1) | thing->stateValue(sunspecStorageEnableChargingLimitStateTypeId).toBool(); - QUuid requestId = sunspecThing->setStorageControlMode(value); - if (requestId.isNull()) { - info->finish(Thing::ThingErrorHardwareFailure); - } else { - m_asyncActions.insert(requestId, info); - connect(info, &ThingActionInfo::aborted, this, [requestId, this] {m_asyncActions.remove(requestId);}); - } - } else if (action.actionTypeId() == sunspecStorageDischargingRateActionTypeId) { - QUuid requestId = sunspecThing->setDischargingRate(action.param(sunspecStorageDischargingRateActionDischargingRateParamTypeId).value().toInt()); - if (requestId.isNull()) { - info->finish(Thing::ThingErrorHardwareFailure); - } else { - m_asyncActions.insert(requestId, info); - connect(info, &ThingActionInfo::aborted, this, [requestId, this] {m_asyncActions.remove(requestId);}); - } - } else { - Q_ASSERT_X(false, "executeAction", QString("Unhandled action: %1").arg(action.actionTypeId().toString()).toUtf8()); - } - } else { - Q_ASSERT_X(false, "executeAction", QString("Unhandled thingClassId: %1").arg(thing->thingClassId().toString()).toUtf8()); - } -} - -void IntegrationPluginFronius::updateThingStates(Thing *thing) -{ - qCDebug(dcFronius()) << "Update thing values for" << thing->name(); - - if(thing->thingClassId() == inverterThingClassId) { - QNetworkReply *reply = hardwareManager()->networkManager()->get(QNetworkRequest(m_froniusInverters.key(thing)->updateUrl())); - connect(reply, &QNetworkReply::finished, reply, &QNetworkReply::deleteLater); - connect(reply, &QNetworkReply::finished, [this, thing, reply]() { - - if (reply->error() != QNetworkReply::NoError) { - qCWarning(dcFronius()) << "Network request error:" << reply->error() << reply->errorString() << reply->request().url(); - return; - } - QByteArray data = reply->readAll(); - if(m_froniusInverters.values().contains(thing)){ // check if thing was not removed before reply was received - m_froniusInverters.key(thing)->updateThingInfo(data); - } - }); - QNetworkReply *next_reply = hardwareManager()->networkManager()->get(QNetworkRequest(m_froniusInverters.key(thing)->activityUrl())); - connect(next_reply, &QNetworkReply::finished, next_reply, &QNetworkReply::deleteLater); - connect(next_reply, &QNetworkReply::finished, [this, thing, next_reply]() { - if (next_reply->error() != QNetworkReply::NoError) { - qCWarning(dcFronius()) << "Network request error:" << next_reply->error() << next_reply->errorString() << next_reply->request().url(); - return; - } - QByteArray data = next_reply->readAll(); - if(m_froniusInverters.values().contains(thing)){ // check if thing was not removed before reply was received - m_froniusInverters.key(thing)->updateActivityInfo(data); - } - }); - } else if (thing->thingClassId() == dataloggerThingClassId) { - QNetworkReply *reply = hardwareManager()->networkManager()->get(QNetworkRequest(m_froniusLoggers.key(thing)->updateUrl())); - connect(reply, &QNetworkReply::finished, reply, &QNetworkReply::deleteLater); - connect(reply, &QNetworkReply::finished, [this, thing, reply]() { - - if (reply->error() != QNetworkReply::NoError) { - qCWarning(dcFronius()) << "Network request error:" << reply->error() << reply->errorString() << reply->request().url(); - return; - } - QByteArray data = reply->readAll(); - if(m_froniusLoggers.values().contains(thing)){ // check if thing was not removed before reply was received - m_froniusLoggers.key(thing)->updateThingInfo(data); - } - }); - - } else if (thing->thingClassId() == meterThingClassId) { - QNetworkReply *reply = hardwareManager()->networkManager()->get(QNetworkRequest(m_froniusMeters.key(thing)->updateUrl())); - connect(reply, &QNetworkReply::finished, reply, &QNetworkReply::deleteLater); - connect(reply, &QNetworkReply::finished, [this, thing, reply]() { - if (reply->error() != QNetworkReply::NoError) { - qCWarning(dcFronius()) << "Network request error:" << reply->error() << reply->errorString() << reply->request().url(); - return; - } - QByteArray data = reply->readAll(); - if(m_froniusMeters.values().contains(thing)){ // check if thing was not removed before reply was received - m_froniusMeters.key(thing)->updateThingInfo(data); - } - }); - QNetworkReply *next_reply = hardwareManager()->networkManager()->get(QNetworkRequest(m_froniusMeters.key(thing)->activityUrl())); - connect(next_reply, &QNetworkReply::finished, next_reply, &QNetworkReply::deleteLater); - connect(next_reply, &QNetworkReply::finished, [this, thing, next_reply]() { - - if (next_reply->error() != QNetworkReply::NoError) { - qCWarning(dcFronius()) << "Network request error:" << next_reply->error() << next_reply->errorString() << next_reply->request().url(); - return; - } - QByteArray data = next_reply->readAll(); - if(m_froniusMeters.values().contains(thing)){ // check if thing was not removed before reply was received - m_froniusMeters.key(thing)->updateActivityInfo(data); - } - }); - } else if (thing->thingClassId() == storageThingClassId) { - QNetworkReply *reply = hardwareManager()->networkManager()->get(QNetworkRequest(m_froniusStorages.key(thing)->updateUrl())); - connect(reply, &QNetworkReply::finished, reply, &QNetworkReply::deleteLater); - connect(reply, &QNetworkReply::finished, [this, thing, reply]() { - - if (reply->error() != QNetworkReply::NoError) { - qCWarning(dcFronius()) << "Network request error:" << reply->error() << reply->errorString() << reply->request().url(); - return; - } - QByteArray data = reply->readAll(); - if(m_froniusStorages.values().contains(thing)){ // check if thing was not removed before reply was received - m_froniusStorages.key(thing)->updateThingInfo(data); - } - }); - QNetworkReply *next_reply = hardwareManager()->networkManager()->get(QNetworkRequest(m_froniusStorages.key(thing)->activityUrl())); - connect(next_reply, &QNetworkReply::finished, next_reply, &QNetworkReply::deleteLater); - connect(next_reply, &QNetworkReply::finished, [this, thing, next_reply]() { - next_reply->deleteLater(); - if (next_reply->error() != QNetworkReply::NoError) { - qCWarning(dcFronius()) << "Network request error:" << next_reply->error() << next_reply->errorString() << next_reply->request().url(); - return; - } - QByteArray data = next_reply->readAll(); - if(m_froniusStorages.values().contains(thing)){ // check if thing was not removed before reply was received - m_froniusStorages.key(thing)->updateActivityInfo(data); - } - }); - } else { - Q_ASSERT_X(false, "updateThingState", QString("Unhandled thingClassId: %1").arg(thing->thingClassId().toString()).toUtf8()); - - } -} - -void IntegrationPluginFronius::searchNewThings(FroniusLogger *logger) -{ - QUrl url; QUrlQuery query; - query.addQueryItem("DeviceClass", "System"); - url.setScheme("http"); - url.setHost(logger->hostAddress()); - url.setPath(logger->baseUrl() + "GetActiveDeviceInfo.cgi"); - url.setQuery(query); - - qCDebug(dcFronius()) << "Search Things at address" << url.toString(); - QNetworkRequest request = QNetworkRequest(url); - request.setHeader(QNetworkRequest::KnownHeaders::ContentTypeHeader, "application/json"); - - QNetworkReply *reply = hardwareManager()->networkManager()->get(request); - connect(reply, &QNetworkReply::finished, reply, &QNetworkReply::deleteLater); - connect(reply, &QNetworkReply::finished, [this, logger, reply]() { - - if (reply->error() != QNetworkReply::NoError) { - qCWarning(dcFronius()) << "Network request error:" << reply->error() << reply->errorString() << reply->request().url(); - return; - } - - Thing *loggerThing = m_froniusLoggers.value(logger); - if (!loggerThing) - return; - - QByteArray data = reply->readAll(); - - // Convert the rawdata to a json document - QJsonParseError error; - QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &error); - if (error.error != QJsonParseError::NoError) { - qCWarning(dcFronius()) << "Fronius: Failed to parse JSON data" << data << ":" << error.errorString(); - return; - } - - // Parse the data for thing information - QList thingDescriptors; - - // Check reply information - QVariantMap bodyMap = jsonDoc.toVariant().toMap().value("Body").toMap(); - - // Parse reply for inverters at the host address - QVariantMap inverterMap = bodyMap.value("Data").toMap().value("Inverter").toMap(); - foreach (QString inverterId, inverterMap.keys()) { - //check if thing already connected to logger - if(!existingThing(inverterThingIdParamTypeId,inverterId)) { - QString thingName = loggerThing->name() + " Inverter " + inverterId; - ThingDescriptor descriptor(inverterThingClassId, thingName, "Fronius Solar Inverter", loggerThing->id()); - ParamList params; - params.append(Param(inverterThingHostParamTypeId, m_froniusLoggers.key(loggerThing)->hostAddress())); - params.append(Param(inverterThingBaseParamTypeId, m_froniusLoggers.key(loggerThing)->baseUrl())); - params.append(Param(inverterThingIdParamTypeId, inverterId)); - params.append(Param(inverterThingUniqueIdParamTypeId, "")); - descriptor.setParams(params); - thingDescriptors.append(descriptor); - } - } - - // parse reply for meter things at the host address - QVariantMap meterMap = bodyMap.value("Data").toMap().value("Meter").toMap(); - foreach (QString meterId, meterMap.keys()) { - //check if thing already connected to logger - if(!existingThing(meterThingIdParamTypeId, meterId)) { - QString thingName = loggerThing->name() + " Meter " + meterId; - ThingDescriptor descriptor(meterThingClassId, thingName, "Fronius Solar Meter", loggerThing->id()); - ParamList params; - params.append(Param(meterThingHostParamTypeId, m_froniusLoggers.key(loggerThing)->hostAddress())); - params.append(Param(meterThingBaseParamTypeId, m_froniusLoggers.key(loggerThing)->baseUrl())); - params.append(Param(meterThingIdParamTypeId, meterId)); - params.append(Param(meterThingUniqueIdParamTypeId, meterMap.value(meterId).toMap().value("Serial").toString())); - descriptor.setParams(params); - thingDescriptors.append(descriptor); - } - } - - // parse reply for storage things at the host address - QVariantMap storageMap = bodyMap.value("Data").toMap().value("Storage").toMap(); - foreach (QString storageId, storageMap.keys()) { - //check if thing already connected to logger - if(!existingThing(storageThingIdParamTypeId,storageId)) { - QString thingName = loggerThing->name() + " Storage " + storageId; - ThingDescriptor descriptor(storageThingClassId, thingName, "Fronius Solar Storage", loggerThing->id()); - ParamList params; - params.append(Param(storageThingManufacturerParamTypeId, "")); - params.append(Param(storageThingCapacityParamTypeId, "")); - params.append(Param(storageThingHostParamTypeId, m_froniusLoggers.key(loggerThing)->hostAddress())); - params.append(Param(storageThingBaseParamTypeId, m_froniusLoggers.key(loggerThing)->baseUrl())); - params.append(Param(storageThingIdParamTypeId, storageId)); - params.append(Param(storageThingUniqueIdParamTypeId, storageMap.value(storageId).toMap().value("Serial").toString())); - descriptor.setParams(params); - thingDescriptors.append(descriptor); - } - } - - if (!thingDescriptors.empty()) { - emit autoThingsAppeared(thingDescriptors); - thingDescriptors.clear(); - } - }); -} - -bool IntegrationPluginFronius::existingThing(ParamTypeId thingParamId, QString thingId) -{ - foreach(Thing *thing, myThings()) { - if(thing->paramValue(thingParamId).toString() == thingId) { - return true; - } - } - return false; -} - diff --git a/fronius/integrationpluginfronius.h b/fronius/integrationpluginfronius.h deleted file mode 100644 index 0995219..0000000 --- a/fronius/integrationpluginfronius.h +++ /dev/null @@ -1,76 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -* -* Copyright 2013 - 2020, nymea GmbH -* Contact: contact@nymea.io -* -* This file is part of nymea. -* This project including source code and documentation is protected by -* copyright law, and remains the property of nymea GmbH. All rights, including -* reproduction, publication, editing and translation, are reserved. The use of -* this project is subject to the terms of a license agreement to be concluded -* with nymea GmbH in accordance with the terms of use of nymea GmbH, available -* under https://nymea.io/license -* -* GNU Lesser General Public License Usage -* Alternatively, this project may be redistributed and/or modified under the -* terms of the GNU Lesser General Public License as published by the Free -* Software Foundation; version 3. This project is distributed in the hope that -* it will be useful, but WITHOUT ANY WARRANTY; without even the implied -* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License -* along with this project. If not, see . -* -* For any further details and any questions please contact us under -* contact@nymea.io or see our FAQ/Licensing Information on -* https://nymea.io/license/faq -* -* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#ifndef INTEGRATIONPLUGINFRONIUS_H -#define INTEGRATIONPLUGINFRONIUS_H - -#include "integrations/integrationplugin.h" -#include "froniuslogger.h" -#include "sunspecthing.h" - -#include -#include -#include -#include - -class PluginTimer; - -class IntegrationPluginFronius : public IntegrationPlugin -{ - Q_OBJECT - Q_PLUGIN_METADATA(IID "io.nymea.IntegrationPlugin" FILE "integrationpluginfronius.json") - Q_INTERFACES(IntegrationPlugin) - -public: - explicit IntegrationPluginFronius(QObject *parent = nullptr); - - void setupThing(ThingSetupInfo *thing) override; - void postSetupThing(Thing* thing) override; - void executeAction(ThingActionInfo *info) override; - void thingRemoved(Thing* thing) override; - -private: - PluginTimer *m_pluginTimer = nullptr; - - QHash m_froniusLoggers; - QHash m_froniusInverters; - QHash m_froniusMeters; - QHash m_froniusStorages; - QHash m_sunspecThings; - - QHash m_asyncActions; - - void updateThingStates(Thing *thing); - - void searchNewThings(FroniusLogger *logger); - bool existingThing(ParamTypeId thingParamId, QString thingId); -}; - -#endif // INTEGRATIONPLUGINFRONIUS_H diff --git a/fronius/integrationpluginfronius.json b/fronius/integrationpluginfronius.json deleted file mode 100644 index fa398d4..0000000 --- a/fronius/integrationpluginfronius.json +++ /dev/null @@ -1,533 +0,0 @@ -{ - "id": "02319cfc-8b55-49ba-99bc-0588bbfab063", - "name": "fronius", - "displayName": "Fronius Solar", - "vendors": [ - { - "id": "2286fc38-afd9-4128-ab7e-0fba527d53ba", - "name": "Fronius", - "displayName": "Fronius", - "thingClasses": [ - { - "id": "4fd79fed-42f1-4df9-be64-3df7b2e0bda2", - "name": "datalogger", - "displayName": "Fronius Solar Connection", - "createMethods": ["user"], - "interfaces": ["gateway"], - "paramTypes": [ - { - "id": "52da0197-4b78-4fec-aa72-70f949e26edc", - "name": "loggerHost", - "displayName": "Host address", - "type": "QString", - "inputType": "IPv4Address", - "defaultValue": "88.117.152.99" - } - ], - "stateTypes": [ - { - "id": "98e4476f-e745-4a7f-b795-19269cb70c40", - "name": "connected", - "displayName": "Reachable", - "displayNameEvent": "logger reachable changed", - "type": "bool", - "defaultValue": false - }, - { - "id": "b22052ef-14da-43d2-982b-f2c2d8c03206", - "name": "productid", - "displayName": "Product ID", - "displayNameEvent": "Product ID changed", - "type": "QString", - "defaultValue": "-" - }, - { - "id": "65c068e6-4a0b-4672-9724-ae95216c4c9c", - "name": "platformid", - "displayName": "Platform ID", - "displayNameEvent": "Platform ID changed", - "type": "QString", - "defaultValue": "-" - }, - { - "id": "3b4206e5-74c7-4708-96b8-2abfab0c41d6", - "name": "hwversion", - "displayName": "Hardware version", - "displayNameEvent": "Hardware version changed", - "type": "QString", - "defaultValue": "-" - }, - { - "id": "31743ca5-4353-4f26-b2ad-5da43e5b9d86", - "name": "swversion", - "displayName": "Software version", - "displayNameEvent": "Software version changed", - "type": "QString", - "defaultValue": "-" - }, - { - "id": "d034f59d-dc34-450a-a6f3-68264767a3e4", - "name": "tzoneloc", - "displayName": "Timezone location", - "displayNameEvent": "Timezone location changed", - "type": "QString", - "defaultValue": "-" - }, - { - "id": "6bdfeeda-7a47-4043-a011-5eb96308a7d6", - "name": "tzone", - "displayName": "Time zone", - "displayNameEvent": "Time zone changed", - "type": "QString", - "defaultValue": "-" - }, - { - "id": "18b250e2-080a-4991-b368-177c4da83eca", - "name": "defaultlang", - "displayName": "Default language", - "displayNameEvent": "Default language changed", - "type": "QString", - "defaultValue": "-" - }, - { - "id": "bc18595b-17c7-4a1f-8002-b908a3d9239d", - "name": "cashfactor", - "displayName": "Cash factor", - "displayNameEvent": "Cash factor changed", - "type": "double", - "defaultValue": "-" - }, - { - "id": "84da30c8-a7fb-49c6-884c-9521f9f62bbc", - "name": "cashcurrency", - "displayName": "Cash currency", - "displayNameEvent": "Cash Currency changed", - "type": "QString", - "defaultValue": "-" - }, - { - "id": "8ab01225-7be5-4482-a99b-314108ae0e2b", - "name": "co2factor", - "displayName": "CO2 factor", - "displayNameEvent": "CO2 factor changed", - "type": "double", - "defaultValue": "-" - }, - { - "id": "b0e655f8-27d0-4add-918b-461cadc8efcc", - "name": "co2unit", - "displayName": "CO2 unit", - "displayNameEvent": "CO2 unit changed", - "type": "QString", - "defaultValue": "-" - }, - { - "id": "b217acf6-0c5e-4a3e-a50c-4c0133c871c2", - "name": "powerManagmentRelay", - "displayName": "Power management relay", - "displayNameEvent": "Power management relay status changed", - "type": "bool", - "defaultValue": false - }, - { - "id": "5650ce9b-0d7d-4c52-b410-ea618889b4bb", - "name": "powerManagmentRelayReason", - "displayName": "Power management relay reason", - "displayNameEvent": "Power management relay reason changed", - "type": "QString", - "defaultValue": "" - } - ], - "actionTypes": [ - { - "id": "c217fdc1-de18-41dc-b5d8-8072f84e7b6c", - "name": "searchDevices", - "displayName": "Search new devices" - } - ] - }, - { - "id": "540aa956-8b8f-4982-9f58-343a76cea846", - "name": "inverter", - "displayName": "Fronius Solar Inverter", - "createMethods": ["auto"], - "interfaces" : ["extendedsmartmeterproducer", "connectable"], - "paramTypes": [ - { - "id": "1aa82e12-ee8c-4142-8b89-a4f1e85556d0", - "name": "host", - "displayName": "Host address", - "type": "QString", - "inputType": "TextLine" - }, - { - "id": "ec1f792a-b453-49f0-8ea6-677ad3c25a5c", - "name": "base", - "displayName": "Base url", - "type": "QString", - "inputType": "TextLine" - }, - { - "id": "f2f8c2f5-dd6a-4786-b336-82fc84e5bb98", - "name": "id", - "displayName": "Device id", - "type": "QString", - "inputType": "TextLine" - }, - { - "id": "8fadc0e8-9d69-4b9d-b493-b6ac3eb59c49", - "name": "uniqueId", - "displayName": "Unique id", - "type": "QString", - "inputType": "TextLine" - } - ], - "stateTypes": [ - { - "id": "eda29c50-73ac-40e0-9c92-26fee352e688", - "name": "connected", - "displayName": "Reachable", - "displayNameEvent": "Reachable changed", - "type": "bool", - "defaultValue": false - }, - { - "id": "e763baa7-5eaf-438c-83f0-4fa6c0f7eeb0", - "name": "active", - "displayName": "Inverter active", - "displayNameEvent": "Inverter active changed", - "type": "QString", - "defaultValue": "-" - }, - { - "id": "788accbc-b86e-471b-b37f-14c9c6411526", - "name": "currentPower", - "displayName": "Current power", - "displayNameEvent": "Current Power changed", - "type": "double", - "unit": "Watt", - "defaultValue": "0" - }, - { - "id": "b6af1bf5-753d-47b6-a151-e4d801fe6ff8", - "name": "eday", - "displayName": "Energy of current day", - "displayNameEvent": "Energy of day changed", - "type": "double", - "unit": "KiloWattHour", - "defaultValue": "0" - }, - { - "id": "7fd2fa28-9bcc-4f01-a823-459437d185f6", - "name": "eyear", - "displayName": "Energy of current year", - "displayNameEvent": "Energy of year changed", - "type": "int", - "unit": "KiloWattHour", - "defaultValue": "0" - }, - { - "id": "d6dbb879-4cbc-4db3-830e-b92ba91a13e5", - "name": "totalEnergyProduced", - "displayName": "Energy total", - "displayNameEvent": "Energy total changed", - "type": "double", - "unit": "KiloWattHour", - "defaultValue": "0" - } - ] - }, - { - "id": "c3cb53a4-32dd-434d-9d9c-aada41f8129c", - "name": "meter", - "displayName": "Fronius Smart Meter", - "createMethods": ["auto"], - "interfaces": [ "extendedsmartmeterconsumer", "extendedsmartmeterproducer", "connectable" ], - "paramTypes": [ - { - "id": "ddcb8689-b0b8-4b94-b022-4ce4cf9e0ec2", - "name": "host", - "displayName": "Address", - "type": "QString", - "inputType": "TextLine" - }, - { - "id": "2cb4acd6-a663-48c3-8366-ab538c7b4e7d", - "name": "base", - "displayName": "Base URL", - "type": "QString", - "inputType": "TextLine" - }, - { - "id": "cf3a7025-d368-475a-8f48-efc1344a8409", - "name": "id", - "displayName": "Device ID", - "type": "QString", - "inputType": "TextLine" - }, - { - "id": "285eabb2-47c8-4406-8123-6621b21558c1", - "name": "uniqueId", - "displayName": "Unique ID", - "type": "QString", - "inputType": "TextLine" - } - ], - "stateTypes": [ - { - "id": "b70b61a4-54cb-47ec-b62a-b498eb1f650e", - "name": "connected", - "displayName": "Reachable", - "displayNameEvent": "Reachable changed", - "type": "bool", - "defaultValue": false - }, - { - "id": "e5056ea1-88a2-410b-9c5e-6322aca4cb17", - "name": "currentPower", - "displayName": "Total current power", - "displayNameEvent": "Total current power changed", - "type": "double", - "unit": "Watt", - "defaultValue": "0" - }, - { - "id": "ca14cca5-d9f0-49c5-a8f7-907d4c0825f0", - "name": "totalEnergyProduced", - "displayName": "Energy Produced", - "displayNameEvent": "Energy production changed", - "type": "double", - "unit": "KiloWattHour", - "defaultValue": "0" - }, - { - "id": "f3451818-48d2-42a5-94fd-ad094c06967f", - "name": "totalEnergyConsumed", - "displayName": "Energy Consumed", - "displayNameEvent": "Energy consumption changed", - "type": "double", - "unit": "KiloWattHour", - "defaultValue": "0" - } - ] - }, - { - "id": "b00139fa-7386-48b1-8697-2fdd21a57ced", - "name": "storage", - "displayName": "Fronius Solar Storage", - "createMethods": ["auto"], - "interfaces": [ "batterylevel", "connectable" ], - "paramTypes": [ - { - "id": "9665c38b-c13a-428f-b741-1470239c63dc", - "name": "manufacturer", - "displayName": "Manufacturer", - "type": "QString", - "defaultValue": "TextLine" - }, - { - "id": "59a68e91-1aad-46b7-b351-03b7b2216366", - "name": "capacity", - "displayName": "Maxmimum capacity", - "type": "QString", - "defaultValue": "TextLine" - }, - { - "id": "84bd8a41-2411-4bb0-87a9-ab7e01044b10", - "name": "host", - "displayName": "Address", - "type": "QString", - "inputType": "TextLine" - }, - { - "id": "d19b5d81-4e62-48be-bad6-287b0019274a", - "name": "base", - "displayName": "Base URL", - "type": "QString", - "inputType": "TextLine" - }, - { - "id": "49087f31-abf5-4bb8-946b-a3626ee80566", - "name": "id", - "displayName": "Device ID", - "type": "QString", - "inputType": "TextLine" - }, - { - "id": "0d62432a-38bc-48b8-99d2-895f17fcf0b2", - "name": "uniqueId", - "displayName": "Unique ID", - "type": "QString", - "inputType": "TextLine" - } - ], - "stateTypes": [ - { - "id": "2f7e1267-b0be-4b78-9aa3-832b86c4efad", - "name": "connected", - "displayName": "Reachable", - "displayNameEvent": "Reachable changed", - "type": "bool", - "defaultValue": false - }, - { - "id": "2de34a1f-de2e-43ad-8998-8a5460dff9ae", - "name": "charging", - "displayName": "State of charge", - "displayNameEvent": "Charge state changed", - "type": "QString", - "defaultValue": "-" - }, - { - "id": "5c6da672-9662-41bc-8c8c-aa0f32481251", - "name": "batteryLevel", - "displayName": "Battery level", - "displayNameEvent": "Battery level changed", - "type": "int", - "unit": "Percentage", - "defaultValue": "0", - "minValue": 0, - "maxValue": 100 - }, - { - "id": "4417499c-1757-4309-868a-be5cf3455c4a", - "name": "cellTemperature", - "displayName": "Cell temperature", - "displayNameEvent": "Cell temperature changed", - "type": "double", - "unit": "DegreeCelsius", - "defaultValue": "0" - }, - { - "id": "e5396312-b50e-4d6f-b628-5b51448971d3", - "name": "batteryCritical", - "displayName": "Battery level critical", - "displayNameEvent": "Battery level critical changed", - "type": "bool", - "defaultValue": false - } - ] - }, - { - "id": "e14d622f-5d8f-4788-b189-0774a6382a9b", - "name": "sunspecStorage", - "displayName": "SunSpec Storage", - "createMethods": ["user"], - "interfaces": ["batterylevel", "connectable" ], - "paramTypes": [ - { - "id": "830a3cc6-ae0a-4cc3-94d6-86575e410e49", - "name": "modbusHost", - "displayName": "Address", - "type": "QString", - "inputType": "IPv4Address", - "defaultValue": "88.117.152.99" - } - ], - "stateTypes": [ - { - "id": "50ed3a6f-6ad3-445f-950b-eb6d1b7e7ef7", - "name": "connected", - "displayName": "Connected", - "displayNameEvent": "Connected changed", - "type": "bool", - "defaultValue": false - }, - { - "id": "3171a6e0-43a7-4de8-8e20-f748e44af7ac", - "name": "batteryCritical", - "displayName": "Battery critical", - "displayNameEvent": "Battery critical changed", - "type": "bool", - "defaultValue": false - }, - { - "id": "0bf53f80-97f8-488b-b514-58f9fe08c183", - "name": "batteryLevel", - "displayName": "Battery level", - "displayNameEvent": "Battery level changed", - "type": "int", - "unit": "Percentage", - "minValue": 0, - "maxValue": 100, - "defaultValue": 0 - }, - { - "id": "da2b19c5-0f48-49d1-93f0-abdc0051407d", - "name": "storageState", - "displayName": "State", - "displayNameEvent": "State changed", - "type": "QString", - "possibleValues": [ - "Off", - "Empty", - "Discharging", - "Charging", - "Full", - "Holding", - "Testing" - ], - "defaultValue": "Off" - }, - { - "id": "221a2ef6-0a92-4ff0-87fe-7bd920dbec0b", - "name": "gridCharging", - "displayName": "Grid charging", - "displayNameEvent": "Grid charging changed", - "type": "bool", - "defaultValue": false, - "writable": true, - "displayNameAction": "Set grid charging" - }, - { - "id": "1f530f79-c0d2-466b-90e1-79149e34d92f", - "name": "enableChargingLimit", - "displayName": "Charging limit", - "displayNameEvent": "Charging limit changed", - "type": "bool", - "defaultValue": false, - "writable": true, - "displayNameAction": "Enable Charging Limit" - }, - { - "id": "7f469bbc-64a5-4045-8d5f-9a1a85039851", - "name": "chargingRate", - "displayName": "Charging rate", - "displayNameEvent": "Charging rate changed", - "type": "int", - "minValue": -100, - "maxValue": 100, - "unit": "Percentage", - "defaultValue": false, - "writable": true, - "displayNameAction": "Set charging rate" - }, - { - "id": "bc99a159-815a-40ab-a6e8-b46f315305f7", - "name": "enableDischargingLimit", - "displayName": "Discharging limit", - "displayNameEvent": "Discharging limit changed", - "displayNameAction": "Enable Discharging Limit", - "type": "bool", - "defaultValue": false, - "writable": true - }, - { - "id": "6068f030-acce-44a2-b95f-bd00dd5ca760", - "name": "dischargingRate", - "displayName": "Discharging rate", - "displayNameEvent": "Discharging rate changed", - "type": "int", - "minValue": -100, - "maxValue": 100, - "unit": "Percentage", - "defaultValue": false, - "writable": true, - "displayNameAction": "Set discharging rate" - } - ] - } - ] - } - ] -} diff --git a/fronius/meta.json b/fronius/meta.json deleted file mode 100644 index d8dd467..0000000 --- a/fronius/meta.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "title": "Fronius", - "tagline": "Connect to Fronius Solar devices.", - "icon": "fronius.png", - "stability": "community", - "offline": true, - "technologies": [ - "network" - ], - "categories": [ - - ] -} diff --git a/fronius/sunspecthing.cpp b/fronius/sunspecthing.cpp deleted file mode 100644 index 5d7bc7c..0000000 --- a/fronius/sunspecthing.cpp +++ /dev/null @@ -1,353 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -* -* Copyright 2013 - 2020, nymea GmbH -* Contact: contact@nymea.io -* -* This file is part of nymea. -* This project including source code and documentation is protected by -* copyright law, and remains the property of nymea GmbH. All rights, including -* reproduction, publication, editing and translation, are reserved. The use of -* this project is subject to the terms of a license agreement to be concluded -* with nymea GmbH in accordance with the terms of use of nymea GmbH, available -* under https://nymea.io/license -* -* GNU Lesser General Public License Usage -* Alternatively, this project may be redistributed and/or modified under the -* terms of the GNU Lesser General Public License as published by the Free -* Software Foundation; version 3. This project is distributed in the hope that -* it will be useful, but WITHOUT ANY WARRANTY; without even the implied -* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License -* along with this project. If not, see . -* -* For any further details and any questions please contact us under -* contact@nymea.io or see our FAQ/Licensing Information on -* https://nymea.io/license/faq -* -* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#include -#include - -#include "sunspecthing.h" - -#include "extern-plugininfo.h" - -SunspecThing::SunspecThing(Thing *thing, QObject *parent) : - QObject(parent), - m_thing(thing) -{ - -} - -SunspecThing::~SunspecThing() -{ - -} - -void SunspecThing::readCommonBlock() -{ - if (!m_modbusTcpMaster) - return; - - int address = 40001 - 1; - // Read common block - m_modbusTcpMaster->readHoldingRegister(m_slaveId, address, 70); -} - -void SunspecThing::readStorageBlock() -{ - if (!m_modbusTcpMaster) - return; - - int address; - if (m_floatingPointRepresentation) { - address = 40313; - } else { - address = 40303; - } - /* Startadresse: - - bei Einstellung „float“: 40313 - - bei Einstellung „int+SF“: 40303 - */ - m_modbusTcpMaster->readHoldingRegister(m_slaveId, address, 26); -} - -QByteArray SunspecThing::convertModbusRegister(const uint16_t &modbusData) -{ - uint8_t data[2]; - data[0] = modbusData >> 8; - data[1] = modbusData & 0xFF; - //qCDebug(dcFronius()) << (char)data[0] << (char)data[1]; - return QByteArray().append((char)data[0]).append((char)data[1]); -} - -QBitArray SunspecThing::convertModbusRegisterBits(const uint16_t &modbusData) -{ - QByteArray data = convertModbusRegister(modbusData); - QBitArray bits(data.count() * 8); - - // Convert from QByteArray to QBitArray - for(int i = 0; i < data.count(); ++i) { - for(int b = 0; b < 8; b++) { - bits.setBit(i * 8 + b, data.at(i) & (1 << ( 7 - b))); - } - } - return bits; -} - -QByteArray SunspecThing::convertModbusRegisters(const QVector &modbusData, int offset, int size) -{ - QByteArray bytes; - for (int i = offset; i < offset + size; i++) - bytes.append(convertModbusRegister(modbusData[i])); - - return bytes; -} - -QString SunspecThing::storageStateToString(const SunspecThing::StorageState &state) -{ - QMetaObject metaObject ; - metaObject= SunspecThing::staticMetaObject; - QMetaEnum metaEnum = metaObject.enumerator(metaObject.indexOfEnumerator("StorageState" ) ); - return QString(metaEnum.valueToKey(state)); -} - -bool SunspecThing::connectModbus() -{ - if (m_thing->paramValue(sunspecStorageThingModbusHostParamTypeId).toString().isEmpty()) { - qCWarning(dcFronius()) << "Empty ip address"; - return false; - } - - m_modbusTcpMaster = new ModbusTCPMaster(QHostAddress(m_thing->paramValue(sunspecStorageThingModbusHostParamTypeId).toString()), 502, this); - connect(m_modbusTcpMaster, &ModbusTCPMaster::connectionStateChanged, this, &SunspecThing::connectionStateChanged); - connect(m_modbusTcpMaster, &ModbusTCPMaster::writeRequestExecuted, this, &SunspecThing::requestExecuted); - connect(m_modbusTcpMaster, &ModbusTCPMaster::receivedHoldingRegister, this, &SunspecThing::onReceivedHoldingRegister); - - m_modbusTcpMaster->setTimeout(3 * 1000); // 3 seconds - m_modbusTcpMaster->setNumberOfRetries(3); - - qCDebug(dcFronius()) << "Connected successfully" << m_thing->paramValue(sunspecStorageThingModbusHostParamTypeId).toString(); - - readCommonBlock(); - - return true; -} - -QUuid SunspecThing::setGridCharging(const bool &charging) -{ - if (!m_modbusTcpMaster) { - return ""; - } - - /* Start address: - - for “float” setting: 40313 - - for “int+SF” setting: 40303 */ - - // 40313 + Offset 18 - 1 - // Name ChaGriSet - /* Setpoint to enable/dis- - able charging from grid - PV (charging from grid 0 disabled) - GRID (charging from 1 grid enabled*/ - - int registerAddress; - if (m_floatingPointRepresentation) { - registerAddress = 40313 + 18 - 1; - } else { - registerAddress = 40303 + 18 - 1; - } - - quint16 value = charging; - return m_modbusTcpMaster->writeHoldingRegister(m_slaveId, registerAddress, value); -} - -QUuid SunspecThing::setChargingRate(const int &charging) -{ - // 40313 + Offset 14 - 1 - //Register Name InWRte - /* Defines the maximum charge rate (charge limit). Default is 100% */ - - if (!m_modbusTcpMaster) { - return ""; - } - - int registerAddress; - if (m_floatingPointRepresentation) { - registerAddress = 40313 + 14 - 1; - } else { - registerAddress = 40303 + 14 - 1; - } - - int16_t value = charging * 100; - return m_modbusTcpMaster->writeHoldingRegister(m_slaveId, registerAddress, value); -} - -QUuid SunspecThing::setStorageControlMode(const int &charging) -{ - // 40313 + Offset 6 - 1 - // Set charge bit to enable charge limit, set discharge bit to enable discharge limit, set both bits to enable both limits - - if (!m_modbusTcpMaster) { - return ""; - } - - int registerAddress; - if (m_floatingPointRepresentation) { - registerAddress = 40313 + 6 - 1; - } else { - registerAddress = 40303 + 6 - 1; - } - - uint16_t value = charging; - return m_modbusTcpMaster->writeHoldingRegister(m_slaveId, registerAddress, value); -} - -QUuid SunspecThing::setDischargingRate(const int &charging) -{ - // 40313 + Offset 13 - 1 - //Register Name OutWRte - /*Defines the maximum discharge rate (discharge limit). Default is 100% */ - - if (!m_modbusTcpMaster) { - return ""; - } - - int registerAddress; - if (m_floatingPointRepresentation) { - registerAddress = 40313 + 13 - 1; - } else { - registerAddress = 40303 + 13 - 1; - } - - int16_t value = charging * 100; - return m_modbusTcpMaster->writeHoldingRegister(m_slaveId, registerAddress, value); -} - - -void SunspecThing::update() -{ - if (!m_modbusTcpMaster) { - return; - } - - readCommonBlock(); - readStorageBlock(); -} - -void SunspecThing::onReceivedHoldingRegister(quint32 slaveAddress, quint32 modbusRegister, const QVector &data) -{ - if (!m_thing) - return; - - switch (modbusRegister) { - case 40000: {// Common block, 70 registers long - - qCDebug(dcFronius()) << "Sunspec Identification:" << convertModbusRegisters(data, 0, 2); - - if (convertModbusRegisters(data, 0, 2) != "SunS") { - qCWarning(dcFronius()) << "Could not find SunS value at" << modbusRegister << "on" << slaveAddress; - return; - } - - // ID: 40003 - qCDebug(dcFronius()) << "Id:" << data[2]; - - // Manufacturer: 40005 | 16 - qCDebug(dcFronius()) << "Manufacturer:" << QString::fromLatin1(convertModbusRegisters(data, 4, 16)); - - // Thing model: 40021 | 16 - qCDebug(dcFronius()) << "Thing model:" << QString::fromLatin1(convertModbusRegisters(data, 20, 16)); - - // Data manager version: 40037 | 8 - qCDebug(dcFronius()) << "Data manager version:" << QString::fromLatin1(convertModbusRegisters(data, 36, 8)); - - // Inverter Version: 40045 | 8 - qCDebug(dcFronius()) << "Inverter version:" << QString::fromLatin1(convertModbusRegisters(data, 44, 8)); - - // Serial Number: 40053 | 16 - qCDebug(dcFronius()) << "Serial number:" << QString::fromLatin1(convertModbusRegisters(data, 52, 16)); - - // Modbus thing address : 40069 | 1 - qCDebug(dcFronius()) << "Thing modbus address:" << data[67]; - - /*Sunspec Model Type - zum Auswählen des Datentyps von Datenmodellen für Wechselrichter - (3d) float - Darstellung als Gleitkommazahlen - SunSpec Inverter Model I111, I112 oder I113 - (3e) int+SF - Darstellung als ganze Zahlen mit Skalierungsfaktoren - SunSpec Inverter Model I101, I102 oder I103 - WICHTIG! Da die verschiedenen Modelle über unterschiedliche Anzahlen an Re- - gistern verfügen, ändern sich durch den Wechsel des Datentyps auch die Regis- - teradressen aller nachfolgenden Modelle.*/ - qCDebug(dcFronius()) << "SunSpec Inverter Modbus Map:" << data[69]; - if (data[69] > 110){ - m_floatingPointRepresentation = true; - } else { - m_floatingPointRepresentation = false; - } - } break; - case 40303: - case 40313: { //Storage Block - // ID - qCDebug(dcFronius()) << "Id:" << data[0]; - - if (data[0] != 124) { - qCWarning(dcFronius()) << "Invalid id in register address" << modbusRegister << ":" << data[0]; - } - - // L - qCDebug(dcFronius()) << "Register count:" << data[1]; - - // WchaMax - qCDebug(dcFronius()) << "Setpoint of maximum charge:" << data[2] << "W"; - - // WchaGra - qCDebug(dcFronius()) << "Setpoint for maximum charge:" << data[3] << "[s]"; - - // WdisChaGra - qCDebug(dcFronius()) << "Setpoint for maximum discharge rate:" << data[4] << "[s]"; - - // StorCtl_Mod: Activate hold/discharge/charge storage control mode. Bit0: charge, Bit 1: discharge - QBitArray storageControlBits = convertModbusRegisterBits(data[5]); - - qCDebug(dcFronius()) << "Charging control mode:" << (storageControlBits.testBit(0) ? "On" : "Off"); - m_thing->setStateValue(sunspecStorageEnableChargingLimitStateTypeId, storageControlBits.testBit(0)); - - qCDebug(dcFronius()) << "Discharging control mode:" << (storageControlBits.testBit(1) ? "On" : "Off"); - m_thing->setStateValue(sunspecStorageEnableDischargingLimitStateTypeId, storageControlBits.testBit(1)); - - // MinRsvPct - qCDebug(dcFronius()) << "Setpoint for minimum reserve:" << data[7] << "[%]"; - - // ChaState - qCDebug(dcFronius()) << "Current energy:" << ((double)data[8] / 100.0) << "[%]"; - int percentage = data[8] / 100.00; - m_thing->setStateValue(sunspecStorageBatteryLevelEventTypeId, percentage); - m_thing->setStateValue(sunspecStorageBatteryCriticalStateTypeId, (percentage < 10)); - // ChaSt - //Charge status of storage thing. Enumerated - qCDebug(dcFronius()) << "Charge state" << storageStateToString(static_cast(data[11])); - m_thing->setStateValue(sunspecStorageStorageStateStateTypeId, storageStateToString(static_cast(data[11]))); - - // OutWRte - m_thing->setStateValue(sunspecStorageDischargingRateStateTypeId, (int16_t)data[12] / 100); - qCDebug(dcFronius()) << "Percent of max. discharge rate:" << ((int16_t)data[12] / 100) << "[%]"; - - // InWRte - m_thing->setStateValue(sunspecStorageChargingRateStateTypeId, (int16_t)data[13] / 100); - qCDebug(dcFronius()) << "Percent of max. charge rate:" << ((int16_t)data[13] / 100) << "[%]"; - - // ChaGriSet - m_thing->setStateValue(sunspecStorageGridChargingStateTypeId, data[18]); - qCDebug(dcFronius()) << "Charging from grid:" << (data[18] == 0 ? "disabled" : "enabled"); - } break; - default: - break; - }; -} diff --git a/fronius/sunspecthing.h b/fronius/sunspecthing.h deleted file mode 100644 index cac5329..0000000 --- a/fronius/sunspecthing.h +++ /dev/null @@ -1,98 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -* -* Copyright 2013 - 2020, nymea GmbH -* Contact: contact@nymea.io -* -* This file is part of nymea. -* This project including source code and documentation is protected by -* copyright law, and remains the property of nymea GmbH. All rights, including -* reproduction, publication, editing and translation, are reserved. The use of -* this project is subject to the terms of a license agreement to be concluded -* with nymea GmbH in accordance with the terms of use of nymea GmbH, available -* under https://nymea.io/license -* -* GNU Lesser General Public License Usage -* Alternatively, this project may be redistributed and/or modified under the -* terms of the GNU Lesser General Public License as published by the Free -* Software Foundation; version 3. This project is distributed in the hope that -* it will be useful, but WITHOUT ANY WARRANTY; without even the implied -* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public License -* along with this project. If not, see . -* -* For any further details and any questions please contact us under -* contact@nymea.io or see our FAQ/Licensing Information on -* https://nymea.io/license/faq -* -* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#ifndef SUNSPECTHING_H -#define SUNSPECTHING_H - -#include "integrations/thing.h" - -#include -#include -#include -#include -#include - -#include "../modbus/modbustcpmaster.h" - -class SunspecThing : public QObject -{ - Q_OBJECT -public: - enum StorageState { - Off = 1, - Empty = 2, - Discharging = 3, - Charging = 4, - Full = 5, - Holding = 6, - Testing = 7 - }; - Q_ENUM(StorageState) - - explicit SunspecThing(Thing *thing, QObject *parent = nullptr); - ~SunspecThing(); - -private: - Thing *m_thing; - ModbusTCPMaster *m_modbusTcpMaster = nullptr; - int m_slaveId = 1; - bool m_floatingPointRepresentation = false; - - void readCommonBlock(); - void readStorageBlock(); - - QByteArray convertModbusRegister(const uint16_t &modbusData); - QBitArray convertModbusRegisterBits(const uint16_t &modbusData); - QByteArray convertModbusRegisters(const QVector &modbusData, int offset, int size); - - QString storageStateToString(const StorageState &state); - -public slots: - bool connectModbus(); - - QUuid setGridCharging(const bool &charging); - QUuid setDischargingRate(const int &charging); - QUuid setChargingRate(const int &charging); - QUuid setStorageControlMode(const int &charging); - - void update(); - -signals: - void connectionStateChanged(bool status); - void requestExecuted(QUuid requetId, bool success); - -private slots: - void onConnectionStateChanged(bool status); - void onRequestExecuted(QUuid requestId, bool success); - void onRequestError(QUuid requestId, const QString &error); - void onReceivedHoldingRegister(quint32 slaveAddress, quint32 modbusRegister, const QVector &values); -}; - -#endif // SUNSPECTHING_H diff --git a/fronius/translations/02319cfc-8b55-49ba-99bc-0588bbfab063-de.ts b/fronius/translations/02319cfc-8b55-49ba-99bc-0588bbfab063-de.ts deleted file mode 100644 index e4dea36..0000000 --- a/fronius/translations/02319cfc-8b55-49ba-99bc-0588bbfab063-de.ts +++ /dev/null @@ -1,741 +0,0 @@ - - - - - IntegrationPluginFronius - - - Device not reachable - Gerät nicht erreichbar - - - - - Please try again - Bitte versuchen Sie es erneut - - - - fronius - - - - - Address - The name of the ParamType (ThingClass: sunspecStorage, Type: thing, ID: {830a3cc6-ae0a-4cc3-94d6-86575e410e49}) ----------- -The name of the ParamType (ThingClass: storage, Type: thing, ID: {84bd8a41-2411-4bb0-87a9-ab7e01044b10}) ----------- -The name of the ParamType (ThingClass: meter, Type: thing, ID: {ddcb8689-b0b8-4b94-b022-4ce4cf9e0ec2}) - Adresse - - - - - Base URL - The name of the ParamType (ThingClass: storage, Type: thing, ID: {d19b5d81-4e62-48be-bad6-287b0019274a}) ----------- -The name of the ParamType (ThingClass: meter, Type: thing, ID: {2cb4acd6-a663-48c3-8366-ab538c7b4e7d}) - Basis URL - - - - Base url - The name of the ParamType (ThingClass: inverter, Type: thing, ID: {ec1f792a-b453-49f0-8ea6-677ad3c25a5c}) - Basis URL - - - - - Battery critical - The name of the ParamType (ThingClass: sunspecStorage, EventType: batteryCritical, ID: {3171a6e0-43a7-4de8-8e20-f748e44af7ac}) ----------- -The name of the StateType ({3171a6e0-43a7-4de8-8e20-f748e44af7ac}) of ThingClass sunspecStorage - Batterie kritisch - - - - Battery critical changed - The name of the EventType ({3171a6e0-43a7-4de8-8e20-f748e44af7ac}) of ThingClass sunspecStorage - Batterie kritisch geändert - - - - - - - Battery level - The name of the ParamType (ThingClass: sunspecStorage, EventType: batteryLevel, ID: {0bf53f80-97f8-488b-b514-58f9fe08c183}) ----------- -The name of the StateType ({0bf53f80-97f8-488b-b514-58f9fe08c183}) of ThingClass sunspecStorage ----------- -The name of the ParamType (ThingClass: storage, EventType: batteryLevel, ID: {5c6da672-9662-41bc-8c8c-aa0f32481251}) ----------- -The name of the StateType ({5c6da672-9662-41bc-8c8c-aa0f32481251}) of ThingClass storage - Batteriestand - - - - - Battery level changed - The name of the EventType ({0bf53f80-97f8-488b-b514-58f9fe08c183}) of ThingClass sunspecStorage ----------- -The name of the EventType ({5c6da672-9662-41bc-8c8c-aa0f32481251}) of ThingClass storage - Batteriestand geändert - - - - - Battery level critical - The name of the ParamType (ThingClass: storage, EventType: batteryCritical, ID: {e5396312-b50e-4d6f-b628-5b51448971d3}) ----------- -The name of the StateType ({e5396312-b50e-4d6f-b628-5b51448971d3}) of ThingClass storage - Batteriestand kritisch - - - - Battery level critical changed - The name of the EventType ({e5396312-b50e-4d6f-b628-5b51448971d3}) of ThingClass storage - Batteriestand kritisch geändert - - - - - CO2 factor - The name of the ParamType (ThingClass: datalogger, EventType: co2factor, ID: {8ab01225-7be5-4482-a99b-314108ae0e2b}) ----------- -The name of the StateType ({8ab01225-7be5-4482-a99b-314108ae0e2b}) of ThingClass datalogger - CO2 Faktor - - - - CO2 factor changed - The name of the EventType ({8ab01225-7be5-4482-a99b-314108ae0e2b}) of ThingClass datalogger - CO2 Faktor geändert - - - - - CO2 unit - The name of the ParamType (ThingClass: datalogger, EventType: co2unit, ID: {b0e655f8-27d0-4add-918b-461cadc8efcc}) ----------- -The name of the StateType ({b0e655f8-27d0-4add-918b-461cadc8efcc}) of ThingClass datalogger - CO2-Einheit - - - - CO2 unit changed - The name of the EventType ({b0e655f8-27d0-4add-918b-461cadc8efcc}) of ThingClass datalogger - CO2-Einheit geändert - - - - Cash Currency changed - The name of the EventType ({84da30c8-a7fb-49c6-884c-9521f9f62bbc}) of ThingClass datalogger - Bargeldwährung geändert - - - - - Cash currency - The name of the ParamType (ThingClass: datalogger, EventType: cashcurrency, ID: {84da30c8-a7fb-49c6-884c-9521f9f62bbc}) ----------- -The name of the StateType ({84da30c8-a7fb-49c6-884c-9521f9f62bbc}) of ThingClass datalogger - Bargeldwährung - - - - - Cash factor - The name of the ParamType (ThingClass: datalogger, EventType: cashfactor, ID: {bc18595b-17c7-4a1f-8002-b908a3d9239d}) ----------- -The name of the StateType ({bc18595b-17c7-4a1f-8002-b908a3d9239d}) of ThingClass datalogger - Cash-Faktor - - - - Cash factor changed - The name of the EventType ({bc18595b-17c7-4a1f-8002-b908a3d9239d}) of ThingClass datalogger - Cash-Faktor geändert - - - - - Cell temperature - The name of the ParamType (ThingClass: storage, EventType: cellTemperature, ID: {4417499c-1757-4309-868a-be5cf3455c4a}) ----------- -The name of the StateType ({4417499c-1757-4309-868a-be5cf3455c4a}) of ThingClass storage - Zellentemperatur - - - - Cell temperature changed - The name of the EventType ({4417499c-1757-4309-868a-be5cf3455c4a}) of ThingClass storage - Zellentemperatur geändert - - - - Charge state changed - The name of the EventType ({2de34a1f-de2e-43ad-8998-8a5460dff9ae}) of ThingClass storage - Ladezustand geändert - - - - - - Charging limit - The name of the ParamType (ThingClass: sunspecStorage, ActionType: enableChargingLimit, ID: {1f530f79-c0d2-466b-90e1-79149e34d92f}) ----------- -The name of the ParamType (ThingClass: sunspecStorage, EventType: enableChargingLimit, ID: {1f530f79-c0d2-466b-90e1-79149e34d92f}) ----------- -The name of the StateType ({1f530f79-c0d2-466b-90e1-79149e34d92f}) of ThingClass sunspecStorage - Ladelimit - - - - - - Charging rate - The name of the ParamType (ThingClass: sunspecStorage, ActionType: chargingRate, ID: {7f469bbc-64a5-4045-8d5f-9a1a85039851}) ----------- -The name of the ParamType (ThingClass: sunspecStorage, EventType: chargingRate, ID: {7f469bbc-64a5-4045-8d5f-9a1a85039851}) ----------- -The name of the StateType ({7f469bbc-64a5-4045-8d5f-9a1a85039851}) of ThingClass sunspecStorage - Laderate - - - - Charging rate changed - The name of the EventType ({7f469bbc-64a5-4045-8d5f-9a1a85039851}) of ThingClass sunspecStorage - Laderate geändert - - - - - Connected - The name of the ParamType (ThingClass: sunspecStorage, EventType: connected, ID: {50ed3a6f-6ad3-445f-950b-eb6d1b7e7ef7}) ----------- -The name of the StateType ({50ed3a6f-6ad3-445f-950b-eb6d1b7e7ef7}) of ThingClass sunspecStorage - Verbunden - - - - Current Power changed - The name of the EventType ({788accbc-b86e-471b-b37f-14c9c6411526}) of ThingClass inverter - Aktuelle Leistung geändert - - - - - Current power - The name of the ParamType (ThingClass: inverter, EventType: currentPower, ID: {788accbc-b86e-471b-b37f-14c9c6411526}) ----------- -The name of the StateType ({788accbc-b86e-471b-b37f-14c9c6411526}) of ThingClass inverter - Aktuelle Leistung - - - - - Default language - The name of the ParamType (ThingClass: datalogger, EventType: defaultlang, ID: {18b250e2-080a-4991-b368-177c4da83eca}) ----------- -The name of the StateType ({18b250e2-080a-4991-b368-177c4da83eca}) of ThingClass datalogger - Standardsprache - - - - Default language changed - The name of the EventType ({18b250e2-080a-4991-b368-177c4da83eca}) of ThingClass datalogger - Standardsprache geändert - - - - - Device ID - The name of the ParamType (ThingClass: storage, Type: thing, ID: {49087f31-abf5-4bb8-946b-a3626ee80566}) ----------- -The name of the ParamType (ThingClass: meter, Type: thing, ID: {cf3a7025-d368-475a-8f48-efc1344a8409}) - Geräte ID - - - - Device id - The name of the ParamType (ThingClass: inverter, Type: thing, ID: {f2f8c2f5-dd6a-4786-b336-82fc84e5bb98}) - Geräte ID - - - - - - Discharging limit - The name of the ParamType (ThingClass: sunspecStorage, ActionType: enableDischargingLimit, ID: {bc99a159-815a-40ab-a6e8-b46f315305f7}) ----------- -The name of the ParamType (ThingClass: sunspecStorage, EventType: enableDischargingLimit, ID: {bc99a159-815a-40ab-a6e8-b46f315305f7}) ----------- -The name of the StateType ({bc99a159-815a-40ab-a6e8-b46f315305f7}) of ThingClass sunspecStorage - Entladelimit - - - - - - Discharging rate - The name of the ParamType (ThingClass: sunspecStorage, ActionType: dischargingRate, ID: {6068f030-acce-44a2-b95f-bd00dd5ca760}) ----------- -The name of the ParamType (ThingClass: sunspecStorage, EventType: dischargingRate, ID: {6068f030-acce-44a2-b95f-bd00dd5ca760}) ----------- -The name of the StateType ({6068f030-acce-44a2-b95f-bd00dd5ca760}) of ThingClass sunspecStorage - Entladerate - - - - Discharging rate changed - The name of the EventType ({6068f030-acce-44a2-b95f-bd00dd5ca760}) of ThingClass sunspecStorage - Entladerate geändert - - - - Enable Charging Limit - The name of the ActionType ({1f530f79-c0d2-466b-90e1-79149e34d92f}) of ThingClass sunspecStorage - Aktiviere Ladelimit - - - - Enable Discharging Limit - The name of the ActionType ({bc99a159-815a-40ab-a6e8-b46f315305f7}) of ThingClass sunspecStorage - Aktiviere Entladelimit - - - - - Energy Consumed - The name of the ParamType (ThingClass: meter, EventType: totalEnergyConsumed, ID: {f3451818-48d2-42a5-94fd-ad094c06967f}) ----------- -The name of the StateType ({f3451818-48d2-42a5-94fd-ad094c06967f}) of ThingClass meter - Energie verbraucht - - - - - Energy Produced - The name of the ParamType (ThingClass: meter, EventType: totalEnergyProduced, ID: {ca14cca5-d9f0-49c5-a8f7-907d4c0825f0}) ----------- -The name of the StateType ({ca14cca5-d9f0-49c5-a8f7-907d4c0825f0}) of ThingClass meter - Energie produziert - - - - Energy consumption changed - The name of the EventType ({f3451818-48d2-42a5-94fd-ad094c06967f}) of ThingClass meter - Energieverbrauch geändert - - - - - Energy of current day - The name of the ParamType (ThingClass: inverter, EventType: eday, ID: {b6af1bf5-753d-47b6-a151-e4d801fe6ff8}) ----------- -The name of the StateType ({b6af1bf5-753d-47b6-a151-e4d801fe6ff8}) of ThingClass inverter - Energie dieses Tages - - - - - Energy of current year - The name of the ParamType (ThingClass: inverter, EventType: eyear, ID: {7fd2fa28-9bcc-4f01-a823-459437d185f6}) ----------- -The name of the StateType ({7fd2fa28-9bcc-4f01-a823-459437d185f6}) of ThingClass inverter - Energie dieses Jahres - - - - Energy of day changed - The name of the EventType ({b6af1bf5-753d-47b6-a151-e4d801fe6ff8}) of ThingClass inverter - Energie dieses Tages geändert - - - - Energy of year changed - The name of the EventType ({7fd2fa28-9bcc-4f01-a823-459437d185f6}) of ThingClass inverter - Energie dieses Jahres geändert - - - - Energy production changed - The name of the EventType ({ca14cca5-d9f0-49c5-a8f7-907d4c0825f0}) of ThingClass meter - Energieproduktion geändert - - - - - Energy total - The name of the ParamType (ThingClass: inverter, EventType: totalEnergyProduced, ID: {d6dbb879-4cbc-4db3-830e-b92ba91a13e5}) ----------- -The name of the StateType ({d6dbb879-4cbc-4db3-830e-b92ba91a13e5}) of ThingClass inverter - Energie gesamt - - - - Energy total changed - The name of the EventType ({d6dbb879-4cbc-4db3-830e-b92ba91a13e5}) of ThingClass inverter - Energie gesamt geändert - - - - Fronius - The name of the vendor ({2286fc38-afd9-4128-ab7e-0fba527d53ba}) - Fronius - - - - Fronius Smart Meter - The name of the ThingClass ({c3cb53a4-32dd-434d-9d9c-aada41f8129c}) - Fronius Smart Meter - - - - Fronius Solar - The name of the plugin fronius ({02319cfc-8b55-49ba-99bc-0588bbfab063}) - Fronius Solar - - - - Fronius Solar Connection - The name of the ThingClass ({4fd79fed-42f1-4df9-be64-3df7b2e0bda2}) - Fronius Solar Verbindung - - - - Fronius Solar Inverter - The name of the ThingClass ({540aa956-8b8f-4982-9f58-343a76cea846}) - Fronius Solar Inverter - - - - Fronius Solar Storage - The name of the ThingClass ({b00139fa-7386-48b1-8697-2fdd21a57ced}) - Fronius Solar Speicher - - - - - - Grid charging - The name of the ParamType (ThingClass: sunspecStorage, ActionType: gridCharging, ID: {221a2ef6-0a92-4ff0-87fe-7bd920dbec0b}) ----------- -The name of the ParamType (ThingClass: sunspecStorage, EventType: gridCharging, ID: {221a2ef6-0a92-4ff0-87fe-7bd920dbec0b}) ----------- -The name of the StateType ({221a2ef6-0a92-4ff0-87fe-7bd920dbec0b}) of ThingClass sunspecStorage - Netzaufladung - - - - Grid charging changed - The name of the EventType ({221a2ef6-0a92-4ff0-87fe-7bd920dbec0b}) of ThingClass sunspecStorage - Netzaufladung geändert - - - - - Hardware version - The name of the ParamType (ThingClass: datalogger, EventType: hwversion, ID: {3b4206e5-74c7-4708-96b8-2abfab0c41d6}) ----------- -The name of the StateType ({3b4206e5-74c7-4708-96b8-2abfab0c41d6}) of ThingClass datalogger - Hardwareversion - - - - Hardware version changed - The name of the EventType ({3b4206e5-74c7-4708-96b8-2abfab0c41d6}) of ThingClass datalogger - Hardwareversion geändert - - - - - Host address - The name of the ParamType (ThingClass: inverter, Type: thing, ID: {1aa82e12-ee8c-4142-8b89-a4f1e85556d0}) ----------- -The name of the ParamType (ThingClass: datalogger, Type: thing, ID: {52da0197-4b78-4fec-aa72-70f949e26edc}) - Adresse - - - - - Inverter active - The name of the ParamType (ThingClass: inverter, EventType: active, ID: {e763baa7-5eaf-438c-83f0-4fa6c0f7eeb0}) ----------- -The name of the StateType ({e763baa7-5eaf-438c-83f0-4fa6c0f7eeb0}) of ThingClass inverter - Inverter aktiv - - - - Inverter active changed - The name of the EventType ({e763baa7-5eaf-438c-83f0-4fa6c0f7eeb0}) of ThingClass inverter - Inverter aktiv geändert - - - - Manufacturer - The name of the ParamType (ThingClass: storage, Type: thing, ID: {9665c38b-c13a-428f-b741-1470239c63dc}) - Hersteller - - - - Maxmimum capacity - The name of the ParamType (ThingClass: storage, Type: thing, ID: {59a68e91-1aad-46b7-b351-03b7b2216366}) - Maximale Kapazität - - - - Set grid charging - The name of the ActionType ({221a2ef6-0a92-4ff0-87fe-7bd920dbec0b}) of ThingClass sunspecStorage - Aktiviere Netzladung - - - - State changed - The name of the EventType ({da2b19c5-0f48-49d1-93f0-abdc0051407d}) of ThingClass sunspecStorage - Zustand geändert - - - - - Unique ID - The name of the ParamType (ThingClass: storage, Type: thing, ID: {0d62432a-38bc-48b8-99d2-895f17fcf0b2}) ----------- -The name of the ParamType (ThingClass: meter, Type: thing, ID: {285eabb2-47c8-4406-8123-6621b21558c1}) - Unique ID - - - - Unique id - The name of the ParamType (ThingClass: inverter, Type: thing, ID: {8fadc0e8-9d69-4b9d-b493-b6ac3eb59c49}) - Unique ID - - - - - Platform ID - The name of the ParamType (ThingClass: datalogger, EventType: platformid, ID: {65c068e6-4a0b-4672-9724-ae95216c4c9c}) ----------- -The name of the StateType ({65c068e6-4a0b-4672-9724-ae95216c4c9c}) of ThingClass datalogger - Plattform ID - - - - Charging limit changed - The name of the EventType ({1f530f79-c0d2-466b-90e1-79149e34d92f}) of ThingClass sunspecStorage - Ladelimit geändert - - - - Connected changed - The name of the EventType ({50ed3a6f-6ad3-445f-950b-eb6d1b7e7ef7}) of ThingClass sunspecStorage - Verbunden geändert - - - - Discharging limit changed - The name of the EventType ({bc99a159-815a-40ab-a6e8-b46f315305f7}) of ThingClass sunspecStorage - Entladelimit geändert - - - - Platform ID changed - The name of the EventType ({65c068e6-4a0b-4672-9724-ae95216c4c9c}) of ThingClass datalogger - Plattform-ID geändert - - - - - Power management relay - The name of the ParamType (ThingClass: datalogger, EventType: powerManagmentRelay, ID: {b217acf6-0c5e-4a3e-a50c-4c0133c871c2}) ----------- -The name of the StateType ({b217acf6-0c5e-4a3e-a50c-4c0133c871c2}) of ThingClass datalogger - Leistungsmanagement Relais - - - - - Power management relay reason - The name of the ParamType (ThingClass: datalogger, EventType: powerManagmentRelayReason, ID: {5650ce9b-0d7d-4c52-b410-ea618889b4bb}) ----------- -The name of the StateType ({5650ce9b-0d7d-4c52-b410-ea618889b4bb}) of ThingClass datalogger - Leistungsmanagement Relais Grund - - - - Power management relay reason changed - The name of the EventType ({5650ce9b-0d7d-4c52-b410-ea618889b4bb}) of ThingClass datalogger - Leistungsmanagement Relais Grund geändert - - - - Power management relay status changed - The name of the EventType ({b217acf6-0c5e-4a3e-a50c-4c0133c871c2}) of ThingClass datalogger - Leistungsmanagement Relais Status geändert - - - - - Product ID - The name of the ParamType (ThingClass: datalogger, EventType: productid, ID: {b22052ef-14da-43d2-982b-f2c2d8c03206}) ----------- -The name of the StateType ({b22052ef-14da-43d2-982b-f2c2d8c03206}) of ThingClass datalogger - Produkt-ID - - - - Product ID changed - The name of the EventType ({b22052ef-14da-43d2-982b-f2c2d8c03206}) of ThingClass datalogger - Produkt-ID geändert - - - - - - - - - - - Reachable - The name of the ParamType (ThingClass: storage, EventType: connected, ID: {2f7e1267-b0be-4b78-9aa3-832b86c4efad}) ----------- -The name of the StateType ({2f7e1267-b0be-4b78-9aa3-832b86c4efad}) of ThingClass storage ----------- -The name of the ParamType (ThingClass: meter, EventType: connected, ID: {b70b61a4-54cb-47ec-b62a-b498eb1f650e}) ----------- -The name of the StateType ({b70b61a4-54cb-47ec-b62a-b498eb1f650e}) of ThingClass meter ----------- -The name of the ParamType (ThingClass: inverter, EventType: connected, ID: {eda29c50-73ac-40e0-9c92-26fee352e688}) ----------- -The name of the StateType ({eda29c50-73ac-40e0-9c92-26fee352e688}) of ThingClass inverter ----------- -The name of the ParamType (ThingClass: datalogger, EventType: connected, ID: {98e4476f-e745-4a7f-b795-19269cb70c40}) ----------- -The name of the StateType ({98e4476f-e745-4a7f-b795-19269cb70c40}) of ThingClass datalogger - Erreichbar - - - - - - Reachable changed - The name of the EventType ({2f7e1267-b0be-4b78-9aa3-832b86c4efad}) of ThingClass storage ----------- -The name of the EventType ({b70b61a4-54cb-47ec-b62a-b498eb1f650e}) of ThingClass meter ----------- -The name of the EventType ({eda29c50-73ac-40e0-9c92-26fee352e688}) of ThingClass inverter - Erreichbar geändert - - - - Search new devices - The name of the ActionType ({c217fdc1-de18-41dc-b5d8-8072f84e7b6c}) of ThingClass datalogger - Suche neue Geräte - - - - Set charging rate - The name of the ActionType ({7f469bbc-64a5-4045-8d5f-9a1a85039851}) of ThingClass sunspecStorage - Setze Laderate - - - - Set discharging rate - The name of the ActionType ({6068f030-acce-44a2-b95f-bd00dd5ca760}) of ThingClass sunspecStorage - Setze Entladerate - - - - - Software version - The name of the ParamType (ThingClass: datalogger, EventType: swversion, ID: {31743ca5-4353-4f26-b2ad-5da43e5b9d86}) ----------- -The name of the StateType ({31743ca5-4353-4f26-b2ad-5da43e5b9d86}) of ThingClass datalogger - Softwareversion - - - - Software version changed - The name of the EventType ({31743ca5-4353-4f26-b2ad-5da43e5b9d86}) of ThingClass datalogger - Softwareversion geändert - - - - - State - The name of the ParamType (ThingClass: sunspecStorage, EventType: storageState, ID: {da2b19c5-0f48-49d1-93f0-abdc0051407d}) ----------- -The name of the StateType ({da2b19c5-0f48-49d1-93f0-abdc0051407d}) of ThingClass sunspecStorage - Status - - - - - State of charge - The name of the ParamType (ThingClass: storage, EventType: charging, ID: {2de34a1f-de2e-43ad-8998-8a5460dff9ae}) ----------- -The name of the StateType ({2de34a1f-de2e-43ad-8998-8a5460dff9ae}) of ThingClass storage - Ladezustand - - - - SunSpec Storage - The name of the ThingClass ({e14d622f-5d8f-4788-b189-0774a6382a9b}) - SunSpec Speicher - - - - - Time zone - The name of the ParamType (ThingClass: datalogger, EventType: tzone, ID: {6bdfeeda-7a47-4043-a011-5eb96308a7d6}) ----------- -The name of the StateType ({6bdfeeda-7a47-4043-a011-5eb96308a7d6}) of ThingClass datalogger - Zeitzone - - - - Time zone changed - The name of the EventType ({6bdfeeda-7a47-4043-a011-5eb96308a7d6}) of ThingClass datalogger - Zeitzone geändert - - - - - Timezone location - The name of the ParamType (ThingClass: datalogger, EventType: tzoneloc, ID: {d034f59d-dc34-450a-a6f3-68264767a3e4}) ----------- -The name of the StateType ({d034f59d-dc34-450a-a6f3-68264767a3e4}) of ThingClass datalogger - Zeitzone Ort - - - - Timezone location changed - The name of the EventType ({d034f59d-dc34-450a-a6f3-68264767a3e4}) of ThingClass datalogger - Zeitzone Ort geändert - - - - - Total current power - The name of the ParamType (ThingClass: meter, EventType: currentPower, ID: {e5056ea1-88a2-410b-9c5e-6322aca4cb17}) ----------- -The name of the StateType ({e5056ea1-88a2-410b-9c5e-6322aca4cb17}) of ThingClass meter - Gesamte Momentanleistung - - - - Total current power changed - The name of the EventType ({e5056ea1-88a2-410b-9c5e-6322aca4cb17}) of ThingClass meter - Gesamte Momentanleistung geändert - - - - logger reachable changed - The name of the EventType ({98e4476f-e745-4a7f-b795-19269cb70c40}) of ThingClass datalogger - Logger erriechbar geändert - - - diff --git a/fronius/translations/02319cfc-8b55-49ba-99bc-0588bbfab063-en_US.ts b/fronius/translations/02319cfc-8b55-49ba-99bc-0588bbfab063-en_US.ts deleted file mode 100644 index 53558ee..0000000 --- a/fronius/translations/02319cfc-8b55-49ba-99bc-0588bbfab063-en_US.ts +++ /dev/null @@ -1,741 +0,0 @@ - - - - - IntegrationPluginFronius - - - Device not reachable - - - - - - Please try again - - - - - fronius - - - - - Address - The name of the ParamType (ThingClass: sunspecStorage, Type: thing, ID: {830a3cc6-ae0a-4cc3-94d6-86575e410e49}) ----------- -The name of the ParamType (ThingClass: storage, Type: thing, ID: {84bd8a41-2411-4bb0-87a9-ab7e01044b10}) ----------- -The name of the ParamType (ThingClass: meter, Type: thing, ID: {ddcb8689-b0b8-4b94-b022-4ce4cf9e0ec2}) - - - - - - Base URL - The name of the ParamType (ThingClass: storage, Type: thing, ID: {d19b5d81-4e62-48be-bad6-287b0019274a}) ----------- -The name of the ParamType (ThingClass: meter, Type: thing, ID: {2cb4acd6-a663-48c3-8366-ab538c7b4e7d}) - - - - - Base url - The name of the ParamType (ThingClass: inverter, Type: thing, ID: {ec1f792a-b453-49f0-8ea6-677ad3c25a5c}) - - - - - - Battery critical - The name of the ParamType (ThingClass: sunspecStorage, EventType: batteryCritical, ID: {3171a6e0-43a7-4de8-8e20-f748e44af7ac}) ----------- -The name of the StateType ({3171a6e0-43a7-4de8-8e20-f748e44af7ac}) of ThingClass sunspecStorage - - - - - Battery critical changed - The name of the EventType ({3171a6e0-43a7-4de8-8e20-f748e44af7ac}) of ThingClass sunspecStorage - - - - - - - - Battery level - The name of the ParamType (ThingClass: sunspecStorage, EventType: batteryLevel, ID: {0bf53f80-97f8-488b-b514-58f9fe08c183}) ----------- -The name of the StateType ({0bf53f80-97f8-488b-b514-58f9fe08c183}) of ThingClass sunspecStorage ----------- -The name of the ParamType (ThingClass: storage, EventType: batteryLevel, ID: {5c6da672-9662-41bc-8c8c-aa0f32481251}) ----------- -The name of the StateType ({5c6da672-9662-41bc-8c8c-aa0f32481251}) of ThingClass storage - - - - - - Battery level changed - The name of the EventType ({0bf53f80-97f8-488b-b514-58f9fe08c183}) of ThingClass sunspecStorage ----------- -The name of the EventType ({5c6da672-9662-41bc-8c8c-aa0f32481251}) of ThingClass storage - - - - - - Battery level critical - The name of the ParamType (ThingClass: storage, EventType: batteryCritical, ID: {e5396312-b50e-4d6f-b628-5b51448971d3}) ----------- -The name of the StateType ({e5396312-b50e-4d6f-b628-5b51448971d3}) of ThingClass storage - - - - - Battery level critical changed - The name of the EventType ({e5396312-b50e-4d6f-b628-5b51448971d3}) of ThingClass storage - - - - - - CO2 factor - The name of the ParamType (ThingClass: datalogger, EventType: co2factor, ID: {8ab01225-7be5-4482-a99b-314108ae0e2b}) ----------- -The name of the StateType ({8ab01225-7be5-4482-a99b-314108ae0e2b}) of ThingClass datalogger - - - - - CO2 factor changed - The name of the EventType ({8ab01225-7be5-4482-a99b-314108ae0e2b}) of ThingClass datalogger - - - - - - CO2 unit - The name of the ParamType (ThingClass: datalogger, EventType: co2unit, ID: {b0e655f8-27d0-4add-918b-461cadc8efcc}) ----------- -The name of the StateType ({b0e655f8-27d0-4add-918b-461cadc8efcc}) of ThingClass datalogger - - - - - CO2 unit changed - The name of the EventType ({b0e655f8-27d0-4add-918b-461cadc8efcc}) of ThingClass datalogger - - - - - Cash Currency changed - The name of the EventType ({84da30c8-a7fb-49c6-884c-9521f9f62bbc}) of ThingClass datalogger - - - - - - Cash currency - The name of the ParamType (ThingClass: datalogger, EventType: cashcurrency, ID: {84da30c8-a7fb-49c6-884c-9521f9f62bbc}) ----------- -The name of the StateType ({84da30c8-a7fb-49c6-884c-9521f9f62bbc}) of ThingClass datalogger - - - - - - Cash factor - The name of the ParamType (ThingClass: datalogger, EventType: cashfactor, ID: {bc18595b-17c7-4a1f-8002-b908a3d9239d}) ----------- -The name of the StateType ({bc18595b-17c7-4a1f-8002-b908a3d9239d}) of ThingClass datalogger - - - - - Cash factor changed - The name of the EventType ({bc18595b-17c7-4a1f-8002-b908a3d9239d}) of ThingClass datalogger - - - - - - Cell temperature - The name of the ParamType (ThingClass: storage, EventType: cellTemperature, ID: {4417499c-1757-4309-868a-be5cf3455c4a}) ----------- -The name of the StateType ({4417499c-1757-4309-868a-be5cf3455c4a}) of ThingClass storage - - - - - Cell temperature changed - The name of the EventType ({4417499c-1757-4309-868a-be5cf3455c4a}) of ThingClass storage - - - - - Charge state changed - The name of the EventType ({2de34a1f-de2e-43ad-8998-8a5460dff9ae}) of ThingClass storage - - - - - - - Charging limit - The name of the ParamType (ThingClass: sunspecStorage, ActionType: enableChargingLimit, ID: {1f530f79-c0d2-466b-90e1-79149e34d92f}) ----------- -The name of the ParamType (ThingClass: sunspecStorage, EventType: enableChargingLimit, ID: {1f530f79-c0d2-466b-90e1-79149e34d92f}) ----------- -The name of the StateType ({1f530f79-c0d2-466b-90e1-79149e34d92f}) of ThingClass sunspecStorage - - - - - - - Charging rate - The name of the ParamType (ThingClass: sunspecStorage, ActionType: chargingRate, ID: {7f469bbc-64a5-4045-8d5f-9a1a85039851}) ----------- -The name of the ParamType (ThingClass: sunspecStorage, EventType: chargingRate, ID: {7f469bbc-64a5-4045-8d5f-9a1a85039851}) ----------- -The name of the StateType ({7f469bbc-64a5-4045-8d5f-9a1a85039851}) of ThingClass sunspecStorage - - - - - Charging rate changed - The name of the EventType ({7f469bbc-64a5-4045-8d5f-9a1a85039851}) of ThingClass sunspecStorage - - - - - - Connected - The name of the ParamType (ThingClass: sunspecStorage, EventType: connected, ID: {50ed3a6f-6ad3-445f-950b-eb6d1b7e7ef7}) ----------- -The name of the StateType ({50ed3a6f-6ad3-445f-950b-eb6d1b7e7ef7}) of ThingClass sunspecStorage - - - - - Current Power changed - The name of the EventType ({788accbc-b86e-471b-b37f-14c9c6411526}) of ThingClass inverter - - - - - - Current power - The name of the ParamType (ThingClass: inverter, EventType: currentPower, ID: {788accbc-b86e-471b-b37f-14c9c6411526}) ----------- -The name of the StateType ({788accbc-b86e-471b-b37f-14c9c6411526}) of ThingClass inverter - - - - - - Default language - The name of the ParamType (ThingClass: datalogger, EventType: defaultlang, ID: {18b250e2-080a-4991-b368-177c4da83eca}) ----------- -The name of the StateType ({18b250e2-080a-4991-b368-177c4da83eca}) of ThingClass datalogger - - - - - Default language changed - The name of the EventType ({18b250e2-080a-4991-b368-177c4da83eca}) of ThingClass datalogger - - - - - - Device ID - The name of the ParamType (ThingClass: storage, Type: thing, ID: {49087f31-abf5-4bb8-946b-a3626ee80566}) ----------- -The name of the ParamType (ThingClass: meter, Type: thing, ID: {cf3a7025-d368-475a-8f48-efc1344a8409}) - - - - - Device id - The name of the ParamType (ThingClass: inverter, Type: thing, ID: {f2f8c2f5-dd6a-4786-b336-82fc84e5bb98}) - - - - - - - Discharging limit - The name of the ParamType (ThingClass: sunspecStorage, ActionType: enableDischargingLimit, ID: {bc99a159-815a-40ab-a6e8-b46f315305f7}) ----------- -The name of the ParamType (ThingClass: sunspecStorage, EventType: enableDischargingLimit, ID: {bc99a159-815a-40ab-a6e8-b46f315305f7}) ----------- -The name of the StateType ({bc99a159-815a-40ab-a6e8-b46f315305f7}) of ThingClass sunspecStorage - - - - - - - Discharging rate - The name of the ParamType (ThingClass: sunspecStorage, ActionType: dischargingRate, ID: {6068f030-acce-44a2-b95f-bd00dd5ca760}) ----------- -The name of the ParamType (ThingClass: sunspecStorage, EventType: dischargingRate, ID: {6068f030-acce-44a2-b95f-bd00dd5ca760}) ----------- -The name of the StateType ({6068f030-acce-44a2-b95f-bd00dd5ca760}) of ThingClass sunspecStorage - - - - - Discharging rate changed - The name of the EventType ({6068f030-acce-44a2-b95f-bd00dd5ca760}) of ThingClass sunspecStorage - - - - - Enable Charging Limit - The name of the ActionType ({1f530f79-c0d2-466b-90e1-79149e34d92f}) of ThingClass sunspecStorage - - - - - Enable Discharging Limit - The name of the ActionType ({bc99a159-815a-40ab-a6e8-b46f315305f7}) of ThingClass sunspecStorage - - - - - - Energy Consumed - The name of the ParamType (ThingClass: meter, EventType: totalEnergyConsumed, ID: {f3451818-48d2-42a5-94fd-ad094c06967f}) ----------- -The name of the StateType ({f3451818-48d2-42a5-94fd-ad094c06967f}) of ThingClass meter - - - - - - Energy Produced - The name of the ParamType (ThingClass: meter, EventType: totalEnergyProduced, ID: {ca14cca5-d9f0-49c5-a8f7-907d4c0825f0}) ----------- -The name of the StateType ({ca14cca5-d9f0-49c5-a8f7-907d4c0825f0}) of ThingClass meter - - - - - Energy consumption changed - The name of the EventType ({f3451818-48d2-42a5-94fd-ad094c06967f}) of ThingClass meter - - - - - - Energy of current day - The name of the ParamType (ThingClass: inverter, EventType: eday, ID: {b6af1bf5-753d-47b6-a151-e4d801fe6ff8}) ----------- -The name of the StateType ({b6af1bf5-753d-47b6-a151-e4d801fe6ff8}) of ThingClass inverter - - - - - - Energy of current year - The name of the ParamType (ThingClass: inverter, EventType: eyear, ID: {7fd2fa28-9bcc-4f01-a823-459437d185f6}) ----------- -The name of the StateType ({7fd2fa28-9bcc-4f01-a823-459437d185f6}) of ThingClass inverter - - - - - Energy of day changed - The name of the EventType ({b6af1bf5-753d-47b6-a151-e4d801fe6ff8}) of ThingClass inverter - - - - - Energy of year changed - The name of the EventType ({7fd2fa28-9bcc-4f01-a823-459437d185f6}) of ThingClass inverter - - - - - Energy production changed - The name of the EventType ({ca14cca5-d9f0-49c5-a8f7-907d4c0825f0}) of ThingClass meter - - - - - - Energy total - The name of the ParamType (ThingClass: inverter, EventType: totalEnergyProduced, ID: {d6dbb879-4cbc-4db3-830e-b92ba91a13e5}) ----------- -The name of the StateType ({d6dbb879-4cbc-4db3-830e-b92ba91a13e5}) of ThingClass inverter - - - - - Energy total changed - The name of the EventType ({d6dbb879-4cbc-4db3-830e-b92ba91a13e5}) of ThingClass inverter - - - - - Fronius - The name of the vendor ({2286fc38-afd9-4128-ab7e-0fba527d53ba}) - - - - - Fronius Smart Meter - The name of the ThingClass ({c3cb53a4-32dd-434d-9d9c-aada41f8129c}) - - - - - Fronius Solar - The name of the plugin fronius ({02319cfc-8b55-49ba-99bc-0588bbfab063}) - - - - - Fronius Solar Connection - The name of the ThingClass ({4fd79fed-42f1-4df9-be64-3df7b2e0bda2}) - - - - - Fronius Solar Inverter - The name of the ThingClass ({540aa956-8b8f-4982-9f58-343a76cea846}) - - - - - Fronius Solar Storage - The name of the ThingClass ({b00139fa-7386-48b1-8697-2fdd21a57ced}) - - - - - - - Grid charging - The name of the ParamType (ThingClass: sunspecStorage, ActionType: gridCharging, ID: {221a2ef6-0a92-4ff0-87fe-7bd920dbec0b}) ----------- -The name of the ParamType (ThingClass: sunspecStorage, EventType: gridCharging, ID: {221a2ef6-0a92-4ff0-87fe-7bd920dbec0b}) ----------- -The name of the StateType ({221a2ef6-0a92-4ff0-87fe-7bd920dbec0b}) of ThingClass sunspecStorage - - - - - Grid charging changed - The name of the EventType ({221a2ef6-0a92-4ff0-87fe-7bd920dbec0b}) of ThingClass sunspecStorage - - - - - - Hardware version - The name of the ParamType (ThingClass: datalogger, EventType: hwversion, ID: {3b4206e5-74c7-4708-96b8-2abfab0c41d6}) ----------- -The name of the StateType ({3b4206e5-74c7-4708-96b8-2abfab0c41d6}) of ThingClass datalogger - - - - - Hardware version changed - The name of the EventType ({3b4206e5-74c7-4708-96b8-2abfab0c41d6}) of ThingClass datalogger - - - - - - Host address - The name of the ParamType (ThingClass: inverter, Type: thing, ID: {1aa82e12-ee8c-4142-8b89-a4f1e85556d0}) ----------- -The name of the ParamType (ThingClass: datalogger, Type: thing, ID: {52da0197-4b78-4fec-aa72-70f949e26edc}) - - - - - - Inverter active - The name of the ParamType (ThingClass: inverter, EventType: active, ID: {e763baa7-5eaf-438c-83f0-4fa6c0f7eeb0}) ----------- -The name of the StateType ({e763baa7-5eaf-438c-83f0-4fa6c0f7eeb0}) of ThingClass inverter - - - - - Inverter active changed - The name of the EventType ({e763baa7-5eaf-438c-83f0-4fa6c0f7eeb0}) of ThingClass inverter - - - - - Manufacturer - The name of the ParamType (ThingClass: storage, Type: thing, ID: {9665c38b-c13a-428f-b741-1470239c63dc}) - - - - - Maxmimum capacity - The name of the ParamType (ThingClass: storage, Type: thing, ID: {59a68e91-1aad-46b7-b351-03b7b2216366}) - - - - - Set grid charging - The name of the ActionType ({221a2ef6-0a92-4ff0-87fe-7bd920dbec0b}) of ThingClass sunspecStorage - - - - - State changed - The name of the EventType ({da2b19c5-0f48-49d1-93f0-abdc0051407d}) of ThingClass sunspecStorage - - - - - - Unique ID - The name of the ParamType (ThingClass: storage, Type: thing, ID: {0d62432a-38bc-48b8-99d2-895f17fcf0b2}) ----------- -The name of the ParamType (ThingClass: meter, Type: thing, ID: {285eabb2-47c8-4406-8123-6621b21558c1}) - - - - - Unique id - The name of the ParamType (ThingClass: inverter, Type: thing, ID: {8fadc0e8-9d69-4b9d-b493-b6ac3eb59c49}) - - - - - - Platform ID - The name of the ParamType (ThingClass: datalogger, EventType: platformid, ID: {65c068e6-4a0b-4672-9724-ae95216c4c9c}) ----------- -The name of the StateType ({65c068e6-4a0b-4672-9724-ae95216c4c9c}) of ThingClass datalogger - - - - - Charging limit changed - The name of the EventType ({1f530f79-c0d2-466b-90e1-79149e34d92f}) of ThingClass sunspecStorage - - - - - Connected changed - The name of the EventType ({50ed3a6f-6ad3-445f-950b-eb6d1b7e7ef7}) of ThingClass sunspecStorage - - - - - Discharging limit changed - The name of the EventType ({bc99a159-815a-40ab-a6e8-b46f315305f7}) of ThingClass sunspecStorage - - - - - Platform ID changed - The name of the EventType ({65c068e6-4a0b-4672-9724-ae95216c4c9c}) of ThingClass datalogger - - - - - - Power management relay - The name of the ParamType (ThingClass: datalogger, EventType: powerManagmentRelay, ID: {b217acf6-0c5e-4a3e-a50c-4c0133c871c2}) ----------- -The name of the StateType ({b217acf6-0c5e-4a3e-a50c-4c0133c871c2}) of ThingClass datalogger - - - - - - Power management relay reason - The name of the ParamType (ThingClass: datalogger, EventType: powerManagmentRelayReason, ID: {5650ce9b-0d7d-4c52-b410-ea618889b4bb}) ----------- -The name of the StateType ({5650ce9b-0d7d-4c52-b410-ea618889b4bb}) of ThingClass datalogger - - - - - Power management relay reason changed - The name of the EventType ({5650ce9b-0d7d-4c52-b410-ea618889b4bb}) of ThingClass datalogger - - - - - Power management relay status changed - The name of the EventType ({b217acf6-0c5e-4a3e-a50c-4c0133c871c2}) of ThingClass datalogger - - - - - - Product ID - The name of the ParamType (ThingClass: datalogger, EventType: productid, ID: {b22052ef-14da-43d2-982b-f2c2d8c03206}) ----------- -The name of the StateType ({b22052ef-14da-43d2-982b-f2c2d8c03206}) of ThingClass datalogger - - - - - Product ID changed - The name of the EventType ({b22052ef-14da-43d2-982b-f2c2d8c03206}) of ThingClass datalogger - - - - - - - - - - - - Reachable - The name of the ParamType (ThingClass: storage, EventType: connected, ID: {2f7e1267-b0be-4b78-9aa3-832b86c4efad}) ----------- -The name of the StateType ({2f7e1267-b0be-4b78-9aa3-832b86c4efad}) of ThingClass storage ----------- -The name of the ParamType (ThingClass: meter, EventType: connected, ID: {b70b61a4-54cb-47ec-b62a-b498eb1f650e}) ----------- -The name of the StateType ({b70b61a4-54cb-47ec-b62a-b498eb1f650e}) of ThingClass meter ----------- -The name of the ParamType (ThingClass: inverter, EventType: connected, ID: {eda29c50-73ac-40e0-9c92-26fee352e688}) ----------- -The name of the StateType ({eda29c50-73ac-40e0-9c92-26fee352e688}) of ThingClass inverter ----------- -The name of the ParamType (ThingClass: datalogger, EventType: connected, ID: {98e4476f-e745-4a7f-b795-19269cb70c40}) ----------- -The name of the StateType ({98e4476f-e745-4a7f-b795-19269cb70c40}) of ThingClass datalogger - - - - - - - Reachable changed - The name of the EventType ({2f7e1267-b0be-4b78-9aa3-832b86c4efad}) of ThingClass storage ----------- -The name of the EventType ({b70b61a4-54cb-47ec-b62a-b498eb1f650e}) of ThingClass meter ----------- -The name of the EventType ({eda29c50-73ac-40e0-9c92-26fee352e688}) of ThingClass inverter - - - - - Search new devices - The name of the ActionType ({c217fdc1-de18-41dc-b5d8-8072f84e7b6c}) of ThingClass datalogger - - - - - Set charging rate - The name of the ActionType ({7f469bbc-64a5-4045-8d5f-9a1a85039851}) of ThingClass sunspecStorage - - - - - Set discharging rate - The name of the ActionType ({6068f030-acce-44a2-b95f-bd00dd5ca760}) of ThingClass sunspecStorage - - - - - - Software version - The name of the ParamType (ThingClass: datalogger, EventType: swversion, ID: {31743ca5-4353-4f26-b2ad-5da43e5b9d86}) ----------- -The name of the StateType ({31743ca5-4353-4f26-b2ad-5da43e5b9d86}) of ThingClass datalogger - - - - - Software version changed - The name of the EventType ({31743ca5-4353-4f26-b2ad-5da43e5b9d86}) of ThingClass datalogger - - - - - - State - The name of the ParamType (ThingClass: sunspecStorage, EventType: storageState, ID: {da2b19c5-0f48-49d1-93f0-abdc0051407d}) ----------- -The name of the StateType ({da2b19c5-0f48-49d1-93f0-abdc0051407d}) of ThingClass sunspecStorage - - - - - - State of charge - The name of the ParamType (ThingClass: storage, EventType: charging, ID: {2de34a1f-de2e-43ad-8998-8a5460dff9ae}) ----------- -The name of the StateType ({2de34a1f-de2e-43ad-8998-8a5460dff9ae}) of ThingClass storage - - - - - SunSpec Storage - The name of the ThingClass ({e14d622f-5d8f-4788-b189-0774a6382a9b}) - - - - - - Time zone - The name of the ParamType (ThingClass: datalogger, EventType: tzone, ID: {6bdfeeda-7a47-4043-a011-5eb96308a7d6}) ----------- -The name of the StateType ({6bdfeeda-7a47-4043-a011-5eb96308a7d6}) of ThingClass datalogger - - - - - Time zone changed - The name of the EventType ({6bdfeeda-7a47-4043-a011-5eb96308a7d6}) of ThingClass datalogger - - - - - - Timezone location - The name of the ParamType (ThingClass: datalogger, EventType: tzoneloc, ID: {d034f59d-dc34-450a-a6f3-68264767a3e4}) ----------- -The name of the StateType ({d034f59d-dc34-450a-a6f3-68264767a3e4}) of ThingClass datalogger - - - - - Timezone location changed - The name of the EventType ({d034f59d-dc34-450a-a6f3-68264767a3e4}) of ThingClass datalogger - - - - - - Total current power - The name of the ParamType (ThingClass: meter, EventType: currentPower, ID: {e5056ea1-88a2-410b-9c5e-6322aca4cb17}) ----------- -The name of the StateType ({e5056ea1-88a2-410b-9c5e-6322aca4cb17}) of ThingClass meter - - - - - Total current power changed - The name of the EventType ({e5056ea1-88a2-410b-9c5e-6322aca4cb17}) of ThingClass meter - - - - - logger reachable changed - The name of the EventType ({98e4476f-e745-4a7f-b795-19269cb70c40}) of ThingClass datalogger - - - - diff --git a/nymea-plugins-modbus.pro b/nymea-plugins-modbus.pro index e95bf13..7d5b93a 100644 --- a/nymea-plugins-modbus.pro +++ b/nymea-plugins-modbus.pro @@ -2,7 +2,6 @@ TEMPLATE = subdirs PLUGIN_DIRS = \ drexelundweiss \ - fronius \ modbuscommander \ mypv \ wallbe \