EVBox: Split thing class into one with and one without meter

master
Michael Zanetti 2023-03-27 11:52:19 +02:00
parent 4acddd2219
commit e6d6fd6958
4 changed files with 242 additions and 85 deletions

View File

@ -7,6 +7,7 @@ This integration allows nymea to control EVBox wallboxes supporting the Protocol
Generally, all EVBox wallboxes supporting the Protocol Max v4 are supported. We've tested it with
* Elvi
* Elvi + MID meter
## Requirements

View File

@ -83,10 +83,12 @@ void IntegrationPluginEVBox::discoverThings(ThingDiscoveryInfo *info)
return;
}
ThingDescriptor thingDescriptor(info->thingClassId(), "EVBox Elvi", serial);
ThingDescriptor thingDescriptor(info->thingClassId(), thingClass(info->thingClassId()).displayName(), serial);
ParamTypeId serialPortParamTypeId = thingClass(info->thingClassId()).paramTypes().findByName("serialPort").id();
ParamTypeId serialNumberParamTypeId = thingClass(info->thingClassId()).paramTypes().findByName("serialNumber").id();
ParamList params{
{evboxThingSerialPortParamTypeId, portInfo.portName()},
{evboxThingSerialNumberParamTypeId, serial}
{serialPortParamTypeId, portInfo.portName()},
{serialNumberParamTypeId, serial}
};
thingDescriptor.setParams(params);
Thing *existingThing = myThings().findByParams(params);
@ -117,8 +119,8 @@ void IntegrationPluginEVBox::discoverThings(ThingDiscoveryInfo *info)
void IntegrationPluginEVBox::setupThing(ThingSetupInfo *info)
{
Thing *thing = info->thing();
QString portName = thing->paramValue(evboxThingSerialPortParamTypeId).toString();
QString serialNumber = thing->paramValue(evboxThingSerialNumberParamTypeId).toString();
QString portName = thing->paramValue("serialPort").toString();
QString serialNumber = thing->paramValue("serialNumber").toString();
// Opening the port, sharing with others if already opened.
EVBoxPort *port = m_ports.value(portName);
@ -154,7 +156,7 @@ void IntegrationPluginEVBox::setupThing(ThingSetupInfo *info)
// And connect the signals to the thing for when the setup went well
connect(port, &EVBoxPort::closed, thing, [thing, portName](){
qCInfo(dcEVBox()) << "Port" << portName << "closed. Marking thing as offline:" << thing->name();
thing->setStateValue(evboxConnectedStateTypeId, false);
thing->setStateValue("connected", false);
});
connect(port, &EVBoxPort::opened, thing, [portName](){
qCInfo(dcEVBox()) << "Port" << portName << "opened.";
@ -164,7 +166,7 @@ void IntegrationPluginEVBox::setupThing(ThingSetupInfo *info)
if (serial != serialNumber) {
return;
}
thing->setStateValue(evboxConnectedStateTypeId, true);
thing->setStateValue("connected", true);
finishPendingAction(thing);
m_waitingForResponses[thing] = false;
});
@ -173,31 +175,37 @@ void IntegrationPluginEVBox::setupThing(ThingSetupInfo *info)
if (serial != serialNumber) {
return;
}
thing->setStateValue(evboxConnectedStateTypeId, true);
thing->setStateValue("connected", true);
finishPendingAction(thing);
m_waitingForResponses[thing] = false;
double currentPower = (chargingCurrentL1 + chargingCurrentL2 + chargingCurrentL3) * 23;
thing->setStateValue(evboxCurrentPowerStateTypeId, currentPower);
thing->setStateMinMaxValues(evboxMaxChargingCurrentStateTypeId, minChargingCurrent / 10, maxChargingCurrent / 10);
thing->setStateValue(evboxTotalEnergyConsumedStateTypeId, totalEnergyConsumed / 1000.0);
thing->setStateValue(evboxChargingStateTypeId, currentPower > 0);
thing->setStateMinMaxValues("maxChargingCurrent", minChargingCurrent / 10, maxChargingCurrent / 10);
int phaseCount = 0;
if (chargingCurrentL1 > 0) {
phaseCount++;
}
if (chargingCurrentL2 > 0) {
phaseCount++;
}
if (chargingCurrentL3 > 0) {
phaseCount++;
}
// If all phases are on 0, we aren't charging and don't know how many phases are available...
// Only updating the count if we actually do know that at least one is charging.
if (phaseCount > 0) {
thing->setStateValue(evboxPhaseCountStateTypeId, phaseCount);
if (thing->thingClassId() == elviMidThingClassId) {
double currentPower = (chargingCurrentL1 + chargingCurrentL2 + chargingCurrentL3) * 23;
thing->setStateValue("currentPower", currentPower);
thing->setStateValue("totalEnergyConsumed", totalEnergyConsumed / 1000.0);
thing->setStateValue("charging", currentPower > 0);
int phaseCount = 0;
if (chargingCurrentL1 > 0) {
phaseCount++;
}
if (chargingCurrentL2 > 0) {
phaseCount++;
}
if (chargingCurrentL3 > 0) {
phaseCount++;
}
// If all phases are on 0, we aren't charging and don't know how many phases are available...
// Only updating the count if we actually do know that at least one is charging.
if (phaseCount > 0) {
thing->setStateValue("phaseCount", phaseCount);
}
} else {
thing->setStateValue("charging", thing->stateValue("maxChargingCurrent").toUInt() > 0 && thing->stateValue("power").toBool());
thing->setStateValue("phaseCount", thing->setting("phaseCount").toUInt());
}
});
}
@ -207,19 +215,19 @@ void IntegrationPluginEVBox::postSetupThing(Thing */*thing*/)
m_timer = hardwareManager()->pluginTimerManager()->registerTimer(5);
connect(m_timer, &PluginTimer::timeout, this, [this](){
foreach (Thing *t, myThings()) {
QString portName = t->paramValue(evboxThingSerialPortParamTypeId).toString();
QString serial = t->paramValue(evboxThingSerialNumberParamTypeId).toString();
QString portName = t->paramValue("serialPort").toString();
QString serial = t->paramValue("serialNumber").toString();
if (m_waitingForResponses.value(t)) {
qCInfo(dcEVBox()) << "Wallbox" << t->name() << "did not respond to last command. Marking offline.";
t->setStateValue(evboxConnectedStateTypeId, false);
t->setStateValue("connected", false);
}
EVBoxPort *port = m_ports.value(portName);
if (port->isOpen()) {
quint16 maxChargingCurrent = 0;
if (t->stateValue(evboxPowerStateTypeId).toBool()) {
maxChargingCurrent = t->stateValue(evboxMaxChargingCurrentStateTypeId).toUInt();
if (t->stateValue("power").toBool()) {
maxChargingCurrent = t->stateValue("maxChargingCurrent").toUInt();
}
port->sendCommand(EVBoxPort::Command68, 60, maxChargingCurrent, serial);
m_waitingForResponses[t] = true;
@ -231,8 +239,9 @@ void IntegrationPluginEVBox::postSetupThing(Thing */*thing*/)
void IntegrationPluginEVBox::thingRemoved(Thing *thing)
{
QString portName = thing->paramValue(evboxThingSerialPortParamTypeId).toString();
if (myThings().filterByParam(evboxThingSerialPortParamTypeId, portName).isEmpty()) {
QString portName = thing->paramValue("serialPort").toString();
ParamTypeId serialPortParamTypeId = thing->thingClass().paramTypes().findByName("serialPort").id();
if (myThings().filterByParam(serialPortParamTypeId, portName).isEmpty()) {
qCInfo(dcEVBox()).nospace() << "No more EVBox devices using port " << portName << ". Destroying port.";
delete m_ports.take(portName);
}
@ -247,17 +256,18 @@ void IntegrationPluginEVBox::executeAction(ThingActionInfo *info)
{
Thing *thing = info->thing();
QString portName = thing->paramValue(evboxThingSerialPortParamTypeId).toString();
QString serial = thing->paramValue(evboxThingSerialNumberParamTypeId).toString();
QString portName = thing->paramValue("serialPort").toString();
QString serial = thing->paramValue("serialNumber").toString();
EVBoxPort *port = m_ports.value(portName);
qCDebug(dcEVBox()) << "Executing action" << info->action().actionTypeId().toString();
if (info->action().actionTypeId() == evboxPowerActionTypeId) {
bool power = info->action().paramValue(evboxPowerActionPowerParamTypeId).toBool();
quint16 maxChargingCurrent = thing->stateValue(evboxMaxChargingCurrentStateTypeId).toUInt();
ActionType actionType = thing->thingClass().actionTypes().findById(info->action().actionTypeId());
if (actionType.name() == "power") {
bool power = info->action().paramValue(actionType.id()).toBool();
quint16 maxChargingCurrent = thing->stateValue("maxChargingCurrent").toUInt();
port->sendCommand(EVBoxPort::Command68, 60, power ? maxChargingCurrent : 0, serial);
} else if (info->action().actionTypeId() == evboxMaxChargingCurrentActionTypeId) {
int maxChargingCurrent = info->action().paramValue(evboxMaxChargingCurrentActionMaxChargingCurrentParamTypeId).toInt();
} else if (actionType.name() == "maxChargingCurrent") {
int maxChargingCurrent = info->action().paramValue(actionType.id()).toInt();
port->sendCommand(EVBoxPort::Command68, 60, maxChargingCurrent, serial);
}
@ -273,10 +283,11 @@ void IntegrationPluginEVBox::finishPendingAction(Thing *thing)
if (!m_pendingActions.value(thing).isEmpty()) {
ThingActionInfo *info = m_pendingActions.value(thing).first();
qCDebug(dcEVBox()) << "Finishing action:" << info->action().actionTypeId().toString();
if (info->action().actionTypeId() == evboxPowerActionTypeId) {
thing->setStateValue(evboxPowerStateTypeId, info->action().paramValue(evboxPowerActionPowerParamTypeId));
} else if (info->action().actionTypeId() == evboxMaxChargingCurrentActionTypeId) {
thing->setStateValue(evboxMaxChargingCurrentStateTypeId, info->action().paramValue(evboxMaxChargingCurrentActionMaxChargingCurrentParamTypeId));
ActionType actionType = thing->thingClass().actionTypes().findById(info->action().actionTypeId());
if (actionType.name() == "power") {
thing->setStateValue("power", info->action().paramValue(actionType.id()));
} else if (actionType.name() == "maxChargingCurrent") {
thing->setStateValue("maxChargingCurrent", info->action().paramValue(actionType.id()));
}
info->finish(Thing::ThingErrorNoError);
}

View File

@ -10,11 +10,12 @@
"thingClasses": [
{
"id": "d73a14e3-10af-47bc-9bc7-a5ff6e52f72c",
"name": "evbox",
"displayName": "Elvi",
"name": "elviMid",
"displayName": "Elvi + MID meter",
"createMethods": ["discovery"],
"discoveryType": "weak",
"setupMethod": "justadd",
"interfaces": [ "evcharger", "connectable" ],
"interfaces": [ "evcharger", "smartmeterconsumer", "connectable" ],
"paramTypes": [
{
"id": "bce7c412-c19a-4e60-a11f-fe8308408abf",
@ -94,6 +95,88 @@
"defaultValue": 1
}
]
},
{
"id": "81df1344-3861-4554-972c-6cd4b2ec97a7",
"name": "elvi",
"displayName": "Elvi",
"createMethods": ["discovery"],
"discoveryType": "weak",
"setupMethod": "justadd",
"interfaces": [ "evcharger", "connectable" ],
"paramTypes": [
{
"id": "159fec55-e73d-4a9d-bbde-b2b44fe7f363",
"name":"serialPort",
"displayName": "Serial port",
"type": "QString"
},
{
"id": "987ddd33-cbcd-4716-bdaa-6824a5295d22",
"name":"serialNumber",
"displayName": "Serial number",
"type": "QString"
}
],
"settingsTypes": [
{
"id": "3b44ed38-5cfe-4f61-8ad4-a4fe282944ac",
"name": "phaseCount",
"displayName": "Connected phases",
"type": "uint",
"minValue": 1,
"maxValue": 3,
"defaultValue": 3
}
],
"stateTypes": [
{
"id": "e763b450-e180-4afb-9fcf-c75ad2f3d7c7",
"name": "connected",
"displayName": "Connected",
"displayNameEvent": "Connected changed",
"type": "bool",
"defaultValue": false,
"cached": false
},
{
"id": "d9875cbf-3736-484c-bf07-08a1d7f9cc89",
"name": "power",
"displayName": "Charging enabled",
"displayNameAction": "Enable/disable charging",
"type": "bool",
"defaultValue": false,
"writable": true
},
{
"id": "186d792a-5bab-4144-837a-cbf5027de4fb",
"name": "maxChargingCurrent",
"displayName": "Maximum charging current",
"displayNameAction": "Set maximum charging current",
"type": "uint",
"writable": true,
"unit": "Ampere",
"minValue": "6",
"maxValue": "32",
"defaultValue": 6
},
{
"id": "91093627-ddae-4ba2-83f1-0241ea01aa01",
"name": "charging",
"displayName": "Charging",
"type": "bool",
"defaultValue": false
},
{
"id": "46781438-2a31-48d3-a140-11593888b268",
"name": "phaseCount",
"displayName": "Used phases",
"type": "uint",
"minValue": 1,
"maxValue": 3,
"defaultValue": 1
}
]
}
]
}

View File

@ -4,35 +4,53 @@
<context>
<name>EVBox</name>
<message>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="40"/>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="54"/>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="57"/>
<source>Charging</source>
<extracomment>The name of the StateType ({6439fdba-dc03-454f-bc33-0f6e2619d2ab}) of ThingClass evbox</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="43"/>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="46"/>
<source>Charging enabled</source>
<extracomment>The name of the ParamType (ThingClass: evbox, ActionType: power, ID: {e3ed9334-68bf-47eb-bd9a-d9a800529bce})
<extracomment>The name of the StateType ({91093627-ddae-4ba2-83f1-0241ea01aa01}) of ThingClass elvi
----------
The name of the StateType ({e3ed9334-68bf-47eb-bd9a-d9a800529bce}) of ThingClass evbox</extracomment>
The name of the StateType ({6439fdba-dc03-454f-bc33-0f6e2619d2ab}) of ThingClass elviMid</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="49"/>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="60"/>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="63"/>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="66"/>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="69"/>
<source>Charging enabled</source>
<extracomment>The name of the ParamType (ThingClass: elvi, ActionType: power, ID: {d9875cbf-3736-484c-bf07-08a1d7f9cc89})
----------
The name of the StateType ({d9875cbf-3736-484c-bf07-08a1d7f9cc89}) of ThingClass elvi
----------
The name of the ParamType (ThingClass: elviMid, ActionType: power, ID: {e3ed9334-68bf-47eb-bd9a-d9a800529bce})
----------
The name of the StateType ({e3ed9334-68bf-47eb-bd9a-d9a800529bce}) of ThingClass elviMid</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="72"/>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="75"/>
<source>Connected</source>
<extracomment>The name of the StateType ({5ef06038-9fa9-4d5d-8d9b-0375b8aa343a}) of ThingClass evbox</extracomment>
<extracomment>The name of the StateType ({e763b450-e180-4afb-9fcf-c75ad2f3d7c7}) of ThingClass elvi
----------
The name of the StateType ({5ef06038-9fa9-4d5d-8d9b-0375b8aa343a}) of ThingClass elviMid</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="52"/>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="78"/>
<source>Connected phases</source>
<extracomment>The name of the ParamType (ThingClass: elvi, Type: settings, ID: {3b44ed38-5cfe-4f61-8ad4-a4fe282944ac})</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="81"/>
<source>Current power consumption</source>
<extracomment>The name of the StateType ({8d3c80b7-f1f1-48de-8b7a-f99b9bc688b7}) of ThingClass evbox</extracomment>
<extracomment>The name of the StateType ({8d3c80b7-f1f1-48de-8b7a-f99b9bc688b7}) of ThingClass elviMid</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="55"/>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="58"/>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="84"/>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="87"/>
<source>EVBox</source>
<extracomment>The name of the vendor ({435d8843-887a-4642-b2f5-cd27d18bdb95})
----------
@ -40,60 +58,104 @@ The name of the plugin EVBox ({3362ac5c-5e2f-43c0-b3fc-70a98773e119})</extracomm
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="61"/>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="90"/>
<source>Elvi</source>
<extracomment>The name of the ThingClass ({81df1344-3861-4554-972c-6cd4b2ec97a7})</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="93"/>
<source>Elvi + MID meter</source>
<extracomment>The name of the ThingClass ({d73a14e3-10af-47bc-9bc7-a5ff6e52f72c})</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="64"/>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="96"/>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="99"/>
<source>Enable/disable charging</source>
<extracomment>The name of the ActionType ({e3ed9334-68bf-47eb-bd9a-d9a800529bce}) of ThingClass evbox</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="67"/>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="70"/>
<source>Maximum charging current</source>
<extracomment>The name of the ParamType (ThingClass: evbox, ActionType: maxChargingCurrent, ID: {cc9ae86d-fc86-473f-ae90-d9eb20d7a011})
<extracomment>The name of the ActionType ({d9875cbf-3736-484c-bf07-08a1d7f9cc89}) of ThingClass elvi
----------
The name of the StateType ({cc9ae86d-fc86-473f-ae90-d9eb20d7a011}) of ThingClass evbox</extracomment>
The name of the ActionType ({e3ed9334-68bf-47eb-bd9a-d9a800529bce}) of ThingClass elviMid</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="73"/>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="102"/>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="105"/>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="108"/>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="111"/>
<source>Maximum charging current</source>
<extracomment>The name of the ParamType (ThingClass: elvi, ActionType: maxChargingCurrent, ID: {186d792a-5bab-4144-837a-cbf5027de4fb})
----------
The name of the StateType ({186d792a-5bab-4144-837a-cbf5027de4fb}) of ThingClass elvi
----------
The name of the ParamType (ThingClass: elviMid, ActionType: maxChargingCurrent, ID: {cc9ae86d-fc86-473f-ae90-d9eb20d7a011})
----------
The name of the StateType ({cc9ae86d-fc86-473f-ae90-d9eb20d7a011}) of ThingClass elviMid</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="114"/>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="117"/>
<source>Serial number</source>
<extracomment>The name of the ParamType (ThingClass: elvi, Type: thing, ID: {987ddd33-cbcd-4716-bdaa-6824a5295d22})
----------
The name of the ParamType (ThingClass: elviMid, Type: thing, ID: {abc607a7-7dc5-48d4-b3d0-1545ddc63592})</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="120"/>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="123"/>
<source>Serial port</source>
<extracomment>The name of the ParamType (ThingClass: evbox, Type: thing, ID: {bce7c412-c19a-4e60-a11f-fe8308408abf})</extracomment>
<extracomment>The name of the ParamType (ThingClass: elvi, Type: thing, ID: {159fec55-e73d-4a9d-bbde-b2b44fe7f363})
----------
The name of the ParamType (ThingClass: elviMid, Type: thing, ID: {bce7c412-c19a-4e60-a11f-fe8308408abf})</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="76"/>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="126"/>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="129"/>
<source>Set maximum charging current</source>
<extracomment>The name of the ActionType ({cc9ae86d-fc86-473f-ae90-d9eb20d7a011}) of ThingClass evbox</extracomment>
<extracomment>The name of the ActionType ({186d792a-5bab-4144-837a-cbf5027de4fb}) of ThingClass elvi
----------
The name of the ActionType ({cc9ae86d-fc86-473f-ae90-d9eb20d7a011}) of ThingClass elviMid</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="79"/>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="132"/>
<source>Total consumed energy</source>
<extracomment>The name of the StateType ({9fd15d14-c228-4af6-85af-4cb171d6f9f0}) of ThingClass evbox</extracomment>
<extracomment>The name of the StateType ({9fd15d14-c228-4af6-85af-4cb171d6f9f0}) of ThingClass elviMid</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="82"/>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="135"/>
<location filename="../../../build/nymea-plugins-Desktop-Debug/evbox/plugininfo.h" line="138"/>
<source>Used phases</source>
<extracomment>The name of the StateType ({1120abe3-1878-4301-a701-014b24fd1e41}) of ThingClass evbox</extracomment>
<extracomment>The name of the StateType ({46781438-2a31-48d3-a140-11593888b268}) of ThingClass elvi
----------
The name of the StateType ({1120abe3-1878-4301-a701-014b24fd1e41}) of ThingClass elviMid</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>IntegrationPluginEVBox</name>
<message>
<location filename="../integrationpluginevbox.cpp" line="101"/>
<location filename="../integrationpluginevbox.cpp" line="56"/>
<source>No serial ports are available on this system. Please connect a RS485 adapter first.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../integrationpluginevbox.cpp" line="110"/>
<source>Unable to open the RS485 port. Please make sure the RS485 adapter is connected properly and not in use by anything else.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../integrationpluginevbox.cpp" line="133"/>
<source>Unable to open the RS485 port. Please make sure the RS485 adapter is connected properly.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../integrationpluginevbox.cpp" line="114"/>
<location filename="../integrationpluginevbox.cpp" line="144"/>
<location filename="../integrationpluginevbox.cpp" line="152"/>
<source>The EVBox is not responding.</source>
<translation type="unfinished"></translation>
</message>