diff --git a/debian/control b/debian/control
index b92711ac..2e95f0e8 100644
--- a/debian/control
+++ b/debian/control
@@ -930,6 +930,22 @@ Description: nymea.io plugin for senic
This package will install the nymea.io plugin for senic
+Package: nymea-plugin-sgready
+Architecture: any
+Depends: ${shlibs:Depends},
+ ${misc:Depends},
+ libnymea-gpio,
+ nymea-plugins-translations,
+Description: nymea.io plugin for SG-Ready heat pump interface based on GPIOs
+ 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 SG-Ready heat pump interface based on GPIOs
+
+
Package: nymea-plugin-shelly
Architecture: any
Depends: ${shlibs:Depends},
@@ -1333,6 +1349,7 @@ Depends: nymea-plugin-boblight,
nymea-plugin-avahimonitor,
nymea-plugin-anel,
nymea-plugin-gpio,
+ nymea-plugin-sgready,
nymea-plugin-i2cdevices,
nymea-plugin-mqttclient,
nymea-plugin-mcp3008,
diff --git a/debian/nymea-plugin-sgready.install.in b/debian/nymea-plugin-sgready.install.in
new file mode 100644
index 00000000..1832546e
--- /dev/null
+++ b/debian/nymea-plugin-sgready.install.in
@@ -0,0 +1 @@
+usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginsgready.so
diff --git a/nymea-plugins.pro b/nymea-plugins.pro
index a8f3990e..044bb527 100644
--- a/nymea-plugins.pro
+++ b/nymea-plugins.pro
@@ -54,6 +54,7 @@ PLUGIN_DIRS = \
reversessh \
senic \
serialportcommander \
+ sgready \
simulation \
sma \
somfytahoma \
diff --git a/sgready/README.md b/sgready/README.md
new file mode 100644
index 00000000..a4517d44
--- /dev/null
+++ b/sgready/README.md
@@ -0,0 +1,14 @@
+# SG-Ready
+
+Theis plugin allowes to create an SG ready interface based on 2 GPIO pins connected to a SG-Ready heat pump.
+
+The GPIO need to be connected to the SG ready interface of the heat pump.
+
+> Note: take care to configure the correct pins for relay 1 and 2. Connecting them over cross will lead to missbehaviour of your heat pump.
+
+More information about the SG ready interface can be found on following website:
+
+https://www.waermepumpe.de/normen-technik/sg-ready/
+
+
+
diff --git a/sgready/integrationpluginsgready.cpp b/sgready/integrationpluginsgready.cpp
new file mode 100644
index 00000000..4dc6a92c
--- /dev/null
+++ b/sgready/integrationpluginsgready.cpp
@@ -0,0 +1,155 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+*
+* Copyright 2013 - 2021, 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 "integrationpluginsgready.h"
+#include "plugininfo.h"
+
+IntegrationPluginSgReady::IntegrationPluginSgReady()
+{
+
+}
+
+void IntegrationPluginSgReady::init()
+{
+ // TODO: Load possible system configurations for gpio pairs depending on well knwon platforms
+}
+
+void IntegrationPluginSgReady::discoverThings(ThingDiscoveryInfo *info)
+{
+ // Check if GPIOs are available on this platform
+ if (!Gpio::isAvailable()) {
+ qCWarning(dcSgReady()) << "There are no GPIOs available on this plattform";
+ //: Error discovering SG ready GPIOs
+ return info->finish(Thing::ThingErrorHardwareNotAvailable, QT_TR_NOOP("No GPIOs available on this system."));
+ }
+
+ // FIXME: provide once system configurations are loaded
+
+ info->finish(Thing::ThingErrorNoError);
+}
+
+void IntegrationPluginSgReady::setupThing(ThingSetupInfo *info)
+{
+ Thing *thing = info->thing();
+ qCDebug(dcSgReady()) << "Setup" << thing->name() << thing->params();
+
+ // Check if GPIOs are available on this platform
+ if (!Gpio::isAvailable()) {
+ qCWarning(dcSgReady()) << "There are no GPIOs available on this plattform";
+ //: Error discovering SG ready GPIOs
+ return info->finish(Thing::ThingErrorHardwareNotAvailable, QT_TR_NOOP("No GPIOs found on this system."));
+ }
+
+ if (thing->thingClassId() == sgReadyInterfaceThingClassId) {
+ if (m_sgReadyInterfaces.contains(thing)) {
+ // Rreconfigure...
+ SgReadyInterface *interface = m_sgReadyInterfaces.take(thing);
+ delete interface;
+ // Continue with normal setup...
+ }
+
+ int gpioNumber1 = thing->paramValue(sgReadyInterfaceThingGpioNumber1ParamTypeId).toUInt();
+ int gpioNumber2 = thing->paramValue(sgReadyInterfaceThingGpioNumber2ParamTypeId).toUInt();
+ bool gpioEnabled1 = thing->stateValue(sgReadyInterfaceGpio1StateStateTypeId).toBool();
+ bool gpioEnabled2 = thing->stateValue(sgReadyInterfaceGpio2StateStateTypeId).toBool();
+
+ SgReadyInterface *sgReadyInterface = new SgReadyInterface(gpioNumber1, gpioNumber2, this);
+ if (!sgReadyInterface->setup(gpioEnabled1, gpioEnabled2)) {
+ qCWarning(dcSgReady()) << "Setup" << thing << "failed because the GPIO could not be set up correctly.";
+ //: Error message if SG ready GPIOs setup failed
+ info->finish(Thing::ThingErrorHardwareFailure, QT_TR_NOOP("Failed to set up the GPIO hardware interface."));
+ return;
+ }
+
+ // Reflect the SG states
+ connect(sgReadyInterface, &SgReadyInterface::sgReadyModeChanged, this, [thing, sgReadyInterface](SgReadyInterface::SgReadyMode mode){
+ Q_UNUSED(mode)
+ thing->setSettingValue(sgReadyInterfaceGpio1StateStateTypeId, sgReadyInterface->gpio1()->value() == Gpio::ValueHigh);
+ thing->setSettingValue(sgReadyInterfaceGpio2StateStateTypeId, sgReadyInterface->gpio2()->value() == Gpio::ValueHigh);
+ });
+
+ m_sgReadyInterfaces.insert(thing, sgReadyInterface);
+ info->finish(Thing::ThingErrorNoError);
+ return;
+ }
+}
+
+void IntegrationPluginSgReady::postSetupThing(Thing *thing)
+{
+ Q_UNUSED(thing)
+}
+
+void IntegrationPluginSgReady::thingRemoved(Thing *thing)
+{
+ if (m_sgReadyInterfaces.contains(thing)) {
+ SgReadyInterface *sgReadyInterface = m_sgReadyInterfaces.take(thing);
+ delete sgReadyInterface;
+ }
+}
+
+void IntegrationPluginSgReady::executeAction(ThingActionInfo *info)
+{
+ Thing *thing = info->thing();
+ if (thing->thingClassId() == sgReadyInterfaceThingClassId) {
+
+ SgReadyInterface *sgReadyInterface = m_sgReadyInterfaces.value(thing);
+ if (!sgReadyInterface || !sgReadyInterface->isValid()) {
+ qCWarning(dcSgReady()) << "Failed to execute action. There is no interface available for" << thing;
+ info->finish(Thing::ThingErrorHardwareNotAvailable);
+ return;
+ }
+
+ // FIXME: the modes have timing constrains we need to take care off.
+
+ if (info->action().actionTypeId() == sgReadyInterfaceSgReadyModeActionTypeId) {
+ QString sgReadyModeString = info->action().paramValue(sgReadyInterfaceSgReadyModeActionSgReadyModeParamTypeId).toString();
+ qCDebug(dcSgReady()) << "Set SG ready mode from" << thing << "to" << sgReadyModeString;
+ SgReadyInterface::SgReadyMode mode;
+ if (sgReadyModeString == "Off") {
+ mode = SgReadyInterface::SgReadyModeOff;
+ } else if (sgReadyModeString == "Low") {
+ mode = SgReadyInterface::SgReadyModeLow;
+ } else if (sgReadyModeString == "High") {
+ mode = SgReadyInterface::SgReadyModeHigh;
+ } else {
+ mode = SgReadyInterface::SgReadyModeStandard;
+ }
+
+ if (!sgReadyInterface->setSgReadyMode(mode)) {
+ qCWarning(dcSgReady()) << "Failed to set the sg ready mode on" << thing << "to" << sgReadyModeString;
+ info->finish(Thing::ThingErrorHardwareFailure);
+ return;
+ }
+
+ info->finish(Thing::ThingErrorNoError);
+ }
+ }
+}
+
diff --git a/sgready/integrationpluginsgready.h b/sgready/integrationpluginsgready.h
new file mode 100644
index 00000000..4c72b137
--- /dev/null
+++ b/sgready/integrationpluginsgready.h
@@ -0,0 +1,59 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+*
+* Copyright 2013 - 2021, 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 INTEGRATIONPLUGINSGREADY_H
+#define INTEGRATIONPLUGINSGREADY_H
+
+#include "integrations/integrationplugin.h"
+#include "sgreadyinterface.h"
+
+class IntegrationPluginSgReady : public IntegrationPlugin
+{
+ Q_OBJECT
+
+ Q_PLUGIN_METADATA(IID "io.nymea.IntegrationPlugin" FILE "integrationpluginsgready.json")
+ Q_INTERFACES(IntegrationPlugin)
+
+public:
+ explicit IntegrationPluginSgReady();
+
+ void init() override;
+ void discoverThings(ThingDiscoveryInfo *info) override;
+ void setupThing(ThingSetupInfo *info) override;
+ void postSetupThing(Thing *thing) override;
+ void thingRemoved(Thing *thing) override;
+ void executeAction(ThingActionInfo *info) override;
+
+private:
+ QHash m_sgReadyInterfaces;
+
+};
+
+#endif // INTEGRATIONPLUGINSGREADY_H
diff --git a/sgready/integrationpluginsgready.json b/sgready/integrationpluginsgready.json
new file mode 100644
index 00000000..f9ca0115
--- /dev/null
+++ b/sgready/integrationpluginsgready.json
@@ -0,0 +1,77 @@
+{
+ "name": "SgReady",
+ "displayName": "SG-Ready",
+ "id": "7923e2f3-b2f7-445d-ab14-033000485bd8",
+ "vendors": [
+ {
+ "name": "nymea",
+ "displayName": "nymea",
+ "id": "2062d64d-3232-433c-88bc-0d33c0ba2ba6",
+ "thingClasses": [
+ {
+ "id": "5a5f3aca-a958-4bca-b8fc-1168fe3371ec",
+ "name": "sgReadyInterface",
+ "displayName": "SG Ready interface",
+ "createMethods": ["user"],
+ "interfaces": [ "smartgridheatpump" ],
+ "settingsTypes": [
+ ],
+ "paramTypes": [
+ {
+ "id": "8de25aef-d868-4410-abd3-3bec9c46aba3",
+ "name": "gpioNumber1",
+ "displayName": "GPIO number 1",
+ "type": "int",
+ "defaultValue": -1
+ },
+ {
+ "id": "113ba124-a392-4bc3-861a-f7feaab82fc4",
+ "name": "gpioNumber2",
+ "displayName": "GPIO number 2",
+ "type": "int",
+ "defaultValue": -1
+ }
+ ],
+ "stateTypes": [
+ {
+ "id": "91008e09-2702-4bd5-942e-398513ae3d15",
+ "name": "sgReadyMode",
+ "displayName": "Smart grid mode",
+ "displayNameEvent": "Smart grid mode changed",
+ "displayNameAction": "Set smart grid mode",
+ "type": "QString",
+ "possibleValues": [
+ "Off",
+ "Low",
+ "Standard",
+ "High"
+ ],
+ "writable": true,
+ "defaultValue": "Standard",
+ "cached": true,
+ "suggestLogging": true
+ },
+ {
+ "id": "d2c83778-693f-4146-a656-a8ed901c1a7f",
+ "name": "gpio1State",
+ "displayName": "Relay 1 enabled",
+ "displayNameEvent": "Relay 1 enabled changed",
+ "type": "bool",
+ "cached": true,
+ "defaultValue": false
+ },
+ {
+ "id": "15608d58-b1d4-4696-ac1a-62aec5ec44ab",
+ "name": "gpio2State",
+ "displayName": "Relay 2 enabled",
+ "displayNameEvent": "Relay 2 enabled changed",
+ "type": "bool",
+ "cached": true,
+ "defaultValue": false
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/sgready/meta.json b/sgready/meta.json
new file mode 100644
index 00000000..a7d13baf
--- /dev/null
+++ b/sgready/meta.json
@@ -0,0 +1,13 @@
+{
+ "title": "SG-Ready",
+ "tagline": "Control heat pumps offering the SG-Ready interface using GPIOs.",
+ "icon": "smart-grid-logo.png",
+ "stability": "community",
+ "offline": true,
+ "technologies": [
+ ],
+ "categories": [
+ "heating"
+ ]
+}
+
diff --git a/sgready/sgready.pro b/sgready/sgready.pro
new file mode 100644
index 00000000..a2c1b4a4
--- /dev/null
+++ b/sgready/sgready.pro
@@ -0,0 +1,13 @@
+include(../plugins.pri)
+
+PKGCONFIG += nymea-gpio
+
+SOURCES += \
+ integrationpluginsgready.cpp \
+ sgreadyinterface.cpp
+
+HEADERS += \
+ integrationpluginsgready.h \
+ sgreadyinterface.h
+
+
diff --git a/sgready/sgreadyinterface.cpp b/sgready/sgreadyinterface.cpp
new file mode 100644
index 00000000..f6b7e2ee
--- /dev/null
+++ b/sgready/sgreadyinterface.cpp
@@ -0,0 +1,181 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+*
+* Copyright 2013 - 2021, 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 "sgreadyinterface.h"
+#include "extern-plugininfo.h"
+
+SgReadyInterface::SgReadyInterface(int gpioNumber1, int gpioNumber2, QObject *parent) :
+ QObject(parent),
+ m_gpioNumber1(gpioNumber1),
+ m_gpioNumber2(gpioNumber2)
+{
+
+}
+
+SgReadyInterface::SgReadyMode SgReadyInterface::sgReadyMode() const
+{
+ return m_sgReadyMode;
+}
+
+bool SgReadyInterface::setSgReadyMode(SgReadyMode sgReadyMode)
+{
+ if (!isValid())
+ return false;
+
+ /* https://www.waermepumpe.de/normen-technik/sg-ready/
+ *
+ * Off: 1,0
+ * Low: 0,0
+ * Standard: 0,1
+ * High: 1,1
+ */
+
+ QPair gpioSettings;
+ switch (sgReadyMode) {
+ case SgReadyModeOff:
+ gpioSettings.first = true;
+ gpioSettings.second = false;
+ break;
+ case SgReadyModeLow:
+ gpioSettings.first = false;
+ gpioSettings.second = false;
+ break;
+ case SgReadyModeStandard:
+ gpioSettings.first = false;
+ gpioSettings.second = true;
+ break;
+ case SgReadyModeHigh:
+ gpioSettings.first = true;
+ gpioSettings.second = true;
+ break;
+ }
+
+ if (!m_gpio1->setValue(gpioSettings.first ? Gpio::ValueHigh : Gpio::ValueLow)) {
+ qCWarning(dcSgReady()) << "Could not switch GPIO 1 for setting" << sgReadyMode;
+ return false;
+ }
+
+ if (!m_gpio2->setValue(gpioSettings.second ? Gpio::ValueHigh : Gpio::ValueLow)) {
+ qCWarning(dcSgReady()) << "Could not switch GPIO 2 for setting" << sgReadyMode;
+ return false;
+ }
+
+ if (m_sgReadyMode != sgReadyMode) {
+ m_sgReadyMode = sgReadyMode;
+ emit sgReadyModeChanged(m_sgReadyMode);
+ }
+
+ return true;
+}
+
+bool SgReadyInterface::setup(bool gpio1Enabled, bool gpio2Enabled)
+{
+ m_gpio1 = setupGpio(m_gpioNumber1, gpio1Enabled);
+ if (!m_gpio1) {
+ qCWarning(dcSgReady()) << "Failed to set up SG ready interface gpio 1" << m_gpioNumber1;
+ return false;
+ }
+
+ m_gpio2 = setupGpio(m_gpioNumber2, gpio2Enabled);
+ if (!m_gpio2) {
+ delete m_gpio1;
+ m_gpio1 = nullptr;
+ qCWarning(dcSgReady()) << "Failed to set up SG ready interface gpio 2" << m_gpioNumber1;
+ return false;
+ }
+
+ /* https://www.waermepumpe.de/normen-technik/sg-ready/
+ *
+ * Off: 1,0
+ * Low: 0,0
+ * Standard: 0,1
+ * High: 1,1
+ */
+
+ if (gpio1Enabled && !gpio2Enabled) {
+ m_sgReadyMode = SgReadyModeOff;
+ } else if (!gpio1Enabled && !gpio2Enabled) {
+ m_sgReadyMode = SgReadyModeLow;
+ } else if (!gpio1Enabled && gpio2Enabled) {
+ m_sgReadyMode = SgReadyModeStandard;
+ } else {
+ m_sgReadyMode = SgReadyModeHigh;
+ }
+
+ emit sgReadyModeChanged(m_sgReadyMode);
+
+ return true;
+}
+
+bool SgReadyInterface::isValid() const
+{
+ return m_gpioNumber1 >= 0 && m_gpioNumber2 >= 0 && m_gpio1 && m_gpio2;
+}
+
+Gpio *SgReadyInterface::gpio1() const
+{
+ return m_gpio1;
+}
+
+Gpio *SgReadyInterface::gpio2() const
+{
+ return m_gpio2;
+}
+
+Gpio *SgReadyInterface::setupGpio(int gpioNumber, bool initialValue)
+{
+ if (gpioNumber < 0) {
+ qCWarning(dcSgReady()) << "Invalid gpio number for setting up gpio" << gpioNumber;
+ return nullptr;
+ }
+
+ // Create and configure gpio
+ Gpio *gpio = new Gpio(gpioNumber, this);
+ if (!gpio->exportGpio()) {
+ qCWarning(dcSgReady()) << "Could not export gpio" << gpioNumber;
+ gpio->deleteLater();
+ return nullptr;
+ }
+
+ if (!gpio->setDirection(Gpio::DirectionOutput)) {
+ qCWarning(dcSgReady()) << "Failed to configure gpio" << gpioNumber << "as output";
+ gpio->deleteLater();
+ return nullptr;
+ }
+
+ // Set the pin to the initial value
+ if (!gpio->setValue(initialValue ? Gpio::ValueHigh : Gpio::ValueLow)) {
+ qCWarning(dcSgReady()) << "Failed to set initially value" << initialValue << "for gpio" << gpioNumber;
+ gpio->deleteLater();
+ return nullptr;
+ }
+
+ return gpio;
+}
diff --git a/sgready/sgreadyinterface.h b/sgready/sgreadyinterface.h
new file mode 100644
index 00000000..5c1f9869
--- /dev/null
+++ b/sgready/sgreadyinterface.h
@@ -0,0 +1,75 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+*
+* Copyright 2013 - 2021, 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 SGREADYINTERFACE_H
+#define SGREADYINTERFACE_H
+
+#include
+
+#include "gpio.h"
+
+class SgReadyInterface : public QObject
+{
+ Q_OBJECT
+public:
+ enum SgReadyMode {
+ SgReadyModeOff,
+ SgReadyModeLow,
+ SgReadyModeStandard,
+ SgReadyModeHigh
+ };
+ Q_ENUM(SgReadyMode)
+
+ explicit SgReadyInterface(int gpioNumber1, int gpioNumber2, QObject *parent = nullptr);
+
+ SgReadyMode sgReadyMode() const;
+ bool setSgReadyMode(SgReadyMode sgReadyMode);
+
+ bool setup(bool gpio1Enabled, bool gpio2Enabled);
+ bool isValid() const;
+
+ Gpio *gpio1() const;
+ Gpio *gpio2() const;
+
+signals:
+ void sgReadyModeChanged(SgReadyMode sgReadyMode);
+
+private:
+ SgReadyMode m_sgReadyMode = SgReadyModeStandard;
+ int m_gpioNumber1 = -1;
+ int m_gpioNumber2 = -1;
+
+ Gpio *m_gpio1 = nullptr;
+ Gpio *m_gpio2 = nullptr;
+
+ Gpio *setupGpio(int gpioNumber, bool initialValue);
+};
+
+#endif // SGREADYINTERFACE_H
diff --git a/sgready/smart-grid-logo.png b/sgready/smart-grid-logo.png
new file mode 100644
index 00000000..023ee6ec
Binary files /dev/null and b/sgready/smart-grid-logo.png differ
diff --git a/sgready/translations/7923e2f3-b2f7-445d-ab14-033000485bd8-en_US.ts b/sgready/translations/7923e2f3-b2f7-445d-ab14-033000485bd8-en_US.ts
new file mode 100644
index 00000000..08785c4d
--- /dev/null
+++ b/sgready/translations/7923e2f3-b2f7-445d-ab14-033000485bd8-en_US.ts
@@ -0,0 +1,112 @@
+
+
+
+
+ IntegrationPluginSgReady
+
+
+ No GPIOs available on this system.
+ Error discovering SG ready GPIOs
+
+
+
+
+ No GPIOs found on this system.
+ Error discovering SG ready GPIOs
+
+
+
+
+ Failed to set up the GPIO hardware interface.
+ Error message if SG ready GPIOs setup failed
+
+
+
+
+ SgReady
+
+
+ GPIO number 1
+ The name of the ParamType (ThingClass: sgReadyInterface, Type: thing, ID: {8de25aef-d868-4410-abd3-3bec9c46aba3})
+
+
+
+
+ GPIO number 2
+ The name of the ParamType (ThingClass: sgReadyInterface, Type: thing, ID: {113ba124-a392-4bc3-861a-f7feaab82fc4})
+
+
+
+
+
+ Relay 1 enabled
+ The name of the ParamType (ThingClass: sgReadyInterface, EventType: gpio1State, ID: {d2c83778-693f-4146-a656-a8ed901c1a7f})
+----------
+The name of the StateType ({d2c83778-693f-4146-a656-a8ed901c1a7f}) of ThingClass sgReadyInterface
+
+
+
+
+ Relay 1 enabled changed
+ The name of the EventType ({d2c83778-693f-4146-a656-a8ed901c1a7f}) of ThingClass sgReadyInterface
+
+
+
+
+
+ Relay 2 enabled
+ The name of the ParamType (ThingClass: sgReadyInterface, EventType: gpio2State, ID: {15608d58-b1d4-4696-ac1a-62aec5ec44ab})
+----------
+The name of the StateType ({15608d58-b1d4-4696-ac1a-62aec5ec44ab}) of ThingClass sgReadyInterface
+
+
+
+
+ Relay 2 enabled changed
+ The name of the EventType ({15608d58-b1d4-4696-ac1a-62aec5ec44ab}) of ThingClass sgReadyInterface
+
+
+
+
+ SG Ready interface
+ The name of the ThingClass ({5a5f3aca-a958-4bca-b8fc-1168fe3371ec})
+
+
+
+
+ SG-Ready
+ The name of the plugin SgReady ({7923e2f3-b2f7-445d-ab14-033000485bd8})
+
+
+
+
+ Set smart grid mode
+ The name of the ActionType ({91008e09-2702-4bd5-942e-398513ae3d15}) of ThingClass sgReadyInterface
+
+
+
+
+
+
+ Smart grid mode
+ The name of the ParamType (ThingClass: sgReadyInterface, ActionType: sgReadyMode, ID: {91008e09-2702-4bd5-942e-398513ae3d15})
+----------
+The name of the ParamType (ThingClass: sgReadyInterface, EventType: sgReadyMode, ID: {91008e09-2702-4bd5-942e-398513ae3d15})
+----------
+The name of the StateType ({91008e09-2702-4bd5-942e-398513ae3d15}) of ThingClass sgReadyInterface
+
+
+
+
+ Smart grid mode changed
+ The name of the EventType ({91008e09-2702-4bd5-942e-398513ae3d15}) of ThingClass sgReadyInterface
+
+
+
+
+ nymea
+ The name of the vendor ({2062d64d-3232-433c-88bc-0d33c0ba2ba6})
+
+
+
+