New plugin Inro: Add support for PANTABOX

This commit is contained in:
Simon Stürz 2024-05-17 11:57:59 +02:00
parent 90f954f198
commit a255a67d51
17 changed files with 1332 additions and 0 deletions

11
debian/control vendored
View File

@ -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

2
debian/nymea-plugin-inro.install.in vendored Normal file
View File

@ -0,0 +1,2 @@
usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationplugininro.so
inro/translations/*qm usr/share/nymea/translations/

25
inro/README.md Normal file
View File

@ -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/

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

BIN
inro/inro.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

15
inro/inro.pro Normal file
View File

@ -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

View File

@ -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 <https://www.gnu.org/licenses/>.
*
* 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 <network/networkdevicediscovery.h>
#include <hardwaremanager.h>
#include <hardware/electricity.h>
#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();
}

View File

@ -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 <https://www.gnu.org/licenses/>.
*
* 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 <plugintimer.h>
#include <integrations/integrationplugin.h>
#include <network/networkdevicemonitor.h>
#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<Thing *, PantaboxModbusTcpConnection *> m_connections;
QHash<Thing *, NetworkDeviceMonitor *> m_monitors;
void setupConnection(ThingSetupInfo *info);
};
#endif // INTEGRATIONPLUGININRO_H

View File

@ -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": ""
}
]
}
]
}
]
}

14
inro/meta.json Normal file
View File

@ -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"
]
}

View File

@ -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"
}
]
}

152
inro/pantaboxdiscovery.cpp Normal file
View File

@ -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 <https://www.gnu.org/licenses/>.
*
* 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::Result> 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();
}

79
inro/pantaboxdiscovery.h Normal file
View File

@ -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 <https://www.gnu.org/licenses/>.
*
* 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 <QObject>
#include <network/networkdevicediscovery.h>
#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<PantaboxDiscovery::Result> 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<PantaboxModbusTcpConnection *> m_connections;
QList<Result> m_results;
void checkNetworkDevice(const NetworkDeviceInfo &networkDeviceInfo);
void cleanupConnection(PantaboxModbusTcpConnection *connection);
void finishDiscovery();
};
#endif // PANTABOXDISCOVERY_H

View File

@ -0,0 +1,170 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="de">
<context>
<name>IntegrationPluginInro</name>
<message>
<location filename="../integrationplugininro.cpp" line="50"/>
<source>The network device discovery is not available.</source>
<translation>Die Suche nach Netzwerkgeräten ist nicht verfügbar.</translation>
</message>
<message>
<location filename="../integrationplugininro.cpp" line="98"/>
<source>The MAC address is not known. Please reconfigure the thing.</source>
<translation>Die MAC-Adresse ist nicht bekannt. Bitte richte das Gerät erneut ein.</translation>
</message>
</context>
<context>
<name>inro</name>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="44"/>
<source>A</source>
<extracomment>The name of a possible value of StateType {db8d452a-8459-429b-b8f1-d73c805bd857} of ThingClass pantabox</extracomment>
<translation>A</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="47"/>
<source>AB</source>
<extracomment>The name of a possible value of StateType {db8d452a-8459-429b-b8f1-d73c805bd857} of ThingClass pantabox</extracomment>
<translation>AB</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="50"/>
<source>ABC</source>
<extracomment>The name of a possible value of StateType {db8d452a-8459-429b-b8f1-d73c805bd857} of ThingClass pantabox</extracomment>
<translation>ABC</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="53"/>
<source>AC</source>
<extracomment>The name of a possible value of StateType {db8d452a-8459-429b-b8f1-d73c805bd857} of ThingClass pantabox</extracomment>
<translation>AC</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="56"/>
<source>Active phases</source>
<extracomment>The name of the StateType ({5cc3aa90-c83f-4453-9f22-5ef408e847a0}) of ThingClass pantabox</extracomment>
<translation>Aktive Phasen</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="59"/>
<source>Active power</source>
<extracomment>The name of the StateType ({e23181a7-0747-4ff2-8b10-90256a8377b3}) of ThingClass pantabox</extracomment>
<translation>Leistung</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="62"/>
<source>B</source>
<extracomment>The name of a possible value of StateType {db8d452a-8459-429b-b8f1-d73c805bd857} of ThingClass pantabox</extracomment>
<translation>B</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="65"/>
<source>BC</source>
<extracomment>The name of a possible value of StateType {db8d452a-8459-429b-b8f1-d73c805bd857} of ThingClass pantabox</extracomment>
<translation>BC</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="68"/>
<source>C</source>
<extracomment>The name of a possible value of StateType {db8d452a-8459-429b-b8f1-d73c805bd857} of ThingClass pantabox</extracomment>
<translation>C</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="71"/>
<source>Charging</source>
<extracomment>The name of the StateType ({5a606c6a-030c-4d55-9700-723c9c859c7f}) of ThingClass pantabox</extracomment>
<translation>Lade</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="74"/>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="77"/>
<source>Charging enabled</source>
<extracomment>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</extracomment>
<translation>Ladefreigabe</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="80"/>
<source>Connected</source>
<extracomment>The name of the StateType ({345909fc-22e2-44bb-a063-26dd8e30793b}) of ThingClass pantabox</extracomment>
<translation>Verbunden</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="83"/>
<source>INRO</source>
<extracomment>The name of the plugin inro ({e2751951-4d53-4156-bd1a-a54c39e5c6cc})</extracomment>
<translation>INRO</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="86"/>
<source>INRO Elektrotechnik GmbH</source>
<extracomment>The name of the vendor ({53669eec-4e67-444d-973f-40668aaa37a6})</extracomment>
<translation>INRO Elektrotechnik GmbH</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="89"/>
<source>MAC address</source>
<extracomment>The name of the ParamType (ThingClass: pantabox, Type: thing, ID: {a3bc042c-0613-40a9-867a-3482d4d0901e})</extracomment>
<translation>MAC-Adresse</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="92"/>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="95"/>
<source>Maximum charging current</source>
<extracomment>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</extracomment>
<translation>Maximaler Ladestrom</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="98"/>
<source>PANTABOX</source>
<extracomment>The name of the ThingClass ({6de119fb-a579-4a88-9903-f05aac167b19})</extracomment>
<translation>PANTABOX</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="101"/>
<source>Phases connected</source>
<extracomment>The name of the ParamType (ThingClass: pantabox, Type: settings, ID: {78225651-565c-49f7-8610-c067faf8822a})</extracomment>
<translation>Angeschlossene Phasen</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="104"/>
<source>Plugged in</source>
<extracomment>The name of the StateType ({bb2f4ff0-f7ca-4ffd-a2f1-73f9b230a1eb}) of ThingClass pantabox</extracomment>
<translation>Angesteckt</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="107"/>
<source>Session energy</source>
<extracomment>The name of the StateType ({95719ca2-bda2-4eb4-b76d-e54d7a98dfdb}) of ThingClass pantabox</extracomment>
<translation>Energie Ladevorgang</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="110"/>
<source>Set charging enabled</source>
<extracomment>The name of the ActionType ({d885ee23-8c50-48f1-82a9-72e0e92715ac}) of ThingClass pantabox</extracomment>
<translation>Ladefreigabe erteilen</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="113"/>
<source>Set maximum charging current</source>
<extracomment>The name of the ActionType ({db02bf36-1ce2-40b4-bf88-8a4e3842a63b}) of ThingClass pantabox</extracomment>
<translation>Setze Ladestrom</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="116"/>
<source>Total consumed energy</source>
<extracomment>The name of the StateType ({b6e309d4-d480-477a-88f1-79e00bca450a}) of ThingClass pantabox</extracomment>
<translation>Gesamte Energiemenge</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="119"/>
<source>Used phases</source>
<extracomment>The name of the StateType ({db8d452a-8459-429b-b8f1-d73c805bd857}) of ThingClass pantabox</extracomment>
<translation>Verwendete Phasen</translation>
</message>
</context>
</TS>

View File

@ -0,0 +1,170 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1">
<context>
<name>IntegrationPluginInro</name>
<message>
<location filename="../integrationplugininro.cpp" line="50"/>
<source>The network device discovery is not available.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../integrationplugininro.cpp" line="98"/>
<source>The MAC address is not known. Please reconfigure the thing.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>inro</name>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="44"/>
<source>A</source>
<extracomment>The name of a possible value of StateType {db8d452a-8459-429b-b8f1-d73c805bd857} of ThingClass pantabox</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="47"/>
<source>AB</source>
<extracomment>The name of a possible value of StateType {db8d452a-8459-429b-b8f1-d73c805bd857} of ThingClass pantabox</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="50"/>
<source>ABC</source>
<extracomment>The name of a possible value of StateType {db8d452a-8459-429b-b8f1-d73c805bd857} of ThingClass pantabox</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="53"/>
<source>AC</source>
<extracomment>The name of a possible value of StateType {db8d452a-8459-429b-b8f1-d73c805bd857} of ThingClass pantabox</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="56"/>
<source>Active phases</source>
<extracomment>The name of the StateType ({5cc3aa90-c83f-4453-9f22-5ef408e847a0}) of ThingClass pantabox</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="59"/>
<source>Active power</source>
<extracomment>The name of the StateType ({e23181a7-0747-4ff2-8b10-90256a8377b3}) of ThingClass pantabox</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="62"/>
<source>B</source>
<extracomment>The name of a possible value of StateType {db8d452a-8459-429b-b8f1-d73c805bd857} of ThingClass pantabox</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="65"/>
<source>BC</source>
<extracomment>The name of a possible value of StateType {db8d452a-8459-429b-b8f1-d73c805bd857} of ThingClass pantabox</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="68"/>
<source>C</source>
<extracomment>The name of a possible value of StateType {db8d452a-8459-429b-b8f1-d73c805bd857} of ThingClass pantabox</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="71"/>
<source>Charging</source>
<extracomment>The name of the StateType ({5a606c6a-030c-4d55-9700-723c9c859c7f}) of ThingClass pantabox</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="74"/>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="77"/>
<source>Charging enabled</source>
<extracomment>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</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="80"/>
<source>Connected</source>
<extracomment>The name of the StateType ({345909fc-22e2-44bb-a063-26dd8e30793b}) of ThingClass pantabox</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="83"/>
<source>INRO</source>
<extracomment>The name of the plugin inro ({e2751951-4d53-4156-bd1a-a54c39e5c6cc})</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="86"/>
<source>INRO Elektrotechnik GmbH</source>
<extracomment>The name of the vendor ({53669eec-4e67-444d-973f-40668aaa37a6})</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="89"/>
<source>MAC address</source>
<extracomment>The name of the ParamType (ThingClass: pantabox, Type: thing, ID: {a3bc042c-0613-40a9-867a-3482d4d0901e})</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="92"/>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="95"/>
<source>Maximum charging current</source>
<extracomment>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</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="98"/>
<source>PANTABOX</source>
<extracomment>The name of the ThingClass ({6de119fb-a579-4a88-9903-f05aac167b19})</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="101"/>
<source>Phases connected</source>
<extracomment>The name of the ParamType (ThingClass: pantabox, Type: settings, ID: {78225651-565c-49f7-8610-c067faf8822a})</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="104"/>
<source>Plugged in</source>
<extracomment>The name of the StateType ({bb2f4ff0-f7ca-4ffd-a2f1-73f9b230a1eb}) of ThingClass pantabox</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="107"/>
<source>Session energy</source>
<extracomment>The name of the StateType ({95719ca2-bda2-4eb4-b76d-e54d7a98dfdb}) of ThingClass pantabox</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="110"/>
<source>Set charging enabled</source>
<extracomment>The name of the ActionType ({d885ee23-8c50-48f1-82a9-72e0e92715ac}) of ThingClass pantabox</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="113"/>
<source>Set maximum charging current</source>
<extracomment>The name of the ActionType ({db02bf36-1ce2-40b4-bf88-8a4e3842a63b}) of ThingClass pantabox</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="116"/>
<source>Total consumed energy</source>
<extracomment>The name of the StateType ({b6e309d4-d480-477a-88f1-79e00bca450a}) of ThingClass pantabox</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-modbus-Desktop-Debug/inro/plugininfo.h" line="119"/>
<source>Used phases</source>
<extracomment>The name of the StateType ({db8d452a-8459-429b-b8f1-d73c805bd857}) of ThingClass pantabox</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

View File

@ -12,6 +12,7 @@ PLUGIN_DIRS = \
huawei \
idm \
inepro \
inro \
kostal \
mennekes \
modbuscommander \