From a255a67d5127a5bb4d146f220ecaf8bd54757cc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20St=C3=BCrz?= Date: Fri, 17 May 2024 11:57:59 +0200 Subject: [PATCH] New plugin Inro: Add support for PANTABOX --- debian/control | 11 + debian/nymea-plugin-inro.install.in | 2 + inro/README.md | 25 ++ inro/docs/inro-app-modbus-active.jpg | Bin 0 -> 13397 bytes inro/docs/inro-app-profiles.jpg | Bin 0 -> 64454 bytes inro/inro.png | Bin 0 -> 50145 bytes inro/inro.pro | 15 + inro/integrationplugininro.cpp | 329 ++++++++++++++++++ inro/integrationplugininro.h | 65 ++++ inro/integrationplugininro.json | 155 +++++++++ inro/meta.json | 14 + inro/pantabox-registers.json | 144 ++++++++ inro/pantaboxdiscovery.cpp | 152 ++++++++ inro/pantaboxdiscovery.h | 79 +++++ ...e2751951-4d53-4156-bd1a-a54c39e5c6cc-de.ts | 170 +++++++++ ...51951-4d53-4156-bd1a-a54c39e5c6cc-en_US.ts | 170 +++++++++ nymea-plugins-modbus.pro | 1 + 17 files changed, 1332 insertions(+) create mode 100644 debian/nymea-plugin-inro.install.in create mode 100644 inro/README.md create mode 100644 inro/docs/inro-app-modbus-active.jpg create mode 100644 inro/docs/inro-app-profiles.jpg create mode 100644 inro/inro.png create mode 100644 inro/inro.pro create mode 100644 inro/integrationplugininro.cpp create mode 100644 inro/integrationplugininro.h create mode 100644 inro/integrationplugininro.json create mode 100644 inro/meta.json create mode 100644 inro/pantabox-registers.json create mode 100644 inro/pantaboxdiscovery.cpp create mode 100644 inro/pantaboxdiscovery.h create mode 100644 inro/translations/e2751951-4d53-4156-bd1a-a54c39e5c6cc-de.ts create mode 100644 inro/translations/e2751951-4d53-4156-bd1a-a54c39e5c6cc-en_US.ts diff --git a/debian/control b/debian/control index 05f8045..5eec3ae 100644 --- a/debian/control +++ b/debian/control @@ -127,6 +127,17 @@ Description: nymea integration plugin for inepro Metering Modbus based energy me made by inepro Metering. +Package: nymea-plugin-inro +Architecture: any +Multi-Arch: same +Section: libs +Depends: ${shlibs:Depends}, + ${misc:Depends}, +Description: nymea integration plugin for INRO PANTABOX chargers + This package contains the nymea integration plugin for Modbus based PANTABOX + support. + + Package: nymea-plugin-huawei Architecture: any Multi-Arch: same diff --git a/debian/nymea-plugin-inro.install.in b/debian/nymea-plugin-inro.install.in new file mode 100644 index 0000000..d507c35 --- /dev/null +++ b/debian/nymea-plugin-inro.install.in @@ -0,0 +1,2 @@ +usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationplugininro.so +inro/translations/*qm usr/share/nymea/translations/ diff --git a/inro/README.md b/inro/README.md new file mode 100644 index 0000000..df973b1 --- /dev/null +++ b/inro/README.md @@ -0,0 +1,25 @@ +# INRO PANTABOX + +Connects nymea to INRO PANTABOX wallboxes. + +## Requirements + +In order to connect your PANTABOX to the nymea system, the charger must be in the same network as the nymea system. The nymea server uses the Modbus TCP connection to connect to the wallbox. + +Modbus TCP is available since firmware version `V1.13.6` of the PANTABOX. Please make sure your PANTABOX is up to date before setting up the charger in nymea. + +Once the network connection has been established, use the original [PANTABOX app](https://www.pantabox.de/Informationen/App/) in order to enable the `Modbus TCP` profile. + +![Loading profiles](docs/inro-app-profiles.jpg) + +![Modbus TCP profile](docs/inro-app-modbus-active.jpg) + +Once the `Modbus TCP` profile has been enabled, the PANTABOX can be discovered in the network. The default port is `502` and the default slave ID is `1`. + +## Settings + +In the thing settings can be defined, which phases are connected to the wallbox. This information is important for the energy management in order to be able to have an overload protection. + +## More + +https://www.pantabox.de/ diff --git a/inro/docs/inro-app-modbus-active.jpg b/inro/docs/inro-app-modbus-active.jpg new file mode 100644 index 0000000000000000000000000000000000000000..28de078dd91504446640895d35db580cac88bdcc GIT binary patch literal 13397 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%0D@i&M#yGqEvXTb?>e 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 UEVLh8$^ZZW07*qoM6N<$f|`u-KL7v# literal 0 HcmV?d00001 diff --git a/inro/inro.pro b/inro/inro.pro new file mode 100644 index 0000000..8abdb2d --- /dev/null +++ b/inro/inro.pro @@ -0,0 +1,15 @@ +include(../plugins.pri) + +MODBUS_CONNECTIONS += pantabox-registers.json + +MODBUS_TOOLS_CONFIG += VERBOSE + +include(../modbus.pri) + +HEADERS += \ + integrationplugininro.h \ + pantaboxdiscovery.h + +SOURCES += \ + integrationplugininro.cpp \ + pantaboxdiscovery.cpp diff --git a/inro/integrationplugininro.cpp b/inro/integrationplugininro.cpp new file mode 100644 index 0000000..5eda2bc --- /dev/null +++ b/inro/integrationplugininro.cpp @@ -0,0 +1,329 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* +* Copyright 2013 - 2024, 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 "integrationplugininro.h" +#include "plugininfo.h" + +#include +#include +#include + +#include "pantaboxdiscovery.h" + +IntegrationPluginInro::IntegrationPluginInro() +{ + +} + +void IntegrationPluginInro::discoverThings(ThingDiscoveryInfo *info) +{ + + if (!hardwareManager()->networkDeviceDiscovery()->available()) { + qCWarning(dcInro()) << "The network discovery is not available on this platform."; + info->finish(Thing::ThingErrorUnsupportedFeature, QT_TR_NOOP("The network device discovery is not available.")); + return; + } + + PantaboxDiscovery *discovery = new PantaboxDiscovery(hardwareManager()->networkDeviceDiscovery(), info); + connect(discovery, &PantaboxDiscovery::discoveryFinished, info, [this, info, discovery](){ + + foreach (const PantaboxDiscovery::Result &result, discovery->results()) { + QString title = QString("PANTABOX - %1").arg(result.serialNumber); + QString description = QString("%1 (%2)").arg(result.networkDeviceInfo.macAddress(), result.networkDeviceInfo.address().toString()); + ThingDescriptor descriptor(pantaboxThingClassId, title, description); + + // Check if we already have set up this device + Things existingThings = myThings().filterByParam(pantaboxThingMacAddressParamTypeId, result.networkDeviceInfo.macAddress()); + if (existingThings.count() == 1) { + qCDebug(dcInro()) << "This PANTABOX already exists in the system:" << result.networkDeviceInfo; + descriptor.setThingId(existingThings.first()->id()); + } + + ParamList params; + params << Param(pantaboxThingMacAddressParamTypeId, result.networkDeviceInfo.macAddress()); + params << Param(pantaboxThingSerialNumberParamTypeId, result.serialNumber); + descriptor.setParams(params); + info->addThingDescriptor(descriptor); + } + + info->finish(Thing::ThingErrorNoError); + }); + + discovery->startDiscovery(); +} + +void IntegrationPluginInro::setupThing(ThingSetupInfo *info) +{ + Thing *thing = info->thing(); + qCDebug(dcInro()) << "Setup thing" << thing << thing->params(); + + if (m_connections.contains(thing)) { + qCDebug(dcInro()) << "Reconfiguring existing thing" << thing->name(); + m_connections.take(thing)->deleteLater(); + + if (m_monitors.contains(thing)) { + hardwareManager()->networkDeviceDiscovery()->unregisterMonitor(m_monitors.take(thing)); + } + } + + MacAddress macAddress = MacAddress(thing->paramValue(pantaboxThingMacAddressParamTypeId).toString()); + if (!macAddress.isValid()) { + qCWarning(dcInro()) << "The configured mac address is not valid" << thing->params(); + info->finish(Thing::ThingErrorInvalidParameter, QT_TR_NOOP("The MAC address is not known. Please reconfigure the thing.")); + return; + } + + NetworkDeviceMonitor *monitor = hardwareManager()->networkDeviceDiscovery()->registerMonitor(macAddress); + m_monitors.insert(thing, monitor); + + connect(info, &ThingSetupInfo::aborted, monitor, [=](){ + if (m_monitors.contains(thing)) { + qCDebug(dcInro()) << "Unregistering monitor because setup has been aborted."; + hardwareManager()->networkDeviceDiscovery()->unregisterMonitor(m_monitors.take(thing)); + } + }); + + // Only make sure the connection is working in the initial setup, otherwise we let the monitor do the work + if (info->isInitialSetup()) { + // Continue with setup only if we know that the network device is reachable + if (monitor->reachable()) { + setupConnection(info); + } else { + // otherwise wait until we reach the networkdevice before setting up the device + qCDebug(dcInro()) << "Network device" << thing->name() << "is not reachable yet. Continue with the setup once reachable."; + connect(monitor, &NetworkDeviceMonitor::reachableChanged, info, [=](bool reachable){ + if (reachable) { + qCDebug(dcInro()) << "Network device" << thing->name() << "is now reachable. Continue with the setup..."; + setupConnection(info); + } + }); + } + } else { + setupConnection(info); + } +} + +void IntegrationPluginInro::postSetupThing(Thing *thing) +{ + qCDebug(dcInro()) << "Post setup thing" << thing->name(); + if (!m_refreshTimer) { + m_refreshTimer = hardwareManager()->pluginTimerManager()->registerTimer(2); + connect(m_refreshTimer, &PluginTimer::timeout, this, [this] { + foreach (PantaboxModbusTcpConnection *connection, m_connections) { + if (connection->reachable()) { + connection->update(); + } + } + }); + + qCDebug(dcInro()) << "Starting refresh timer..."; + m_refreshTimer->start(); + } +} + +void IntegrationPluginInro::executeAction(ThingActionInfo *info) +{ + if (info->thing()->thingClassId() == pantaboxThingClassId) { + + PantaboxModbusTcpConnection *connection = m_connections.value(info->thing()); + + if (!connection->reachable()) { + qCWarning(dcInro()) << "Cannot execute action. The PANTABOX is not reachable"; + info->finish(Thing::ThingErrorHardwareNotAvailable); + return; + } + + if (info->action().actionTypeId() == pantaboxPowerActionTypeId) { + bool power = info->action().paramValue(pantaboxPowerActionPowerParamTypeId).toBool(); + qCDebug(dcInro()) << "PANTABOX: Set power" << (power ? 1 : 0); + + QModbusReply *reply = connection->setChargingEnabled(power ? 1 : 0); + if (!reply) { + qCWarning(dcInro()) << "Execute action failed because the reply could not be created."; + info->finish(Thing::ThingErrorHardwareFailure); + return; + } + + connect(reply, &QModbusReply::finished, reply, &QModbusReply::deleteLater); + connect(reply, &QModbusReply::finished, info, [info, reply, power](){ + if (reply->error() == QModbusDevice::NoError) { + info->thing()->setStateValue(pantaboxPowerStateTypeId, power); + qCDebug(dcInro()) << "PANTABOX: Set power finished successfully"; + info->finish(Thing::ThingErrorNoError); + } else { + qCWarning(dcInro()) << "Error setting power:" << reply->error() << reply->errorString(); + info->finish(Thing::ThingErrorHardwareFailure); + } + }); + return; + } + + if (info->action().actionTypeId() == pantaboxMaxChargingCurrentActionTypeId) { + quint16 chargingCurrent = info->action().paramValue(pantaboxMaxChargingCurrentActionMaxChargingCurrentParamTypeId).toUInt(); + qCDebug(dcInro()) << "PANTABOX: Set max charging current" << chargingCurrent << "A"; + + QModbusReply *reply = connection->setMaxChargingCurrent(chargingCurrent); + if (!reply) { + qCWarning(dcInro()) << "Execute action failed because the reply could not be created."; + info->finish(Thing::ThingErrorHardwareFailure); + return; + } + + connect(reply, &QModbusReply::finished, reply, &QModbusReply::deleteLater); + connect(reply, &QModbusReply::finished, info, [info, reply, chargingCurrent](){ + if (reply->error() == QModbusDevice::NoError) { + info->thing()->setStateValue(pantaboxMaxChargingCurrentStateTypeId, chargingCurrent); + qCDebug(dcInro()) << "PANTABOX: Set max charging current finished successfully"; + info->finish(Thing::ThingErrorNoError); + } else { + qCWarning(dcInro()) << "Error setting charging current:" << reply->error() << reply->errorString(); + info->finish(Thing::ThingErrorHardwareFailure); + } + }); + return; + } + } +} + +void IntegrationPluginInro::thingRemoved(Thing *thing) +{ + qCDebug(dcInro()) << "Thing removed" << thing->name(); + + if (m_connections.contains(thing)) { + PantaboxModbusTcpConnection *connection = m_connections.take(thing); + connection->disconnectDevice(); + connection->deleteLater(); + } + + // Unregister related hardware resources + if (m_monitors.contains(thing)) + hardwareManager()->networkDeviceDiscovery()->unregisterMonitor(m_monitors.take(thing)); + + if (myThings().isEmpty() && m_refreshTimer) { + qCDebug(dcInro()) << "Stopping reconnect timer"; + hardwareManager()->pluginTimerManager()->unregisterTimer(m_refreshTimer); + m_refreshTimer = nullptr; + } +} + +void IntegrationPluginInro::setupConnection(ThingSetupInfo *info) +{ + Thing *thing = info->thing(); + NetworkDeviceMonitor *monitor = m_monitors.value(thing); + + PantaboxModbusTcpConnection *connection = new PantaboxModbusTcpConnection(monitor->networkDeviceInfo().address(), 502, 1, this); + connect(info, &ThingSetupInfo::aborted, connection, &PantaboxModbusTcpConnection::deleteLater); + + // Monitor reachability + connect(monitor, &NetworkDeviceMonitor::reachableChanged, thing, [=](bool reachable){ + if (!thing->setupComplete()) + return; + + qCDebug(dcInro()) << "Network device monitor for" << thing->name() << (reachable ? "is now reachable" : "is not reachable any more" ); + if (reachable && !thing->stateValue("connected").toBool()) { + connection->modbusTcpMaster()->setHostAddress(monitor->networkDeviceInfo().address()); + connection->connectDevice(); + } else if (!reachable) { + // Note: We disable autoreconnect explicitly and we will + // connect the device once the monitor says it is reachable again + connection->disconnectDevice(); + } + }); + + // Connection reachability + connect(connection, &PantaboxModbusTcpConnection::reachableChanged, thing, [thing, connection](bool reachable){ + qCInfo(dcInro()) << "Reachable changed to" << reachable << "for" << thing; + thing->setStateValue("connected", reachable); + + if (!reachable) { + // Reset energy live values on disconnected + thing->setStateValue(pantaboxCurrentPowerStateTypeId, 0); + } else { + thing->setStateValue(pantaboxModbusTcpVersionStateTypeId, PantaboxDiscovery::modbusVersionToString(connection->modbusTcpVersion())); + } + }); + + connect(connection, &PantaboxModbusTcpConnection::updateFinished, thing, [thing, connection](){ + qCDebug(dcInro()) << "Update finished for" << thing; + qCDebug(dcInro()) << connection; + + QString chargingStateString; + switch(connection->chargingState()) { + case PantaboxModbusTcpConnection::ChargingStateA: + chargingStateString = "A"; + break; + case PantaboxModbusTcpConnection::ChargingStateB: + chargingStateString = "B"; + break; + case PantaboxModbusTcpConnection::ChargingStateC: + chargingStateString = "C"; + break; + case PantaboxModbusTcpConnection::ChargingStateD: + chargingStateString = "D"; + break; + case PantaboxModbusTcpConnection::ChargingStateE: + chargingStateString = "E"; + break; + case PantaboxModbusTcpConnection::ChargingStateF: + chargingStateString = "F"; + break; + } + thing->setStateValue(pantaboxChargingStateStateTypeId, chargingStateString); + + // A: not connected + // B: connected, not charging + // C: connected, charging + // D: ventilation required + // E: F: fault/error + thing->setStateValue(pantaboxPluggedInStateTypeId, connection->chargingState() >= PantaboxModbusTcpConnection::ChargingStateB); + thing->setStateValue(pantaboxChargingStateTypeId, connection->chargingState() >= PantaboxModbusTcpConnection::ChargingStateC); + thing->setStateValue(pantaboxCurrentPowerStateTypeId, connection->currentPower()); // W + thing->setStateValue(pantaboxTotalEnergyConsumedStateTypeId, connection->chargedEnergy() / 1000.0); // Wh + thing->setStateMaxValue(pantaboxMaxChargingCurrentActionTypeId, connection->maxPossibleChargingCurrent()); + + // Phase count is a setting, since we don't get the information from the device. + // Maybe we could assume the from current power and set charging current how many phases get used, + // but we could not tell which pashes are active. + + Electricity::Phases phases = Electricity::convertPhasesFromString(thing->setting(pantaboxSettingsPhasesParamTypeId).toString()); + thing->setStateValue(pantaboxPhaseCountStateTypeId, Electricity::getPhaseCount(phases)); + thing->setStateValue(pantaboxUsedPhasesStateTypeId, thing->setting(pantaboxSettingsPhasesParamTypeId).toString()); + + }); + + m_connections.insert(thing, connection); + info->finish(Thing::ThingErrorNoError); + + qCDebug(dcInro()) << "Setting up PANTABOX finished successfully" << monitor->networkDeviceInfo().address().toString(); + + // Connect reight the way if the monitor indicates reachable, otherwise the connect will handle the connect later + if (monitor->reachable()) + connection->connectDevice(); +} diff --git a/inro/integrationplugininro.h b/inro/integrationplugininro.h new file mode 100644 index 0000000..3267bdb --- /dev/null +++ b/inro/integrationplugininro.h @@ -0,0 +1,65 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* +* Copyright 2013 - 2024, 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 INTEGRATIONPLUGININRO_H +#define INTEGRATIONPLUGININRO_H + +#include +#include +#include + +#include "extern-plugininfo.h" +#include "pantaboxmodbustcpconnection.h" + +class IntegrationPluginInro: public IntegrationPlugin +{ + Q_OBJECT + + Q_PLUGIN_METADATA(IID "io.nymea.IntegrationPlugin" FILE "integrationplugininro.json") + Q_INTERFACES(IntegrationPlugin) + +public: + explicit IntegrationPluginInro(); + + 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: + PluginTimer *m_refreshTimer = nullptr; + QHash m_connections; + QHash m_monitors; + + void setupConnection(ThingSetupInfo *info); +}; + +#endif // INTEGRATIONPLUGININRO_H diff --git a/inro/integrationplugininro.json b/inro/integrationplugininro.json new file mode 100644 index 0000000..d5e1962 --- /dev/null +++ b/inro/integrationplugininro.json @@ -0,0 +1,155 @@ +{ + "name": "inro", + "displayName": "INRO", + "id": "e2751951-4d53-4156-bd1a-a54c39e5c6cc", + "vendors": [ + { + "name": "inro", + "displayName": "INRO Elektrotechnik GmbH", + "id": "53669eec-4e67-444d-973f-40668aaa37a6", + "thingClasses": [ + { + "name": "pantabox", + "displayName": "PANTABOX", + "id": "6de119fb-a579-4a88-9903-f05aac167b19", + "createMethods": ["discovery", "user"], + "interfaces": ["evcharger", "smartmeterconsumer", "connectable"], + "paramTypes": [ + { + "id": "a3bc042c-0613-40a9-867a-3482d4d0901e", + "name":"macAddress", + "displayName": "MAC address", + "type": "QString", + "defaultValue": "", + "readOnly": true + }, + { + "id": "064e393b-b921-4c9c-9127-8b03852d9687", + "name":"serialNumber", + "displayName": "Serial number", + "type": "QString", + "defaultValue": "", + "readOnly": true + } + ], + "settingsTypes": [ + { + "id": "78225651-565c-49f7-8610-c067faf8822a", + "name": "phases", + "displayName": "Phases connected", + "type": "QString", + "allowedValues": ["A", "B", "C", "AB", "BC", "AC", "ABC"], + "defaultValue": "ABC" + } + ], + "stateTypes": [ + { + "id": "345909fc-22e2-44bb-a063-26dd8e30793b", + "name": "connected", + "displayName": "Connected", + "type": "bool", + "defaultValue": false, + "cached": false + }, + { + "id": "bb2f4ff0-f7ca-4ffd-a2f1-73f9b230a1eb", + "name": "pluggedIn", + "displayName": "Plugged in", + "type": "bool", + "defaultValue": false, + "cached": false + }, + { + "id": "5a606c6a-030c-4d55-9700-723c9c859c7f", + "name": "charging", + "displayName": "Charging", + "type": "bool", + "defaultValue": false, + "cached": false + }, + { + "id": "969eb83e-a044-46f2-9aab-f113e2cd7d4d", + "name": "chargingState", + "displayName": "Charging state", + "type": "QString", + "possibleValues": ["A", "B", "C", "D", "E", "F"], + "defaultValue": "A", + "cached": false + }, + { + "id": "e23181a7-0747-4ff2-8b10-90256a8377b3", + "name": "currentPower", + "displayName": "Active power", + "type": "double", + "unit": "Watt", + "defaultValue": 0, + "cached": false + }, + { + "id": "b6e309d4-d480-477a-88f1-79e00bca450a", + "name": "totalEnergyConsumed", + "displayName": "Total consumed energy", + "type": "double", + "unit": "KiloWattHour", + "defaultValue": 0.0, + "cached": true + }, + { + "id": "d885ee23-8c50-48f1-82a9-72e0e92715ac", + "name": "power", + "displayName": "Charging enabled", + "displayNameAction": "Set charging enabled", + "type": "bool", + "defaultValue": false, + "writable": true + }, + { + "id": "db02bf36-1ce2-40b4-bf88-8a4e3842a63b", + "name": "maxChargingCurrent", + "displayName": "Maximum charging current", + "displayNameAction": "Set maximum charging current", + "type": "uint", + "unit": "Ampere", + "minValue": 6, + "maxValue": 16, + "defaultValue": 6, + "writable": true + }, + { + "id": "95719ca2-bda2-4eb4-b76d-e54d7a98dfdb", + "name": "sessionEnergy", + "displayName": "Session energy", + "type": "double", + "unit": "KiloWattHour", + "defaultValue": 0 + }, + { + "id": "5cc3aa90-c83f-4453-9f22-5ef408e847a0", + "name": "phaseCount", + "displayName": "Active phases", + "type": "uint", + "minValue": 1, + "maxValue": 3, + "defaultValue": 3 + }, + { + "id": "db8d452a-8459-429b-b8f1-d73c805bd857", + "name": "usedPhases", + "displayName": "Used phases", + "type": "QString", + "possibleValues": ["A", "B", "C", "AB", "BC", "AC", "ABC"], + "defaultValue": "ABC" + }, + { + "id": "c454b965-8b21-491e-85e9-71068575c5e1", + "name": "modbusTcpVersion", + "displayName": "Modbus TCP version", + "type": "QString", + "defaultValue": "" + } + ] + } + ] + } + ] +} diff --git a/inro/meta.json b/inro/meta.json new file mode 100644 index 0000000..7a2f39c --- /dev/null +++ b/inro/meta.json @@ -0,0 +1,14 @@ +{ + "title": "INRO", + "tagline": "Connect INRO PANTABOX wallboxes to nymea.", + "icon": "inro.png", + "stability": "consumer", + "offline": true, + "technologies": [ + "network", + "modbus" + ], + "categories": [ + "energy" + ] +} diff --git a/inro/pantabox-registers.json b/inro/pantabox-registers.json new file mode 100644 index 0000000..05ec69f --- /dev/null +++ b/inro/pantabox-registers.json @@ -0,0 +1,144 @@ +{ + "className": "Pantabox", + "protocol": "TCP", + "endianness": "LittleEndian", + "errorLimitUntilNotReachable": 2, + "checkReachableRegister": "chargingState", + "blocks": [ ], + "enums": [ + { + "name": "ChargingState", + "values": [ + { + "key": "A", + "value": 65 + }, + { + "key": "B", + "value": 66 + }, + { + "key": "C", + "value": 67 + }, + { + "key": "D", + "value": 68 + }, + { + "key": "E", + "value": 69 + }, + { + "key": "F", + "value": 70 + } + ] + } + ], + "registers": [ + { + "id": "serialNumber", + "address": 256, + "size": 2, + "type": "uint32", + "registerType": "inputRegister", + "description": "Serial number (hex)", + "readSchedule": "init", + "defaultValue": "0", + "access": "RO" + }, + { + "id": "modbusTcpVersion", + "address": 258, + "size": 2, + "type": "uint32", + "registerType": "inputRegister", + "description": "ModbusTCP version", + "readSchedule": "init", + "defaultValue": "0", + "access": "RO" + }, + { + "id": "chargingState", + "address": 512, + "size": 1, + "type": "uint16", + "registerType": "inputRegister", + "description": "Charging state", + "enum": "ChargingState", + "readSchedule": "update", + "defaultValue": "ChargingStateA", + "access": "RO" + }, + { + "id": "currentPower", + "address": 513, + "size": 2, + "type": "uint32", + "registerType": "inputRegister", + "description": "Current charging power", + "unit": "W", + "readSchedule": "update", + "defaultValue": "0", + "access": "RO" + }, + { + "id": "chargedEnergy", + "address": 515, + "size": 2, + "type": "uint32", + "registerType": "inputRegister", + "description": "Charged energy", + "unit": "Wh", + "readSchedule": "update", + "defaultValue": "0", + "access": "RO" + }, + { + "id": "maxPossibleChargingCurrent", + "address": 517, + "size": 1, + "type": "uint16", + "registerType": "inputRegister", + "description": "Maximal possible charging current (adapter)", + "unit": "A", + "readSchedule": "update", + "defaultValue": "6", + "access": "RO" + }, + { + "id": "chargingCurrent", + "address": 518, + "size": 1, + "type": "uint16", + "registerType": "inputRegister", + "description": "Actual charging current", + "unit": "A", + "readSchedule": "update", + "defaultValue": "0", + "access": "RO" + }, + { + "id": "chargingEnabled", + "address": 768, + "size": 1, + "type": "uint16", + "readSchedule": "update", + "registerType": "holdingRegister", + "description": "Charging enabled (1) / disabled (0)", + "defaultValue": 0, + "access": "RW" + }, + { + "id": "maxChargingCurrent", + "address": 769, + "size": 1, + "type": "uint16", + "readSchedule": "update", + "registerType": "holdingRegister", + "description": "Max charging current", + "access": "RW" + } + ] +} diff --git a/inro/pantaboxdiscovery.cpp b/inro/pantaboxdiscovery.cpp new file mode 100644 index 0000000..7c6ccad --- /dev/null +++ b/inro/pantaboxdiscovery.cpp @@ -0,0 +1,152 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* +* Copyright 2013 - 2024, 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 "pantaboxdiscovery.h" +#include "extern-plugininfo.h" + +PantaboxDiscovery::PantaboxDiscovery(NetworkDeviceDiscovery *networkDeviceDiscovery, QObject *parent) + : QObject{parent}, + m_networkDeviceDiscovery{networkDeviceDiscovery} +{ + +} + +QList PantaboxDiscovery::results() const +{ + return m_results; +} + +QString PantaboxDiscovery::modbusVersionToString(quint32 value) +{ + quint16 modbusVersionMinor = (value >> 8) & 0xffff; + quint16 modbusVersionMajor = value & 0xffff; + return QString("%1.%2").arg(modbusVersionMajor).arg(modbusVersionMinor); +} + +void PantaboxDiscovery::startDiscovery() +{ + qCInfo(dcInro()) << "Discovery: Start searching for PANTABOX wallboxes in the network..."; + m_startDateTime = QDateTime::currentDateTime(); + + NetworkDeviceDiscoveryReply *discoveryReply = m_networkDeviceDiscovery->discover(); + connect(discoveryReply, &NetworkDeviceDiscoveryReply::networkDeviceInfoAdded, this, &PantaboxDiscovery::checkNetworkDevice); + connect(discoveryReply, &NetworkDeviceDiscoveryReply::finished, discoveryReply, &NetworkDeviceDiscoveryReply::deleteLater); + connect(discoveryReply, &NetworkDeviceDiscoveryReply::finished, this, [=](){ + // Finish with some delay so the last added network device information objects still can be checked. + QTimer::singleShot(3000, this, [this](){ + qCDebug(dcInro()) << "Discovery: Grace period timer triggered."; + finishDiscovery(); + }); + }); +} + +void PantaboxDiscovery::checkNetworkDevice(const NetworkDeviceInfo &networkDeviceInfo) +{ + PantaboxModbusTcpConnection *connection = new PantaboxModbusTcpConnection(networkDeviceInfo.address(), m_port, m_modbusAddress, this); + m_connections.append(connection); + + connect(connection, &PantaboxModbusTcpConnection::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, &PantaboxModbusTcpConnection::initializationFinished, this, [=](bool success){ + if (!success) { + qCDebug(dcInro()) << "Discovery: Initialization failed on" << networkDeviceInfo.address().toString() << "Continue..."; + cleanupConnection(connection); + return; + } + + // FIXME: find a better way to discover the device besides a valid init + qCDebug(dcInro()) << "Discovery: Connection initialized successfully" << connection->serialNumber(); + + Result result; + result.serialNumber = QString::number(connection->serialNumber(), 16).toUpper(); + result.modbusTcpVersion = modbusVersionToString(connection->modbusTcpVersion()); + result.networkDeviceInfo = networkDeviceInfo; + m_results.append(result); + + qCInfo(dcInro()) << "Discovery: --> Found" + << "Serial number:" << result.serialNumber + << "(" << connection->serialNumber() << ")" + << "ModbusTCP version:" << result.modbusTcpVersion + << result.networkDeviceInfo; + + // Done with this connection + cleanupConnection(connection); + }); + + // Initializing... + if (!connection->initialize()) { + qCDebug(dcInro()) << "Discovery: Unable to initialize connection on" << networkDeviceInfo.address().toString() << "Continue..."; + cleanupConnection(connection); + } + }); + + // If we get any error...skip this host... + connect(connection->modbusTcpMaster(), &ModbusTcpMaster::connectionErrorOccurred, this, [=](QModbusDevice::Error error){ + if (error != QModbusDevice::NoError) { + qCDebug(dcInro()) << "Discovery: Connection error on" << networkDeviceInfo.address().toString() << "Continue..."; + cleanupConnection(connection); + } + }); + + // If check reachability failed...skip this host... + connect(connection, &PantaboxModbusTcpConnection::checkReachabilityFailed, this, [=](){ + qCDebug(dcInro()) << "Discovery: Check reachability failed on" << networkDeviceInfo.address().toString() << "Continue..."; + cleanupConnection(connection); + }); + + // Try to connect, maybe it works, maybe not... + connection->connectDevice(); +} + +void PantaboxDiscovery::cleanupConnection(PantaboxModbusTcpConnection *connection) +{ + m_connections.removeAll(connection); + connection->disconnectDevice(); + connection->deleteLater(); +} + +void PantaboxDiscovery::finishDiscovery() +{ + qint64 durationMilliSeconds = QDateTime::currentMSecsSinceEpoch() - m_startDateTime.toMSecsSinceEpoch(); + + // Cleanup any leftovers...we don't care any more + foreach (PantaboxModbusTcpConnection *connection, m_connections) + cleanupConnection(connection); + + qCInfo(dcInro()) << "Discovery: Finished the discovery process. Found" << m_results.count() + << "PANTABOXE wallboxes in" << QTime::fromMSecsSinceStartOfDay(durationMilliSeconds).toString("mm:ss.zzz"); + emit discoveryFinished(); +} diff --git a/inro/pantaboxdiscovery.h b/inro/pantaboxdiscovery.h new file mode 100644 index 0000000..c0364ce --- /dev/null +++ b/inro/pantaboxdiscovery.h @@ -0,0 +1,79 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* +* Copyright 2013 - 2024, 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 PANTABOXDISCOVERY_H +#define PANTABOXDISCOVERY_H + +#include + +#include + +#include "pantaboxmodbustcpconnection.h" + +class PantaboxDiscovery : public QObject +{ + Q_OBJECT +public: + explicit PantaboxDiscovery(NetworkDeviceDiscovery *networkDeviceDiscovery, QObject *parent = nullptr); + + typedef struct Result { + QString serialNumber; + QString modbusTcpVersion; + NetworkDeviceInfo networkDeviceInfo; + } Result; + + QList results() const; + + static QString modbusVersionToString(quint32 value); + +public slots: + void startDiscovery(); + +signals: + void discoveryFinished(); + +private: + NetworkDeviceDiscovery *m_networkDeviceDiscovery = nullptr; + quint16 m_port = 502; + quint16 m_modbusAddress = 1; + + QDateTime m_startDateTime; + + QList m_connections; + + QList m_results; + + void checkNetworkDevice(const NetworkDeviceInfo &networkDeviceInfo); + void cleanupConnection(PantaboxModbusTcpConnection *connection); + + void finishDiscovery(); +}; + +#endif // PANTABOXDISCOVERY_H diff --git a/inro/translations/e2751951-4d53-4156-bd1a-a54c39e5c6cc-de.ts b/inro/translations/e2751951-4d53-4156-bd1a-a54c39e5c6cc-de.ts new file mode 100644 index 0000000..75afd83 --- /dev/null +++ b/inro/translations/e2751951-4d53-4156-bd1a-a54c39e5c6cc-de.ts @@ -0,0 +1,170 @@ + + + + + IntegrationPluginInro + + + The network device discovery is not available. + Die Suche nach Netzwerkgeräten ist nicht verfügbar. + + + + The MAC address is not known. Please reconfigure the thing. + Die MAC-Adresse ist nicht bekannt. Bitte richte das Gerät erneut ein. + + + + inro + + + A + The name of a possible value of StateType {db8d452a-8459-429b-b8f1-d73c805bd857} of ThingClass pantabox + A + + + + AB + The name of a possible value of StateType {db8d452a-8459-429b-b8f1-d73c805bd857} of ThingClass pantabox + AB + + + + ABC + The name of a possible value of StateType {db8d452a-8459-429b-b8f1-d73c805bd857} of ThingClass pantabox + ABC + + + + AC + The name of a possible value of StateType {db8d452a-8459-429b-b8f1-d73c805bd857} of ThingClass pantabox + AC + + + + Active phases + The name of the StateType ({5cc3aa90-c83f-4453-9f22-5ef408e847a0}) of ThingClass pantabox + Aktive Phasen + + + + Active power + The name of the StateType ({e23181a7-0747-4ff2-8b10-90256a8377b3}) of ThingClass pantabox + Leistung + + + + B + The name of a possible value of StateType {db8d452a-8459-429b-b8f1-d73c805bd857} of ThingClass pantabox + B + + + + BC + The name of a possible value of StateType {db8d452a-8459-429b-b8f1-d73c805bd857} of ThingClass pantabox + BC + + + + C + The name of a possible value of StateType {db8d452a-8459-429b-b8f1-d73c805bd857} of ThingClass pantabox + C + + + + Charging + The name of the StateType ({5a606c6a-030c-4d55-9700-723c9c859c7f}) of ThingClass pantabox + Lade + + + + + Charging enabled + The name of the ParamType (ThingClass: pantabox, ActionType: power, ID: {d885ee23-8c50-48f1-82a9-72e0e92715ac}) +---------- +The name of the StateType ({d885ee23-8c50-48f1-82a9-72e0e92715ac}) of ThingClass pantabox + Ladefreigabe + + + + Connected + The name of the StateType ({345909fc-22e2-44bb-a063-26dd8e30793b}) of ThingClass pantabox + Verbunden + + + + INRO + The name of the plugin inro ({e2751951-4d53-4156-bd1a-a54c39e5c6cc}) + INRO + + + + INRO Elektrotechnik GmbH + The name of the vendor ({53669eec-4e67-444d-973f-40668aaa37a6}) + INRO Elektrotechnik GmbH + + + + MAC address + The name of the ParamType (ThingClass: pantabox, Type: thing, ID: {a3bc042c-0613-40a9-867a-3482d4d0901e}) + MAC-Adresse + + + + + Maximum charging current + The name of the ParamType (ThingClass: pantabox, ActionType: maxChargingCurrent, ID: {db02bf36-1ce2-40b4-bf88-8a4e3842a63b}) +---------- +The name of the StateType ({db02bf36-1ce2-40b4-bf88-8a4e3842a63b}) of ThingClass pantabox + Maximaler Ladestrom + + + + PANTABOX + The name of the ThingClass ({6de119fb-a579-4a88-9903-f05aac167b19}) + PANTABOX + + + + Phases connected + The name of the ParamType (ThingClass: pantabox, Type: settings, ID: {78225651-565c-49f7-8610-c067faf8822a}) + Angeschlossene Phasen + + + + Plugged in + The name of the StateType ({bb2f4ff0-f7ca-4ffd-a2f1-73f9b230a1eb}) of ThingClass pantabox + Angesteckt + + + + Session energy + The name of the StateType ({95719ca2-bda2-4eb4-b76d-e54d7a98dfdb}) of ThingClass pantabox + Energie Ladevorgang + + + + Set charging enabled + The name of the ActionType ({d885ee23-8c50-48f1-82a9-72e0e92715ac}) of ThingClass pantabox + Ladefreigabe erteilen + + + + Set maximum charging current + The name of the ActionType ({db02bf36-1ce2-40b4-bf88-8a4e3842a63b}) of ThingClass pantabox + Setze Ladestrom + + + + Total consumed energy + The name of the StateType ({b6e309d4-d480-477a-88f1-79e00bca450a}) of ThingClass pantabox + Gesamte Energiemenge + + + + Used phases + The name of the StateType ({db8d452a-8459-429b-b8f1-d73c805bd857}) of ThingClass pantabox + Verwendete Phasen + + + diff --git a/inro/translations/e2751951-4d53-4156-bd1a-a54c39e5c6cc-en_US.ts b/inro/translations/e2751951-4d53-4156-bd1a-a54c39e5c6cc-en_US.ts new file mode 100644 index 0000000..31f2eeb --- /dev/null +++ b/inro/translations/e2751951-4d53-4156-bd1a-a54c39e5c6cc-en_US.ts @@ -0,0 +1,170 @@ + + + + + IntegrationPluginInro + + + The network device discovery is not available. + + + + + The MAC address is not known. Please reconfigure the thing. + + + + + inro + + + A + The name of a possible value of StateType {db8d452a-8459-429b-b8f1-d73c805bd857} of ThingClass pantabox + + + + + AB + The name of a possible value of StateType {db8d452a-8459-429b-b8f1-d73c805bd857} of ThingClass pantabox + + + + + ABC + The name of a possible value of StateType {db8d452a-8459-429b-b8f1-d73c805bd857} of ThingClass pantabox + + + + + AC + The name of a possible value of StateType {db8d452a-8459-429b-b8f1-d73c805bd857} of ThingClass pantabox + + + + + Active phases + The name of the StateType ({5cc3aa90-c83f-4453-9f22-5ef408e847a0}) of ThingClass pantabox + + + + + Active power + The name of the StateType ({e23181a7-0747-4ff2-8b10-90256a8377b3}) of ThingClass pantabox + + + + + B + The name of a possible value of StateType {db8d452a-8459-429b-b8f1-d73c805bd857} of ThingClass pantabox + + + + + BC + The name of a possible value of StateType {db8d452a-8459-429b-b8f1-d73c805bd857} of ThingClass pantabox + + + + + C + The name of a possible value of StateType {db8d452a-8459-429b-b8f1-d73c805bd857} of ThingClass pantabox + + + + + Charging + The name of the StateType ({5a606c6a-030c-4d55-9700-723c9c859c7f}) of ThingClass pantabox + + + + + + Charging enabled + The name of the ParamType (ThingClass: pantabox, ActionType: power, ID: {d885ee23-8c50-48f1-82a9-72e0e92715ac}) +---------- +The name of the StateType ({d885ee23-8c50-48f1-82a9-72e0e92715ac}) of ThingClass pantabox + + + + + Connected + The name of the StateType ({345909fc-22e2-44bb-a063-26dd8e30793b}) of ThingClass pantabox + + + + + INRO + The name of the plugin inro ({e2751951-4d53-4156-bd1a-a54c39e5c6cc}) + + + + + INRO Elektrotechnik GmbH + The name of the vendor ({53669eec-4e67-444d-973f-40668aaa37a6}) + + + + + MAC address + The name of the ParamType (ThingClass: pantabox, Type: thing, ID: {a3bc042c-0613-40a9-867a-3482d4d0901e}) + + + + + + Maximum charging current + The name of the ParamType (ThingClass: pantabox, ActionType: maxChargingCurrent, ID: {db02bf36-1ce2-40b4-bf88-8a4e3842a63b}) +---------- +The name of the StateType ({db02bf36-1ce2-40b4-bf88-8a4e3842a63b}) of ThingClass pantabox + + + + + PANTABOX + The name of the ThingClass ({6de119fb-a579-4a88-9903-f05aac167b19}) + + + + + Phases connected + The name of the ParamType (ThingClass: pantabox, Type: settings, ID: {78225651-565c-49f7-8610-c067faf8822a}) + + + + + Plugged in + The name of the StateType ({bb2f4ff0-f7ca-4ffd-a2f1-73f9b230a1eb}) of ThingClass pantabox + + + + + Session energy + The name of the StateType ({95719ca2-bda2-4eb4-b76d-e54d7a98dfdb}) of ThingClass pantabox + + + + + Set charging enabled + The name of the ActionType ({d885ee23-8c50-48f1-82a9-72e0e92715ac}) of ThingClass pantabox + + + + + Set maximum charging current + The name of the ActionType ({db02bf36-1ce2-40b4-bf88-8a4e3842a63b}) of ThingClass pantabox + + + + + Total consumed energy + The name of the StateType ({b6e309d4-d480-477a-88f1-79e00bca450a}) of ThingClass pantabox + + + + + Used phases + The name of the StateType ({db8d452a-8459-429b-b8f1-d73c805bd857}) of ThingClass pantabox + + + + diff --git a/nymea-plugins-modbus.pro b/nymea-plugins-modbus.pro index bc1a5c8..d2e0e0c 100644 --- a/nymea-plugins-modbus.pro +++ b/nymea-plugins-modbus.pro @@ -12,6 +12,7 @@ PLUGIN_DIRS = \ huawei \ idm \ inepro \ + inro \ kostal \ mennekes \ modbuscommander \