From dd295f251cf0fcf07b2971fcc6ef59a701653c05 Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Mon, 23 Jan 2023 14:59:13 +0100 Subject: [PATCH] New plugin: Amperfied --- amperfied/README.md | 19 + amperfied/amperfied-registers.json | 250 ++++++++++ amperfied/amperfied.jpg | Bin 0 -> 11531 bytes amperfied/amperfied.pro | 17 + amperfied/connecthomediscovery.cpp | 138 ++++++ amperfied/connecthomediscovery.h | 75 +++ amperfied/energycontroldiscovery.cpp | 95 ++++ amperfied/energycontroldiscovery.h | 66 +++ .../heidelberg-amperfied-modbus-protocol.pdf | Bin 0 -> 139891 bytes amperfied/integrationpluginamperfied.cpp | 443 ++++++++++++++++++ amperfied/integrationpluginamperfied.h | 73 +++ amperfied/integrationpluginamperfied.json | 219 +++++++++ amperfied/meta.json | 13 + ...63ff6-eea8-4977-a0b7-28b70399925b-en_US.ts | 177 +++++++ debian/control | 9 + debian/nymea-plugin-amperfied.install.in | 2 + nymea-plugins-modbus.pro | 1 + 17 files changed, 1597 insertions(+) create mode 100644 amperfied/README.md create mode 100644 amperfied/amperfied-registers.json create mode 100644 amperfied/amperfied.jpg create mode 100644 amperfied/amperfied.pro create mode 100644 amperfied/connecthomediscovery.cpp create mode 100644 amperfied/connecthomediscovery.h create mode 100644 amperfied/energycontroldiscovery.cpp create mode 100644 amperfied/energycontroldiscovery.h create mode 100644 amperfied/heidelberg-amperfied-modbus-protocol.pdf create mode 100644 amperfied/integrationpluginamperfied.cpp create mode 100644 amperfied/integrationpluginamperfied.h create mode 100644 amperfied/integrationpluginamperfied.json create mode 100644 amperfied/meta.json create mode 100644 amperfied/translations/2c463ff6-eea8-4977-a0b7-28b70399925b-en_US.ts create mode 100644 debian/nymea-plugin-amperfied.install.in diff --git a/amperfied/README.md b/amperfied/README.md new file mode 100644 index 0000000..0dea547 --- /dev/null +++ b/amperfied/README.md @@ -0,0 +1,19 @@ +# Amperfied - Heidelberg + +Connects nymea to a Amperfied/Heidelberg wallboxes. Currently supported models are: + +* Amperfeid Energy Control +* Amperfeid connect.home + +# Requirements + +nymea requires the use of a firmware greator or equal version 1.0.7 on the wallbox. + +## Amperfeid Energy Control +The Amperfeid Energy Control is a Modbus RTU device. This means it must be connected to the nymea system using an RS485 port. +In order to allow nymea to automatically discover the wallbox on the bus, the Modbus slave ID must be in the range of 1 - 20. +If a higher slave ID number is required, the manual setup is to be used. + +## Amperfied connect.home +The Amperfeid connect.home is a Modbus TCP device. This means it must be connected to the same network the nymea system is in. + diff --git a/amperfied/amperfied-registers.json b/amperfied/amperfied-registers.json new file mode 100644 index 0000000..f93a92f --- /dev/null +++ b/amperfied/amperfied-registers.json @@ -0,0 +1,250 @@ +{ + "className": "Amperfied", + "protocol": "BOTH", + "endianness": "BigEndian", + "errorLimitUntilNotReachable": 2, + "checkReachableRegister": "chargingCurrent", + "enums": [ + { + "name": "ChargingState", + "values": [ + { + "key": "Undefined", + "value": 1 + }, + { + "key": "A1", + "value": 2 + }, + { + "key": "A2", + "value": 3 + }, + { + "key": "B1", + "value": 4 + }, + { + "key": "B2", + "value": 5 + }, + { + "key": "C1", + "value": 6 + }, + { + "key": "C2", + "value": 7 + }, + { + "key": "Derating", + "value": 8 + }, + { + "key": "E", + "value": 9 + }, + { + "key": "F", + "value": 10 + }, + { + "key": "Error", + "value": 11 + } + ] + } + ], + "blocks": [ + { + "id": "consumptions", + "readSchedule": "update", + "registers": [ + { + "id": "chargingState", + "address": 5, + "size": 1, + "type": "uint16", + "registerType": "inputRegister", + "description": "ChargingState", + "enum": "ChargingState", + "defaultValue": "ChargingStateUndefined", + "access": "RO" + }, + { + "id": "currentL1", + "address": 6, + "size": 1, + "type": "uint16", + "unit": "A", + "registerType": "inputRegister", + "description": "Current L1", + "defaultValue": "0", + "access": "RO" + }, + { + "id": "currentL2", + "address": 7, + "size": 1, + "type": "uint16", + "unit": "A", + "registerType": "inputRegister", + "description": "Current L2", + "defaultValue": "0", + "access": "RO" + }, + { + "id": "currentL3", + "address": 8, + "size": 1, + "type": "uint16", + "unit": "A", + "registerType": "inputRegister", + "description": "Current L3", + "defaultValue": "0", + "access": "RO" + }, + { + "id": "pcbTemperature", + "address": 9, + "size": 1, + "type": "uint16", + "unit": "1/10°C", + "registerType": "inputRegister", + "description": "PCB temperature", + "defaultValue": "0", + "access": "RO" + }, + { + "id": "voltageL1", + "address": 10, + "size": 1, + "type": "uint16", + "registerType": "inputRegister", + "description": "Voltage L1", + "unit": "V", + "defaultValue": 0, + "access": "RO" + }, + { + "id": "voltageL2", + "address": 11, + "size": 1, + "type": "uint16", + "registerType": "inputRegister", + "description": "Voltage L2", + "unit": "V", + "defaultValue": 0, + "access": "RO" + }, + { + "id": "voltageL3", + "address": 12, + "size": 1, + "type": "uint16", + "registerType": "inputRegister", + "description": "Voltage L3", + "unit": "V", + "defaultValue": 0, + "access": "RO" + }, + { + "id": "externalLock", + "address": 13, + "size": 1, + "type": "uint16", + "registerType": "inputRegister", + "description": "External lock", + "defaultValue": 0, + "access": "RO" + }, + { + "id": "currentPower", + "address": 14, + "size": 1, + "type": "uint16", + "registerType": "inputRegister", + "description": "Power (L1+L2+L3)", + "unit": "VA", + "defaultValue": 0, + "access": "RO" + }, + { + "id": "sessionEnergy", + "address": 15, + "size": 2, + "type": "uint32", + "registerType": "inputRegister", + "description": "Energy since PowerOn", + "unit": "Wh", + "defaultValue": 0, + "access": "RO" + }, + { + "id": "totalEnergy", + "address": 17, + "size": 2, + "type": "uint32", + "registerType": "inputRegister", + "description": "Energy since installation", + "unit": "Wh", + "defaultValue": 0, + "access": "RO" + } + ] + }, + { + "id": "minMaxValues", + "readSchedule": "update", + "registers": [ + { + "id": "maxChargingCurrent", + "address": 100, + "size": 1, + "type": "uint16", + "registerType": "inputRegister", + "description": "Absolute maximum charging current", + "unit": "A", + "defaultValue": 0, + "access": "RO" + }, + { + "id": "minChargingCurrent", + "address": 101, + "size": 1, + "type": "uint16", + "registerType": "inputRegister", + "description": "Absolute minimum charging current", + "unit": "A", + "defaultValue": 0, + "access": "RO" + } + ] + } + ], + "registers": [ + { + "id": "version", + "address": 4, + "size": 1, + "type": "uint16", + "readSchedule": "init", + "registerType": "inputRegister", + "description": "Version", + "defaultValue": 0, + "access": "RO" + }, + { + "id": "chargingCurrent", + "address": 261, + "size": 1, + "type": "uint16", + "readSchedule": "update", + "registerType": "holdingRegister", + "description": "Charging current", + "unit": "A", + "defaultValue": "0", + "access": "RW" + } + ] +} diff --git a/amperfied/amperfied.jpg b/amperfied/amperfied.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2af0f1bab70dabb7591453500dd77f68ee34d2d6 GIT binary patch literal 11531 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. +* +* 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 "connecthomediscovery.h" +#include "extern-plugininfo.h" + +ConnectHomeDiscovery::ConnectHomeDiscovery(NetworkDeviceDiscovery *networkDeviceDiscovery, QObject *parent) : + QObject{parent}, + m_networkDeviceDiscovery{networkDeviceDiscovery} +{ + m_gracePeriodTimer.setSingleShot(true); + m_gracePeriodTimer.setInterval(3000); + connect(&m_gracePeriodTimer, &QTimer::timeout, this, [this](){ + qCDebug(dcAmperfied()) << "Discovery: Grace period timer triggered."; + finishDiscovery(); + }); +} + +void ConnectHomeDiscovery::startDiscovery() +{ + qCInfo(dcAmperfied()) << "Discovery: Searching for Amperfied wallboxes in the network..."; + NetworkDeviceDiscoveryReply *discoveryReply = m_networkDeviceDiscovery->discover(); + + connect(discoveryReply, &NetworkDeviceDiscoveryReply::networkDeviceInfoAdded, this, &ConnectHomeDiscovery::checkNetworkDevice); + + connect(discoveryReply, &NetworkDeviceDiscoveryReply::finished, this, [=](){ + qCDebug(dcAmperfied()) << "Discovery: Network discovery finished. Found" << discoveryReply->networkDeviceInfos().count() << "network devices"; + m_gracePeriodTimer.start(); + discoveryReply->deleteLater(); + }); +} + +QList ConnectHomeDiscovery::discoveryResults() const +{ + return m_discoveryResults; +} + +void ConnectHomeDiscovery::checkNetworkDevice(const NetworkDeviceInfo &networkDeviceInfo) +{ + int port = 502; + int slaveId = 1; + qCDebug(dcAmperfied()) << "Checking network device:" << networkDeviceInfo << "Port:" << port << "Slave ID:" << slaveId; + + AmperfiedModbusTcpConnection *connection = new AmperfiedModbusTcpConnection(networkDeviceInfo.address(), port, slaveId, this); + m_connections.append(connection); + + connect(connection, &AmperfiedModbusTcpConnection::reachableChanged, this, [=](bool reachable){ + if (!reachable) { + // Disconnected ... done with this connection + cleanupConnection(connection); + return; + } + + // Modbus TCP connected...ok, let's try to initialize it! + connect(connection, &AmperfiedModbusTcpConnection::initializationFinished, this, [=](bool success){ + if (!success) { + qCDebug(dcAmperfied()) << "Discovery: Initialization failed on" << networkDeviceInfo.address().toString(); + cleanupConnection(connection); + return; + } + Result result; + result.firmwareVersion = connection->version(); + result.networkDeviceInfo = networkDeviceInfo; + m_discoveryResults.append(result); + + qCDebug(dcAmperfied()) << "Discovery: --> Found" + << "Version:" << result.firmwareVersion + << result.networkDeviceInfo; + + + // Done with this connection + cleanupConnection(connection); + }); + + if (!connection->initialize()) { + qCDebug(dcAmperfied()) << "Discovery: Unable to initialize connection on" << networkDeviceInfo.address().toString(); + cleanupConnection(connection); + } + }); + + // If check reachability failed...skip this host... + connect(connection, &AmperfiedModbusTcpConnection::checkReachabilityFailed, this, [=](){ + qCDebug(dcAmperfied()) << "Discovery: Checking reachability failed on" << networkDeviceInfo.address().toString(); + cleanupConnection(connection); + }); + + // Try to connect, maybe it works, maybe not... + connection->connectDevice(); +} + +void ConnectHomeDiscovery::cleanupConnection(AmperfiedModbusTcpConnection *connection) +{ + m_connections.removeAll(connection); + connection->disconnectDevice(); + connection->deleteLater(); +} + +void ConnectHomeDiscovery::finishDiscovery() +{ + qint64 durationMilliSeconds = QDateTime::currentMSecsSinceEpoch() - m_startDateTime.toMSecsSinceEpoch(); + + // Cleanup any leftovers...we don't care any more + foreach (AmperfiedModbusTcpConnection *connection, m_connections) + cleanupConnection(connection); + + qCInfo(dcAmperfied()) << "Discovery: Finished the discovery process. Found" << m_discoveryResults.count() + << "Amperfied wallboxes in" << QTime::fromMSecsSinceStartOfDay(durationMilliSeconds).toString("mm:ss.zzz"); + m_gracePeriodTimer.stop(); + + emit discoveryFinished(); +} diff --git a/amperfied/connecthomediscovery.h b/amperfied/connecthomediscovery.h new file mode 100644 index 0000000..6126921 --- /dev/null +++ b/amperfied/connecthomediscovery.h @@ -0,0 +1,75 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* +* Copyright 2013 - 2023, 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 CONNECTHOMEDISCOVERY_H +#define CONNECTHOMEDISCOVERY_H + +#include +#include + +#include + +#include "amperfiedmodbustcpconnection.h" + +class ConnectHomeDiscovery : public QObject +{ + Q_OBJECT +public: + explicit ConnectHomeDiscovery(NetworkDeviceDiscovery *networkDeviceDiscovery, QObject *parent = nullptr); + struct Result { + quint16 firmwareVersion; + quint16 slaveId; + NetworkDeviceInfo networkDeviceInfo; + }; + + void startDiscovery(); + + QList discoveryResults() const; + +signals: + void discoveryFinished(); + +private: + NetworkDeviceDiscovery *m_networkDeviceDiscovery = nullptr; + + QTimer m_gracePeriodTimer; + QDateTime m_startDateTime; + + QList m_connections; + + QList m_discoveryResults; + + void checkNetworkDevice(const NetworkDeviceInfo &networkDeviceInfo); + void cleanupConnection(AmperfiedModbusTcpConnection *connection); + + void finishDiscovery(); +}; + +#endif // CONNECTHOMEDISCOVERY_H diff --git a/amperfied/energycontroldiscovery.cpp b/amperfied/energycontroldiscovery.cpp new file mode 100644 index 0000000..465a4d6 --- /dev/null +++ b/amperfied/energycontroldiscovery.cpp @@ -0,0 +1,95 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* +* Copyright 2013 - 2023, 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 "energycontroldiscovery.h" +#include "extern-plugininfo.h" + +EnergyControlDiscovery::EnergyControlDiscovery(ModbusRtuHardwareResource *modbusRtuResource, QObject *parent) : + QObject{parent}, + m_modbusRtuResource{modbusRtuResource} +{ +} + +void EnergyControlDiscovery::startDiscovery() +{ + qCInfo(dcAmperfied()) << "Discovery: Searching for Amperfied EnergyControl wallboxes on modbus RTU..."; + + QList candidateMasters; + foreach (ModbusRtuMaster *master, m_modbusRtuResource->modbusRtuMasters()) { + if (master->baudrate() == 19200 && master->dataBits() == 8 && master->stopBits() == 1 && master->parity() == QSerialPort::EvenParity) { + candidateMasters.append(master); + } + } + + if (candidateMasters.isEmpty()) { + qCWarning(dcAmperfied()) << "No usable modbus RTU master found."; + emit discoveryFinished(false); + return; + } + + foreach (ModbusRtuMaster *master, candidateMasters) { + if (master->connected()) { + tryConnect(master, 1); + } else { + qCWarning(dcAmperfied()) << "Modbus RTU master" << master->modbusUuid().toString() << "is not connected."; + } + } +} + +QList EnergyControlDiscovery::discoveryResults() const +{ + return m_discoveryResults; +} + +void EnergyControlDiscovery::tryConnect(ModbusRtuMaster *master, quint16 slaveId) +{ + qCDebug(dcAmperfied()) << "Scanning modbus RTU master" << master->modbusUuid() << "Slave ID:" << slaveId; + + ModbusRtuReply *reply = master->readInputRegister(slaveId, 4); + connect(reply, &ModbusRtuReply::finished, this, [=](){ + qCDebug(dcAmperfied()) << "Test reply finished!" << reply->error() << reply->result(); + if (reply->error() == ModbusRtuReply::NoError && reply->result().length() > 0) { + quint16 version = reply->result().first(); + if (version >= 0x0100) { + qCDebug(dcAmperfied()) << QString("Version is 0x%1").arg(version, 0, 16); + Result result {master->modbusUuid(), version, slaveId}; + m_discoveryResults.append(result); + } else { + qCDebug(dcAmperfied()) << "Version must be at least 1.0.0 (0x0100)"; + } + } + if (slaveId < 20) { + tryConnect(master, slaveId+1); + } else { + emit discoveryFinished(true); + } + }); +} + diff --git a/amperfied/energycontroldiscovery.h b/amperfied/energycontroldiscovery.h new file mode 100644 index 0000000..fec47a7 --- /dev/null +++ b/amperfied/energycontroldiscovery.h @@ -0,0 +1,66 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* +* Copyright 2013 - 2023, 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 ENERGYCONTROLDISCOVERY_H +#define ENERGYCONTROLDISCOVERY_H + +#include +#include + +#include + +class EnergyControlDiscovery : public QObject +{ + Q_OBJECT +public: + explicit EnergyControlDiscovery(ModbusRtuHardwareResource *modbusRtuResource, QObject *parent = nullptr); + struct Result { + QUuid modbusRtuMasterId; + quint16 firmwareVersion; + quint16 slaveId; + }; + + void startDiscovery(); + + QList discoveryResults() const; + +signals: + void discoveryFinished(bool modbusRtuMasterAvailable); + +private slots: + void tryConnect(ModbusRtuMaster *master, quint16 slaveId); + +private: + ModbusRtuHardwareResource *m_modbusRtuResource = nullptr; + + QList m_discoveryResults; +}; + +#endif // ENERGYCONTROLDISCOVERY_H diff --git a/amperfied/heidelberg-amperfied-modbus-protocol.pdf b/amperfied/heidelberg-amperfied-modbus-protocol.pdf new file mode 100644 index 0000000000000000000000000000000000000000..eaefff27ebe02fa1048a6788a9c3582337449697 GIT binary patch literal 139891 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 Vasjs(8k?K)a;d7i`n&OR0RW&n3n2gi literal 0 HcmV?d00001 diff --git a/amperfied/integrationpluginamperfied.cpp b/amperfied/integrationpluginamperfied.cpp new file mode 100644 index 0000000..da6fe21 --- /dev/null +++ b/amperfied/integrationpluginamperfied.cpp @@ -0,0 +1,443 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* +* Copyright 2013 - 2022, 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 "integrationpluginamperfied.h" +#include "plugininfo.h" +#include "energycontroldiscovery.h" +#include "connecthomediscovery.h" + +#include +#include +#include + +IntegrationPluginAmperfied::IntegrationPluginAmperfied() +{ + +} + +void IntegrationPluginAmperfied::discoverThings(ThingDiscoveryInfo *info) +{ + hardwareManager()->modbusRtuResource(); + + if (info->thingClassId() == energyControlThingClassId) { + EnergyControlDiscovery *discovery = new EnergyControlDiscovery(hardwareManager()->modbusRtuResource(), info); + + connect(discovery, &EnergyControlDiscovery::discoveryFinished, info, [this, info, discovery](bool modbusMasterAvailable){ + if (!modbusMasterAvailable) { + info->finish(Thing::ThingErrorHardwareNotAvailable, QT_TR_NOOP("No modbus RTU master with appropriate settings found. Please set up a modbus RTU master with a baudrate of 19200, 8 data bis, 1 stop bit and even parity first.")); + return; + } + + qCInfo(dcAmperfied()) << "Discovery results:" << discovery->discoveryResults().count(); + + foreach (const EnergyControlDiscovery::Result &result, discovery->discoveryResults()) { + ThingDescriptor descriptor(energyControlThingClassId, "Amperfied Energy Control", QString("Slave ID: %1").arg(result.slaveId)); + + ParamList params{ + {energyControlThingRtuMasterParamTypeId, result.modbusRtuMasterId}, + {energyControlThingSlaveIdParamTypeId, result.slaveId} + }; + descriptor.setParams(params); + + Thing *existingThing = myThings().findByParams(params); + if (existingThing) { + descriptor.setThingId(existingThing->id()); + } + info->addThingDescriptor(descriptor); + } + + info->finish(Thing::ThingErrorNoError); + }); + + discovery->startDiscovery(); + + return; + } + + if (info->thingClassId() == connectHomeThingClassId) { + ConnectHomeDiscovery *discovery = new ConnectHomeDiscovery(hardwareManager()->networkDeviceDiscovery(), info); + connect(discovery, &ConnectHomeDiscovery::discoveryFinished, info, [this, info, discovery](){ + qCInfo(dcAmperfied()) << "Discovery results:" << discovery->discoveryResults().count(); + + foreach (const ConnectHomeDiscovery::Result &result, discovery->discoveryResults()) { + ThingDescriptor descriptor(connectHomeThingClassId, "Amperfied connect.home", QString("MAC: %1").arg(result.networkDeviceInfo.macAddress())); + + ParamList params{ + {connectHomeThingMacAddressParamTypeId, result.networkDeviceInfo.macAddress()} + }; + descriptor.setParams(params); + + Thing *existingThing = myThings().findByParams(params); + if (existingThing) { + descriptor.setThingId(existingThing->id()); + } + info->addThingDescriptor(descriptor); + } + + info->finish(Thing::ThingErrorNoError); + + }); + discovery->startDiscovery(); + } +} + +void IntegrationPluginAmperfied::setupThing(ThingSetupInfo *info) +{ + Thing *thing = info->thing(); + qCDebug(dcAmperfied()) << "Setup" << thing << thing->params(); + + if (thing->thingClassId() == energyControlThingClassId) { + + if (m_rtuConnections.contains(thing)) { + qCDebug(dcAmperfied()) << "Reconfiguring existing thing" << thing->name(); + m_rtuConnections.take(thing)->deleteLater(); + } + + setupRtuConnection(info); + return; + } + + + if (info->thing()->thingClassId() == connectHomeThingClassId) { + if (m_tcpConnections.contains(info->thing())) { + delete m_tcpConnections.take(info->thing()); + } + + NetworkDeviceMonitor *monitor = m_monitors.value(info->thing()); + if (!monitor) { + monitor = hardwareManager()->networkDeviceDiscovery()->registerMonitor(MacAddress(thing->paramValue(connectHomeThingMacAddressParamTypeId).toString())); + m_monitors.insert(thing, monitor); + } + + connect(info, &ThingSetupInfo::aborted, monitor, [=](){ + if (m_monitors.contains(thing)) { + qCDebug(dcAmperfied()) << "Unregistering monitor because setup has been aborted."; + hardwareManager()->networkDeviceDiscovery()->unregisterMonitor(m_monitors.take(thing)); + } + }); + + qCDebug(dcAmperfied()) << "Monitor reachable" << monitor->reachable() << thing->paramValue(connectHomeThingMacAddressParamTypeId).toString(); + if (monitor->reachable()) { + setupTcpConnection(info); + } else { + connect(monitor, &NetworkDeviceMonitor::reachableChanged, info, [this, info](bool reachable){ + qCDebug(dcAmperfied()) << "Monitor reachable changed!" << reachable; + if (reachable) { + setupTcpConnection(info); + } + }); + } + } +} + +void IntegrationPluginAmperfied::postSetupThing(Thing *thing) +{ + Q_UNUSED(thing) + if (!m_pluginTimer) { + qCDebug(dcAmperfied()) << "Starting plugin timer..."; + m_pluginTimer = hardwareManager()->pluginTimerManager()->registerTimer(2); + connect(m_pluginTimer, &PluginTimer::timeout, this, [this] { + foreach(AmperfiedModbusRtuConnection *connection, m_rtuConnections) { + qCDebug(dcAmperfied()) << "Updating connection" << connection->modbusRtuMaster() << connection->slaveId(); + connection->update(); + } + foreach(AmperfiedModbusTcpConnection *connection, m_tcpConnections) { + qCDebug(dcAmperfied()) << "Updating connection" << connection->hostAddress(); + connection->update(); + } + }); + m_pluginTimer->start(); + } +} + +void IntegrationPluginAmperfied::executeAction(ThingActionInfo *info) +{ + if (info->thing()->thingClassId() == energyControlThingClassId) { + AmperfiedModbusRtuConnection *connection = m_rtuConnections.value(info->thing()); + + if (info->action().actionTypeId() == energyControlPowerActionTypeId) { + bool power = info->action().paramValue(energyControlPowerActionPowerParamTypeId).toBool(); + ModbusRtuReply *reply = connection->setChargingCurrent(power ? info->thing()->stateValue(energyControlMaxChargingCurrentStateTypeId).toUInt() * 10 : 0); + connect(reply, &ModbusRtuReply::finished, info, [info, reply, power](){ + if (reply->error() == ModbusRtuReply::NoError) { + info->thing()->setStateValue(energyControlPowerStateTypeId, power); + info->finish(Thing::ThingErrorNoError); + } else { + qCWarning(dcAmperfied()) << "Error setting power:" << reply->error() << reply->errorString(); + info->finish(Thing::ThingErrorHardwareFailure); + } + }); + return; + } + + if (info->action().actionTypeId() == energyControlMaxChargingCurrentActionTypeId) { + bool power = info->thing()->stateValue(energyControlPowerStateTypeId).toBool(); + uint max = info->action().paramValue(energyControlMaxChargingCurrentActionMaxChargingCurrentParamTypeId).toUInt() * 10; + ModbusRtuReply *reply = connection->setChargingCurrent(power ? max : 0); + connect(reply, &ModbusRtuReply::finished, info, [info, reply, max](){ + if (reply->error() == ModbusRtuReply::NoError) { + info->thing()->setStateValue(energyControlMaxChargingCurrentStateTypeId, max); + info->finish(Thing::ThingErrorNoError); + } else { + qCWarning(dcAmperfied()) << "Error setting power:" << reply->error() << reply->errorString(); + info->finish(Thing::ThingErrorHardwareFailure); + } + }); + } + + } + + if (info->thing()->thingClassId() == connectHomeThingClassId) { + AmperfiedModbusTcpConnection *connection = m_tcpConnections.value(info->thing()); + + if (info->action().actionTypeId() == connectHomePowerActionTypeId) { + bool power = info->action().paramValue(connectHomePowerActionPowerParamTypeId).toBool(); + QModbusReply *reply = connection->setChargingCurrent(power ? info->thing()->stateValue(connectHomeMaxChargingCurrentStateTypeId).toUInt() * 10 : 0); + connect(reply, &QModbusReply::finished, info, [info, reply, power](){ + if (reply->error() == QModbusDevice::NoError) { + info->thing()->setStateValue(connectHomePowerStateTypeId, power); + info->finish(Thing::ThingErrorNoError); + } else { + qCWarning(dcAmperfied()) << "Error setting power:" << reply->error() << reply->errorString(); + info->finish(Thing::ThingErrorHardwareFailure); + } + }); + } + + if (info->action().actionTypeId() == connectHomeMaxChargingCurrentActionTypeId) { + bool power = info->thing()->stateValue(connectHomePowerStateTypeId).toBool(); + uint max = info->action().paramValue(connectHomeMaxChargingCurrentActionMaxChargingCurrentParamTypeId).toUInt() * 10; + QModbusReply *reply = connection->setChargingCurrent(power ? max : 0); + connect(reply, &QModbusReply::finished, info, [info, reply, max](){ + if (reply->error() == QModbusDevice::NoError) { + info->thing()->setStateValue(connectHomeMaxChargingCurrentStateTypeId, max); + info->finish(Thing::ThingErrorNoError); + } else { + qCWarning(dcAmperfied()) << "Error setting power:" << reply->error() << reply->errorString(); + info->finish(Thing::ThingErrorHardwareFailure); + } + }); + } + + } + +} + +void IntegrationPluginAmperfied::thingRemoved(Thing *thing) +{ + if (thing->thingClassId() == energyControlThingClassId) { + delete m_rtuConnections.take(thing); + } + + if (thing->thingClassId() == connectHomeThingClassId) { + delete m_tcpConnections.take(thing); + } + + if (myThings().isEmpty() && m_pluginTimer) { + hardwareManager()->pluginTimerManager()->unregisterTimer(m_pluginTimer); + m_pluginTimer = nullptr; + } +} + +void IntegrationPluginAmperfied::setupRtuConnection(ThingSetupInfo *info) +{ + Thing *thing = info->thing(); + ModbusRtuMaster *master = hardwareManager()->modbusRtuResource()->getModbusRtuMaster(thing->paramValue(energyControlThingRtuMasterParamTypeId).toUuid()); + quint16 slaveId = thing->paramValue(energyControlThingSlaveIdParamTypeId).toUInt(); + AmperfiedModbusRtuConnection *connection = new AmperfiedModbusRtuConnection(master, slaveId, thing); + + connect(connection, &AmperfiedModbusRtuConnection::reachableChanged, thing, [connection, thing](bool reachable){ + if (reachable) { + connection->initialize(); + } else { + thing->setStateValue(energyControlCurrentPowerStateTypeId, 0); + thing->setStateValue(energyControlConnectedStateTypeId, false); + } + }); + connect(connection, &AmperfiedModbusRtuConnection::initializationFinished, thing, [thing](bool success){ + if (success) { + thing->setStateValue(energyControlConnectedStateTypeId, true); + } + }); + + connect(connection, &AmperfiedModbusRtuConnection::initializationFinished, info, [this, info, connection](bool success){ + if (success) { + if (connection->version() < 0x0107) { + qCWarning(dcAmperfied()) << "We require at least version 1.0.8."; + info->finish(Thing::ThingErrorSetupFailed, QT_TR_NOOP("The firmware of this wallbox is too old. Please update the wallbox to at least firmware 1.0.7.")); + delete connection; + return; + } + m_rtuConnections.insert(info->thing(), connection); + info->finish(Thing::ThingErrorNoError); + } else { + info->finish(Thing::ThingErrorHardwareFailure, QT_TR_NOOP("The wallbox is not responding")); + } + }); + + connect(connection, &AmperfiedModbusRtuConnection::updateFinished, thing, [connection, thing](){ + qCDebug(dcAmperfied()) << "Updated:" << connection; + + if (connection->chargingCurrent() == 0) { + thing->setStateValue(energyControlPowerStateTypeId, false); + } else { + thing->setStateValue(energyControlPowerStateTypeId, true); + thing->setStateValue(energyControlMaxChargingCurrentStateTypeId, connection->chargingCurrent() / 10); + } + thing->setStateMinMaxValues(energyControlMaxChargingCurrentStateTypeId, connection->minChargingCurrent(), connection->maxChargingCurrent()); + thing->setStateValue(energyControlCurrentPowerStateTypeId, connection->currentPower()); + thing->setStateValue(energyControlTotalEnergyConsumedStateTypeId, connection->totalEnergy() / 1000.0); + thing->setStateValue(energyControlSessionEnergyStateTypeId, connection->sessionEnergy() / 1000.0); + switch (connection->chargingState()) { + case AmperfiedModbusRtuConnection::ChargingStateUndefined: + case AmperfiedModbusRtuConnection::ChargingStateA1: + case AmperfiedModbusRtuConnection::ChargingStateA2: + thing->setStateValue(energyControlPluggedInStateTypeId, false); + break; + case AmperfiedModbusRtuConnection::ChargingStateB1: + case AmperfiedModbusRtuConnection::ChargingStateB2: + case AmperfiedModbusRtuConnection::ChargingStateC1: + case AmperfiedModbusRtuConnection::ChargingStateC2: + thing->setStateValue(energyControlPluggedInStateTypeId, true); + break; + case AmperfiedModbusRtuConnection::ChargingStateDerating: + case AmperfiedModbusRtuConnection::ChargingStateE: + case AmperfiedModbusRtuConnection::ChargingStateError: + case AmperfiedModbusRtuConnection::ChargingStateF: + qCWarning(dcAmperfied()) << "Unhandled charging state:" << connection->chargingState(); + } + + int phaseCount = 0; + if (connection->currentL1() > 1) { + phaseCount++; + } + if (connection->currentL2() > 1) { + phaseCount++; + } + if (connection->currentL3() > 1) { + phaseCount++; + } + if (phaseCount > 0) { + thing->setStateValue(energyControlPhaseCountStateTypeId, phaseCount); + } + thing->setStateValue(energyControlChargingStateTypeId, phaseCount > 0); + }); + + connection->update(); + +} + +void IntegrationPluginAmperfied::setupTcpConnection(ThingSetupInfo *info) +{ + qCDebug(dcAmperfied()) << "setting up TCP connection"; + Thing *thing = info->thing(); + NetworkDeviceMonitor *monitor = m_monitors.value(info->thing()); + AmperfiedModbusTcpConnection *connection = new AmperfiedModbusTcpConnection(monitor->networkDeviceInfo().address(), 502, 1, info->thing()); + + connect(connection, &AmperfiedModbusTcpConnection::reachableChanged, thing, [connection, thing](bool reachable){ + if (reachable) { + connection->initialize(); + } else { + thing->setStateValue(connectHomeCurrentPowerStateTypeId, 0); + thing->setStateValue(connectHomeConnectedStateTypeId, false); + } + }); + + + connect(connection, &AmperfiedModbusTcpConnection::initializationFinished, info, [this, info, connection](bool success){ + if (success) { + if (connection->version() < 0x0107) { + qCWarning(dcAmperfied()) << "We require at least version 1.0.8."; + info->finish(Thing::ThingErrorSetupFailed, QT_TR_NOOP("The firmware of this wallbox is too old. Please update the wallbox to at least firmware 1.0.7.")); + delete connection; + return; + } + m_tcpConnections.insert(info->thing(), connection); + info->finish(Thing::ThingErrorNoError); + connection->update(); + } else { + info->finish(Thing::ThingErrorHardwareFailure, QT_TR_NOOP("The wallbox is not responding")); + } + }); + + connect(connection, &AmperfiedModbusTcpConnection::updateFinished, thing, [connection, thing](){ + qCDebug(dcAmperfied()) << "Updated:" << connection; + + thing->setStateValue(connectHomeConnectedStateTypeId, true); + + if (connection->chargingCurrent() == 0) { + thing->setStateValue(connectHomePowerStateTypeId, false); + } else { + thing->setStateValue(connectHomePowerStateTypeId, true); + thing->setStateValue(connectHomeMaxChargingCurrentStateTypeId, connection->chargingCurrent() / 10); + } + thing->setStateMinMaxValues(connectHomeMaxChargingCurrentStateTypeId, connection->minChargingCurrent(), connection->maxChargingCurrent()); + thing->setStateValue(connectHomeCurrentPowerStateTypeId, connection->currentPower()); + thing->setStateValue(connectHomeTotalEnergyConsumedStateTypeId, connection->totalEnergy() / 1000.0); + thing->setStateValue(connectHomeSessionEnergyStateTypeId, connection->sessionEnergy() / 1000.0); + switch (connection->chargingState()) { + case AmperfiedModbusTcpConnection::ChargingStateUndefined: + case AmperfiedModbusTcpConnection::ChargingStateA1: + case AmperfiedModbusTcpConnection::ChargingStateA2: + thing->setStateValue(connectHomePluggedInStateTypeId, false); + break; + case AmperfiedModbusTcpConnection::ChargingStateB1: + case AmperfiedModbusTcpConnection::ChargingStateB2: + case AmperfiedModbusTcpConnection::ChargingStateC1: + case AmperfiedModbusTcpConnection::ChargingStateC2: + thing->setStateValue(connectHomePluggedInStateTypeId, true); + break; + case AmperfiedModbusTcpConnection::ChargingStateDerating: + case AmperfiedModbusTcpConnection::ChargingStateE: + case AmperfiedModbusTcpConnection::ChargingStateError: + case AmperfiedModbusTcpConnection::ChargingStateF: + qCWarning(dcAmperfied()) << "Unhandled charging state:" << connection->chargingState(); + } + + int phaseCount = 0; + if (connection->currentL1() > 1) { + phaseCount++; + } + if (connection->currentL2() > 1) { + phaseCount++; + } + if (connection->currentL3() > 1) { + phaseCount++; + } + if (phaseCount > 0) { + thing->setStateValue(connectHomePhaseCountStateTypeId, phaseCount); + } + thing->setStateValue(connectHomeChargingStateTypeId, phaseCount > 0); + }); + + connection->connectDevice(); +} + + diff --git a/amperfied/integrationpluginamperfied.h b/amperfied/integrationpluginamperfied.h new file mode 100644 index 0000000..7a07935 --- /dev/null +++ b/amperfied/integrationpluginamperfied.h @@ -0,0 +1,73 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* +* Copyright 2013 - 2023, 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 INTEGRATIONPLUGINHEIDELBERG_H +#define INTEGRATIONPLUGINHEIDELBERG_H + +#include +#include +#include + +#include "extern-plugininfo.h" + +#include "amperfiedmodbusrtuconnection.h" +#include "amperfiedmodbustcpconnection.h" + +class IntegrationPluginAmperfied: public IntegrationPlugin +{ + Q_OBJECT + + Q_PLUGIN_METADATA(IID "io.nymea.IntegrationPlugin" FILE "integrationpluginamperfied.json") + Q_INTERFACES(IntegrationPlugin) + +public: + explicit IntegrationPluginAmperfied(); + + void discoverThings(ThingDiscoveryInfo *info) override; + void setupThing(ThingSetupInfo *info) override; + void postSetupThing(Thing *thing) override; + void executeAction(ThingActionInfo *info) override; + void thingRemoved(Thing *thing) override; + +private: + void setupRtuConnection(ThingSetupInfo *info); + void setupTcpConnection(ThingSetupInfo *info); + +private: + PluginTimer *m_pluginTimer = nullptr; + QHash m_rtuConnections; + QHash m_tcpConnections; + QHash m_monitors; + +}; + +#endif // INTEGRATIONPLUGINHEIDELBERG_H + + diff --git a/amperfied/integrationpluginamperfied.json b/amperfied/integrationpluginamperfied.json new file mode 100644 index 0000000..d53ba7e --- /dev/null +++ b/amperfied/integrationpluginamperfied.json @@ -0,0 +1,219 @@ +{ + "name": "amperfied", + "displayName": "Amperfied", + "id": "2c463ff6-eea8-4977-a0b7-28b70399925b", + "vendors": [ + { + "name": "amperfied", + "displayName": "Amperfied", + "id": "0f1d4317-fd3d-4f1e-b92a-d48df03d94e9", + "thingClasses": [ + { + "name": "energyControl", + "displayName": "Energy Control", + "id": "5b87b9ab-c78b-48c2-9f5f-5a4efebd2c58", + "createMethods": ["discovery", "user"], + "interfaces": ["evcharger", "smartmeterconsumer", "connectable"], + "paramTypes": [ + { + "id": "22aa91ef-d6bc-4ea3-b4c5-c2f773d86510", + "name":"rtuMaster", + "displayName": "Modbus RTU master", + "type": "QString", + "defaultValue": "" + }, + { + "id": "fb3a1559-2fb8-4cc5-9b88-bde1714c746d", + "name":"slaveId", + "displayName": "Modbus slave ID", + "type": "uint", + "minValue": 1, + "maxValue": 248, + "defaultValue": 1 + } + ], + "stateTypes": [ + { + "id": "ed520673-4474-4301-8665-47125e20b5c0", + "name": "connected", + "displayName": "Connected", + "type": "bool", + "defaultValue": false, + "cached": false + }, + { + "id": "22c107c6-a23b-40e4-918c-701bb0a9616e", + "name": "pluggedIn", + "displayName": "Plugged in", + "type": "bool", + "defaultValue": false, + "cached": false + }, + { + "id": "452e726a-256d-4e69-ac40-20f62c34e531", + "name": "charging", + "displayName": "Charging", + "type": "bool", + "defaultValue": false, + "cached": false + }, + { + "id": "a5254891-a60d-45b7-beee-a49688a09ca8", + "name": "phaseCount", + "displayName": "Connected phases", + "type": "uint", + "minValue": 1, + "maxValue": 3, + "defaultValue": 1 + }, + { + "id": "b7ea8449-c76f-4d42-8433-505f542abfd4", + "name": "currentPower", + "displayName": "Active power", + "type": "double", + "unit": "Watt", + "defaultValue": 0, + "cached": false + }, + { + "id": "87269ace-fa6b-44a1-83d3-b2e834982407", + "name": "totalEnergyConsumed", + "displayName": "Total consumed energy", + "type": "double", + "unit": "KiloWattHour", + "defaultValue": 0.0, + "cached": true + }, + { + "id": "bb119584-dec6-4bef-8b49-772feb8ca4dd", + "name": "power", + "displayName": "Charging enabled", + "displayNameAction": "Set charging enabled", + "type": "bool", + "defaultValue": false, + "writable": true + }, + { + "id": "7f7d729e-91e8-45c6-af40-442a47f63c23", + "name": "maxChargingCurrent", + "displayName": "Maximum charging current", + "displayNameAction": "Set maximum charging current", + "type": "uint", + "unit": "Ampere", + "minValue": 6, + "maxValue": 32, + "defaultValue": 6, + "writable": true + }, + { + "id": "6fa264a2-96f4-43d1-b89f-06494830f225", + "name": "sessionEnergy", + "displayName": "Session energy", + "type": "double", + "unit": "KiloWattHour", + "defaultValue": 0 + } + ] + }, + { + "name": "connectHome", + "displayName": "connect.home", + "id": "f8805308-1ddd-496c-bea3-ef9163357bfa", + "createMethods": ["discovery", "user"], + "interfaces": ["evcharger", "smartmeterconsumer", "connectable"], + "paramTypes": [ + { + "id": "b4b0556e-0d5d-4951-b5cd-e0c7986b8dcf", + "name":"macAddress", + "displayName": "MAC address", + "type": "QString", + "defaultValue": "" + } + ], + "stateTypes": [ + { + "id": "5ef1f3b5-d477-4458-a711-d3fa12a5fb75", + "name": "connected", + "displayName": "Connected", + "type": "bool", + "defaultValue": false, + "cached": false + }, + { + "id": "0ecb5575-2d6e-45e7-983d-af195aa1227f", + "name": "pluggedIn", + "displayName": "Plugged in", + "type": "bool", + "defaultValue": false, + "cached": false + }, + { + "id": "88605046-9a5f-4553-82dc-f5ba15be05d4", + "name": "charging", + "displayName": "Charging", + "type": "bool", + "defaultValue": false, + "cached": false + }, + { + "id": "50b3df7c-a633-42d6-a690-9063b0c244f0", + "name": "phaseCount", + "displayName": "Connected phases", + "type": "uint", + "minValue": 1, + "maxValue": 3, + "defaultValue": 1 + }, + { + "id": "6221212e-e21d-4006-bfdc-90a8a50b2587", + "name": "currentPower", + "displayName": "Active power", + "type": "double", + "unit": "Watt", + "defaultValue": 0, + "cached": false + }, + { + "id": "11531bb0-82e6-4d07-8d30-7682d538db68", + "name": "totalEnergyConsumed", + "displayName": "Total consumed energy", + "type": "double", + "unit": "KiloWattHour", + "defaultValue": 0.0, + "cached": true + }, + { + "id": "a109e222-86bd-4699-8ade-3da5a6304fa7", + "name": "power", + "displayName": "Charging enabled", + "displayNameAction": "Set charging enabled", + "type": "bool", + "defaultValue": false, + "writable": true + }, + { + "id": "9e114f85-6f66-4b78-8b03-5d6f191337ab", + "name": "maxChargingCurrent", + "displayName": "Maximum charging current", + "displayNameAction": "Set maximum charging current", + "type": "uint", + "unit": "Ampere", + "minValue": 6, + "maxValue": 32, + "defaultValue": 6, + "writable": true + }, + { + "id": "0a3fd1a6-b952-4dd1-95d1-25dfe3b0ce2f", + "name": "sessionEnergy", + "displayName": "Session energy", + "type": "double", + "unit": "KiloWattHour", + "defaultValue": 0 + } + ] + } + ] + } + ] +} diff --git a/amperfied/meta.json b/amperfied/meta.json new file mode 100644 index 0000000..08f1963 --- /dev/null +++ b/amperfied/meta.json @@ -0,0 +1,13 @@ +{ + "title": "Amperfied", + "tagline": "Connect Amperfied/Heidelberg wallboxes to nymea.", + "icon": "amperfeid.jpg", + "stability": "consumer", + "offline": true, + "technologies": [ + "network" + ], + "categories": [ + "energy" + ] +} diff --git a/amperfied/translations/2c463ff6-eea8-4977-a0b7-28b70399925b-en_US.ts b/amperfied/translations/2c463ff6-eea8-4977-a0b7-28b70399925b-en_US.ts new file mode 100644 index 0000000..3d4ed12 --- /dev/null +++ b/amperfied/translations/2c463ff6-eea8-4977-a0b7-28b70399925b-en_US.ts @@ -0,0 +1,177 @@ + + + + + IntegrationPluginAmperfied + + + No modbus RTU master with appropriate settings found. Please set up a modbus RTU master with a baudrate of 19200, 8 data bis, 1 stop bit and even parity first. + + + + + + The firmware of this wallbox is too old. Please update the wallbox to at least firmware 1.0.7. + + + + + + The wallbox is not responding + + + + + amperfied + + + + Active power + The name of the StateType ({6221212e-e21d-4006-bfdc-90a8a50b2587}) of ThingClass connectHome +---------- +The name of the StateType ({b7ea8449-c76f-4d42-8433-505f542abfd4}) of ThingClass energyControl + + + + + + Amperfied + The name of the vendor ({0f1d4317-fd3d-4f1e-b92a-d48df03d94e9}) +---------- +The name of the plugin amperfied ({2c463ff6-eea8-4977-a0b7-28b70399925b}) + + + + + + Charging + The name of the StateType ({88605046-9a5f-4553-82dc-f5ba15be05d4}) of ThingClass connectHome +---------- +The name of the StateType ({452e726a-256d-4e69-ac40-20f62c34e531}) of ThingClass energyControl + + + + + + + + Charging enabled + The name of the ParamType (ThingClass: connectHome, ActionType: power, ID: {a109e222-86bd-4699-8ade-3da5a6304fa7}) +---------- +The name of the StateType ({a109e222-86bd-4699-8ade-3da5a6304fa7}) of ThingClass connectHome +---------- +The name of the ParamType (ThingClass: energyControl, ActionType: power, ID: {bb119584-dec6-4bef-8b49-772feb8ca4dd}) +---------- +The name of the StateType ({bb119584-dec6-4bef-8b49-772feb8ca4dd}) of ThingClass energyControl + + + + + + Connected + The name of the StateType ({5ef1f3b5-d477-4458-a711-d3fa12a5fb75}) of ThingClass connectHome +---------- +The name of the StateType ({ed520673-4474-4301-8665-47125e20b5c0}) of ThingClass energyControl + + + + + + Connected phases + The name of the StateType ({50b3df7c-a633-42d6-a690-9063b0c244f0}) of ThingClass connectHome +---------- +The name of the StateType ({a5254891-a60d-45b7-beee-a49688a09ca8}) of ThingClass energyControl + + + + + Energy Control + The name of the ThingClass ({5b87b9ab-c78b-48c2-9f5f-5a4efebd2c58}) + + + + + MAC address + The name of the ParamType (ThingClass: connectHome, Type: thing, ID: {b4b0556e-0d5d-4951-b5cd-e0c7986b8dcf}) + + + + + + + + Maximum charging current + The name of the ParamType (ThingClass: connectHome, ActionType: maxChargingCurrent, ID: {9e114f85-6f66-4b78-8b03-5d6f191337ab}) +---------- +The name of the StateType ({9e114f85-6f66-4b78-8b03-5d6f191337ab}) of ThingClass connectHome +---------- +The name of the ParamType (ThingClass: energyControl, ActionType: maxChargingCurrent, ID: {7f7d729e-91e8-45c6-af40-442a47f63c23}) +---------- +The name of the StateType ({7f7d729e-91e8-45c6-af40-442a47f63c23}) of ThingClass energyControl + + + + + Modbus RTU master + The name of the ParamType (ThingClass: energyControl, Type: thing, ID: {22aa91ef-d6bc-4ea3-b4c5-c2f773d86510}) + + + + + Modbus slave ID + The name of the ParamType (ThingClass: energyControl, Type: thing, ID: {fb3a1559-2fb8-4cc5-9b88-bde1714c746d}) + + + + + + Plugged in + The name of the StateType ({0ecb5575-2d6e-45e7-983d-af195aa1227f}) of ThingClass connectHome +---------- +The name of the StateType ({22c107c6-a23b-40e4-918c-701bb0a9616e}) of ThingClass energyControl + + + + + + Session energy + The name of the StateType ({0a3fd1a6-b952-4dd1-95d1-25dfe3b0ce2f}) of ThingClass connectHome +---------- +The name of the StateType ({6fa264a2-96f4-43d1-b89f-06494830f225}) of ThingClass energyControl + + + + + + Set charging enabled + The name of the ActionType ({a109e222-86bd-4699-8ade-3da5a6304fa7}) of ThingClass connectHome +---------- +The name of the ActionType ({bb119584-dec6-4bef-8b49-772feb8ca4dd}) of ThingClass energyControl + + + + + + Set maximum charging current + The name of the ActionType ({9e114f85-6f66-4b78-8b03-5d6f191337ab}) of ThingClass connectHome +---------- +The name of the ActionType ({7f7d729e-91e8-45c6-af40-442a47f63c23}) of ThingClass energyControl + + + + + + Total consumed energy + The name of the StateType ({11531bb0-82e6-4d07-8d30-7682d538db68}) of ThingClass connectHome +---------- +The name of the StateType ({87269ace-fa6b-44a1-83d3-b2e834982407}) of ThingClass energyControl + + + + + connect.home + The name of the ThingClass ({f8805308-1ddd-496c-bea3-ef9163357bfa}) + + + + diff --git a/debian/control b/debian/control index f129778..18df424 100644 --- a/debian/control +++ b/debian/control @@ -78,6 +78,15 @@ Description: nymea integration plugin for alpha innotec heat pumps This package contains the nymea integration plugin for alpha innotec head pumps. +Package: nymea-plugin-amperfied +Architecture: any +Section: libs +Depends: ${shlibs:Depends}, + ${misc:Depends}, +Description: nymea integration plugin for Amperfeid/Heidelberg wallboxes + This package contains the nymea integration plugin for Amperfeid/Heidelberg wallboxes. + + Package: nymea-plugin-bgetech Architecture: any Multi-Arch: same diff --git a/debian/nymea-plugin-amperfied.install.in b/debian/nymea-plugin-amperfied.install.in new file mode 100644 index 0000000..a34b904 --- /dev/null +++ b/debian/nymea-plugin-amperfied.install.in @@ -0,0 +1,2 @@ +usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginamperfied.so +amperfied/translations/*qm usr/share/nymea/translations/ diff --git a/nymea-plugins-modbus.pro b/nymea-plugins-modbus.pro index 5387f04..281c07a 100644 --- a/nymea-plugins-modbus.pro +++ b/nymea-plugins-modbus.pro @@ -6,6 +6,7 @@ SUBDIRS += nymea-modbus-cli libnymea-modbus libnymea-sunspec PLUGIN_DIRS = \ alphainnotec \ + amperfied \ bgetech \ drexelundweiss \ huawei \