diff --git a/debian/control b/debian/control
index f545e939..f57c6e7c 100644
--- a/debian/control
+++ b/debian/control
@@ -293,6 +293,22 @@ Description: nymea.io plugin for Xiaomi Flower care devices
also know as Plant care or MiCare
+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-eq-3
Architecture: any
Depends: ${shlibs:Depends},
@@ -978,6 +994,7 @@ Depends: nymea-plugin-anel,
nymea-plugin-doorbird,
nymea-plugin-eq-3,
nymea-plugin-flowercare,
+ nymea-plugin-fronius,
nymea-plugin-genericthings,
nymea-plugin-kodi,
nymea-plugin-lgsmarttv,
diff --git a/debian/nymea-plugin-fronius.install.in b/debian/nymea-plugin-fronius.install.in
new file mode 100644
index 00000000..1b725312
--- /dev/null
+++ b/debian/nymea-plugin-fronius.install.in
@@ -0,0 +1 @@
+usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginfronius.so
diff --git a/fronius/README.md b/fronius/README.md
new file mode 100644
index 00000000..b0745868
--- /dev/null
+++ b/fronius/README.md
@@ -0,0 +1,18 @@
+# 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
new file mode 100644
index 00000000..ddd67fd7
Binary files /dev/null and b/fronius/fronius.png differ
diff --git a/fronius/fronius.pro b/fronius/fronius.pro
new file mode 100644
index 00000000..bf5754ba
--- /dev/null
+++ b/fronius/fronius.pro
@@ -0,0 +1,20 @@
+include(../plugins.pri)
+
+QT += \
+ ^network \
+
+SOURCES += \
+ integrationpluginfronius.cpp \
+ froniusthing.cpp \
+ froniuslogger.cpp \
+ froniusinverter.cpp \
+ froniusstorage.cpp \
+ froniusmeter.cpp \
+
+HEADERS += \
+ integrationpluginfronius.h \
+ froniusthing.h \
+ froniuslogger.h \
+ froniusinverter.h \
+ froniusstorage.h \
+ froniusmeter.h \
diff --git a/fronius/froniusinverter.cpp b/fronius/froniusinverter.cpp
new file mode 100644
index 00000000..3f43aed3
--- /dev/null
+++ b/fronius/froniusinverter.cpp
@@ -0,0 +1,135 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+*
+* 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
new file mode 100644
index 00000000..0b67e59a
--- /dev/null
+++ b/fronius/froniusinverter.h
@@ -0,0 +1,56 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+*
+* 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
new file mode 100644
index 00000000..e15651d5
--- /dev/null
+++ b/fronius/froniuslogger.cpp
@@ -0,0 +1,145 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+*
+* 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
new file mode 100644
index 00000000..afb94a53
--- /dev/null
+++ b/fronius/froniuslogger.h
@@ -0,0 +1,53 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+*
+* 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
new file mode 100644
index 00000000..fe662306
--- /dev/null
+++ b/fronius/froniusmeter.cpp
@@ -0,0 +1,127 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+*
+* 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
new file mode 100644
index 00000000..a629d8a9
--- /dev/null
+++ b/fronius/froniusmeter.h
@@ -0,0 +1,55 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+*
+* 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
new file mode 100644
index 00000000..1567a46a
--- /dev/null
+++ b/fronius/froniusstorage.cpp
@@ -0,0 +1,138 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+*
+* 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
new file mode 100644
index 00000000..fd61dd40
--- /dev/null
+++ b/fronius/froniusstorage.h
@@ -0,0 +1,60 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+*
+* 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
new file mode 100644
index 00000000..af3903cd
--- /dev/null
+++ b/fronius/froniusthing.cpp
@@ -0,0 +1,102 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+*
+* 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
new file mode 100644
index 00000000..9f7acbd7
--- /dev/null
+++ b/fronius/froniusthing.h
@@ -0,0 +1,82 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+*
+* 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
new file mode 100644
index 00000000..bd3d2dde
--- /dev/null
+++ b/fronius/integrationpluginfronius.cpp
@@ -0,0 +1,512 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+*
+* 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 "plugininfo.h"
+#include "integrationpluginfronius.h"
+#include "plugintimer.h"
+#include "network/networkaccessmanager.h"
+
+#include
+#include
+#include
+#include
+#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 {
+ 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);
+ });
+ }
+
+ 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 {
+ 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 {
+ 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 {
+ 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
new file mode 100644
index 00000000..88ad357a
--- /dev/null
+++ b/fronius/integrationpluginfronius.h
@@ -0,0 +1,74 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+*
+* 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
+#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_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
new file mode 100644
index 00000000..05edeb30
--- /dev/null
+++ b/fronius/integrationpluginfronius.json
@@ -0,0 +1,414 @@
+{
+ "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
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/fronius/meta.json b/fronius/meta.json
new file mode 100644
index 00000000..d8dd467b
--- /dev/null
+++ b/fronius/meta.json
@@ -0,0 +1,13 @@
+{
+ "title": "Fronius",
+ "tagline": "Connect to Fronius Solar devices.",
+ "icon": "fronius.png",
+ "stability": "community",
+ "offline": true,
+ "technologies": [
+ "network"
+ ],
+ "categories": [
+
+ ]
+}
diff --git a/fronius/translations/02319cfc-8b55-49ba-99bc-0588bbfab063-de.ts b/fronius/translations/02319cfc-8b55-49ba-99bc-0588bbfab063-de.ts
new file mode 100644
index 00000000..e4dea36a
--- /dev/null
+++ b/fronius/translations/02319cfc-8b55-49ba-99bc-0588bbfab063-de.ts
@@ -0,0 +1,741 @@
+
+
+
+
+ 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
new file mode 100644
index 00000000..53558eed
--- /dev/null
+++ b/fronius/translations/02319cfc-8b55-49ba-99bc-0588bbfab063-en_US.ts
@@ -0,0 +1,741 @@
+
+
+
+
+ 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.pro b/nymea-plugins.pro
index c734ab56..0a670cd6 100644
--- a/nymea-plugins.pro
+++ b/nymea-plugins.pro
@@ -19,6 +19,7 @@ PLUGIN_DIRS = \
elgato \
eq-3 \
flowercare \
+ fronius \
genericelements \
genericthings \
gpio \