Merge PR #752: EVerest: Update to networkdevice interface

master
jenkins 2025-03-30 20:36:30 +02:00
commit 359d713717
9 changed files with 281 additions and 197 deletions

View File

@ -34,14 +34,13 @@
EverestClient::EverestClient(QObject *parent)
: QObject{parent}
{
m_client = new MqttClient("nymea-" + QUuid::createUuid().toString().left(8), 300,
QString(), QByteArray(), Mqtt::QoS0, false, this);
m_client = new MqttClient("nymea-" + QUuid::createUuid().toString().left(8), 300, QString(), QByteArray(), Mqtt::QoS0, false, this);
connect(m_client, &MqttClient::disconnected, this, [this](){
qCDebug(dcEverest()) << "The MQTT client is now disconnected" << this;
if (!m_address.isNull()) {
if (m_monitor->reachable()) {
// Start the reconnect timer
qCDebug(dcEverest()) << "Starting reconnect timer for mqtt connection to" << m_address.toString();
qCDebug(dcEverest()) << "Starting reconnect timer for mqtt connection to" << m_monitor->networkDeviceInfo().address().toString();
m_reconnectTimer.start();
}
});
@ -68,7 +67,7 @@ EverestClient::EverestClient(QObject *parent)
return;
}
m_client->connectToHost(m_address.toString(), m_port);
m_client->connectToHost(m_monitor->networkDeviceInfo().address().toString(), m_port);
});
}
@ -123,26 +122,6 @@ Everest *EverestClient::getEverest(Thing *thing) const
return m_everests.value(thing);
}
QHostAddress EverestClient::address() const
{
return m_address;
}
void EverestClient::setAddress(const QHostAddress &address)
{
m_address = address;
}
MacAddress EverestClient::macAddress() const
{
return m_macAddress;
}
void EverestClient::setMacAddress(const MacAddress &macAddress)
{
m_macAddress = macAddress;
}
NetworkDeviceMonitor *EverestClient::monitor() const
{
return m_monitor;
@ -168,8 +147,8 @@ void EverestClient::start()
m_client->connectToHost(m_monitor->networkDeviceInfo().address().toString(), m_port);
}
} else {
qCDebug(dcEverest()) << "Connecting MQTT client to" << m_address.toString();
m_client->connectToHost(m_address.toString(), m_port);
qCDebug(dcEverest()) << "Connecting MQTT client to" << m_monitor->networkDeviceInfo().address().toString();
m_client->connectToHost(m_monitor->networkDeviceInfo().address().toString(), m_port);
// Note: on connected this will be stopped, otherwise we want the timer running
m_reconnectTimer.start();
@ -201,6 +180,8 @@ void EverestClient::onMonitorReachableChanged(bool reachable)
m_client->disconnectFromHost();
m_client->connectToHost(m_monitor->networkDeviceInfo().address().toString(), m_port);
} else {
m_reconnectTimer.stop();
}
}
@ -208,11 +189,18 @@ QDebug operator<<(QDebug debug, EverestClient *everestClient)
{
QDebugStateSaver saver(debug);
debug.nospace() << "EverestClient(";
if (everestClient->monitor()) {
debug.nospace() << everestClient->monitor()->networkDeviceInfo().macAddress() << ", ";
switch(everestClient->monitor()->monitorMode()) {
case NetworkDeviceInfo::MonitorModeMac:
debug.nospace() << everestClient->monitor()->networkDeviceInfo().macAddressInfos().constFirst() << ", ";
debug.nospace() << everestClient->monitor()->networkDeviceInfo().address().toString() << ", ";
} else {
debug.nospace() << everestClient->address().toString() << ", ";
break;
case NetworkDeviceInfo::MonitorModeHostName:
debug.nospace() << everestClient->monitor()->networkDeviceInfo().hostName() << ", ";
debug.nospace() << everestClient->monitor()->networkDeviceInfo().address().toString() << ", ";
break;
case NetworkDeviceInfo::MonitorModeIp:
debug.nospace() << everestClient->monitor()->networkDeviceInfo().address().toString() << ", ";
break;
}
debug.nospace() << "MQTT connected: " << everestClient->client()->isConnected() << ")";

View File

@ -59,12 +59,6 @@ public:
Everest *getEverest(Thing *thing) const;
QHostAddress address() const;
void setAddress(const QHostAddress &address);
MacAddress macAddress() const;
void setMacAddress(const MacAddress &macAddress);
NetworkDeviceMonitor *monitor() const;
void setMonitor(NetworkDeviceMonitor *monitor);
@ -83,12 +77,6 @@ private:
bool m_running = false;
QHash<Thing *, Everest *> m_everests;
// One of both must be defined, never both
QHostAddress m_address;
MacAddress m_macAddress;
// Available for mac based connections
NetworkDeviceMonitor *m_monitor = nullptr;
};

View File

@ -50,11 +50,11 @@ void EverestDiscovery::start()
NetworkDeviceDiscoveryReply *discoveryReply = m_networkDeviceDiscovery->discover();
connect(discoveryReply, &NetworkDeviceDiscoveryReply::networkDeviceInfoAdded, this, &EverestDiscovery::checkNetworkDevice);
connect(discoveryReply, &NetworkDeviceDiscoveryReply::hostAddressDiscovered, this, &EverestDiscovery::checkHostAddress);
connect(discoveryReply, &NetworkDeviceDiscoveryReply::finished, discoveryReply, &NetworkDeviceDiscoveryReply::deleteLater);
connect(discoveryReply, &NetworkDeviceDiscoveryReply::finished, this, [=](){
qCDebug(dcEverest()) << "Discovery: Network discovery finished. Found"
<< discoveryReply->networkDeviceInfos().count() << "network devices";
connect(discoveryReply, &NetworkDeviceDiscoveryReply::finished, this, [discoveryReply, this](){
qCDebug(dcEverest()) << "Discovery: Network device discovery finished. Found" << discoveryReply->networkDeviceInfos().count() << "network devices";
m_networkDeviceInfos = discoveryReply->networkDeviceInfos();
// Give the last connections added right before the network discovery finished a chance to check the device...
QTimer::singleShot(3000, this, [this](){
@ -65,8 +65,7 @@ void EverestDiscovery::start()
// For development, check local host
NetworkDeviceInfo localHostInfo;
localHostInfo.setAddress(QHostAddress::LocalHost);
checkNetworkDevice(localHostInfo);
checkHostAddress(QHostAddress::LocalHost);
}
void EverestDiscovery::startLocalhost()
@ -77,8 +76,7 @@ void EverestDiscovery::startLocalhost()
// For development, check local host
NetworkDeviceInfo localHostInfo;
localHostInfo.setAddress(QHostAddress::LocalHost);
checkNetworkDevice(localHostInfo);
checkHostAddress(QHostAddress::LocalHost);
}
QList<EverestDiscovery::Result> EverestDiscovery::results() const
@ -86,7 +84,7 @@ QList<EverestDiscovery::Result> EverestDiscovery::results() const
return m_results;
}
void EverestDiscovery::checkNetworkDevice(const NetworkDeviceInfo &networkDeviceInfo)
void EverestDiscovery::checkHostAddress(const QHostAddress &address)
{
MqttClient *client = new MqttClient("nymea-" + QUuid::createUuid().toString().left(8), 300,
QString(), QByteArray(), Mqtt::QoS0, false, this);
@ -94,9 +92,9 @@ void EverestDiscovery::checkNetworkDevice(const NetworkDeviceInfo &networkDevice
m_clients.append(client);
connect(client, &MqttClient::error, this, [this, client, networkDeviceInfo](QAbstractSocket::SocketError socketError){
connect(client, &MqttClient::error, this, [this, client, address](QAbstractSocket::SocketError socketError){
qCDebug(dcEverest()) << "Discovery: MQTT client error occurred on"
<< networkDeviceInfo.address().toString() << socketError
<< address.toString() << socketError
<< "...skip connection";
// We give up on the first error here
cleanupClient(client);
@ -110,11 +108,11 @@ void EverestDiscovery::checkNetworkDevice(const NetworkDeviceInfo &networkDevice
cleanupClient(client);
});
connect(client, &MqttClient::connected, this, [this, client, networkDeviceInfo](){
connect(client, &MqttClient::connected, this, [this, client, address](){
// We found a mqtt server, let's check if we find everest_api module on it...
qCDebug(dcEverest()) << "Discovery: Successfully connected to host" << networkDeviceInfo;
qCDebug(dcEverest()) << "Discovery: Successfully connected to host" << address.toString();
connect(client, &MqttClient::publishReceived, client, [this, client, networkDeviceInfo]
connect(client, &MqttClient::publishReceived, client, [this, client, address]
(const QString &topic, const QByteArray &payload, bool retained) {
qCDebug(dcEverest()) << "Discovery: Received publish on" << topic
@ -131,9 +129,9 @@ void EverestDiscovery::checkNetworkDevice(const NetworkDeviceInfo &networkDevice
}
QStringList connectors = jsonDoc.toVariant().toStringList();
qCInfo(dcEverest()) << "Discovery: Found Everest on" << networkDeviceInfo << connectors;
qCInfo(dcEverest()) << "Discovery: Found Everest on" << address.toString() << connectors;
Result result;
result.networkDeviceInfo = networkDeviceInfo;
result.address = address;
result.connectors = connectors;
m_results.append(result);
@ -159,10 +157,11 @@ void EverestDiscovery::checkNetworkDevice(const NetworkDeviceInfo &networkDevice
// });
});
qCDebug(dcEverest()) << "Discovery: Verifying host" << networkDeviceInfo;
client->connectToHost(networkDeviceInfo.address().toString(), 1883);
qCDebug(dcEverest()) << "Discovery: Verifying host" << address.toString();
client->connectToHost(address.toString(), 1883);
}
void EverestDiscovery::cleanupClient(MqttClient *client)
{
if (!m_clients.contains(client))
@ -186,6 +185,10 @@ void EverestDiscovery::finishDiscovery()
foreach (MqttClient *client, m_clients)
cleanupClient(client);
// Update results with final network device infos
for (int i = 0; i < m_results.count(); i++)
m_results[i].networkDeviceInfo = m_networkDeviceInfos.get(m_results.at(i).address);
qCInfo(dcEverest()) << "Discovery: Finished the discovery process. Found"
<< m_results.count() << "Everest instances in"
<< QTime::fromMSecsSinceStartOfDay(durationMilliSeconds).toString("mm:ss.zzz");

View File

@ -42,6 +42,7 @@ class EverestDiscovery : public QObject
Q_OBJECT
public:
typedef struct Result {
QHostAddress address;
QStringList connectors;
NetworkDeviceInfo networkDeviceInfo;
} Result;
@ -49,7 +50,6 @@ public:
explicit EverestDiscovery(NetworkDeviceDiscovery *networkDeviceDiscovery, QObject *parent = nullptr);
void start();
void startLocalhost();
QList<EverestDiscovery::Result> results() const;
@ -62,12 +62,13 @@ private:
QDateTime m_startDateTime;
QList<EverestDiscovery::Result> m_results;
QList<MqttClient *> m_clients;
NetworkDeviceInfos m_networkDeviceInfos;
bool m_localhostDiscovery = false;
QString m_everestApiModuleTopicConnectors = "everest_api/connectors";
void checkNetworkDevice(const NetworkDeviceInfo &networkDeviceInfo);
void checkHostAddress(const QHostAddress &address);
void cleanupClient(MqttClient *client);
void finishDiscovery();
};

View File

@ -34,17 +34,17 @@
#include <network/networkdevicediscovery.h>
IntegrationPluginTruffle::IntegrationPluginTruffle()
IntegrationPluginEverest::IntegrationPluginEverest()
{
}
void IntegrationPluginTruffle::init()
void IntegrationPluginEverest::init()
{
}
void IntegrationPluginTruffle::startMonitoringAutoThings()
void IntegrationPluginEverest::startMonitoringAutoThings()
{
// Check on localhost if there is any EVerest instance running and if we have to set up a thing for this EV charger
// Since this integration plugin is most luikly running on an EV charger running EVerest, the local instance should
@ -108,7 +108,7 @@ void IntegrationPluginTruffle::startMonitoringAutoThings()
discovery->startLocalhost();
}
void IntegrationPluginTruffle::discoverThings(ThingDiscoveryInfo *info)
void IntegrationPluginEverest::discoverThings(ThingDiscoveryInfo *info)
{
qCDebug(dcEverest()) << "Start discovering Everest systems in the local network";
if (!hardwareManager()->networkDeviceDiscovery()->available()) {
@ -127,22 +127,36 @@ void IntegrationPluginTruffle::discoverThings(ThingDiscoveryInfo *info)
foreach(const QString &connectorName, result.connectors) {
QString title = QString("Everest (%1)").arg(connectorName);
QString description = result.networkDeviceInfo.address().toString() +
" " + result.networkDeviceInfo.macAddress();
ThingDescriptor descriptor(everestThingClassId, title, description);
QString description;
MacAddressInfo macInfo;
switch (result.networkDeviceInfo.monitorMode()) {
case NetworkDeviceInfo::MonitorModeMac:
macInfo = result.networkDeviceInfo.macAddressInfos().constFirst();
description = result.networkDeviceInfo.address().toString();
if (!macInfo.vendorName().isEmpty())
description += " - " + result.networkDeviceInfo.macAddressInfos().constFirst().vendorName();
break;
case NetworkDeviceInfo::MonitorModeHostName:
description = result.networkDeviceInfo.address().toString();
break;
case NetworkDeviceInfo::MonitorModeIp:
description = "Interface: " + result.networkDeviceInfo.networkInterface().name();
break;
}
ThingDescriptor descriptor(everestThingClassId, title, description);
qCInfo(dcEverest()) << "Discovered -->" << title << description;
// Note: the network device info already provides the correct set of parameters in order to be used by the monitor
// depending on the possibilities within this network. It is not recommended to fill in all information available.
// Only the information available depending on the monitor mode are relevant for the monitor.
ParamList params;
params.append(Param(everestThingConnectorParamTypeId, connectorName));
if (!MacAddress(result.networkDeviceInfo.macAddress()).isNull())
params.append(Param(everestThingMacParamTypeId, result.networkDeviceInfo.macAddress()));
if (!result.networkDeviceInfo.address().isNull())
params.append(Param(everestThingAddressParamTypeId,
result.networkDeviceInfo.address().toString()));
params.append(Param(everestThingMacAddressParamTypeId, result.networkDeviceInfo.thingParamValueMacAddress()));
params.append(Param(everestThingHostNameParamTypeId, result.networkDeviceInfo.thingParamValueHostName()));
params.append(Param(everestThingAddressParamTypeId, result.networkDeviceInfo.thingParamValueAddress()));
descriptor.setParams(params);
// Let's check if we aleardy have a thing with those params
@ -179,77 +193,42 @@ void IntegrationPluginTruffle::discoverThings(ThingDiscoveryInfo *info)
discovery->start();
}
void IntegrationPluginTruffle::setupThing(ThingSetupInfo *info)
void IntegrationPluginEverest::setupThing(ThingSetupInfo *info)
{
Thing *thing = info->thing();
QHostAddress address(thing->paramValue(everestThingAddressParamTypeId).toString());
MacAddress macAddress(thing->paramValue(everestThingMacParamTypeId).toString());
MacAddress macAddress(thing->paramValue(everestThingMacAddressParamTypeId).toString());
QString hostName(thing->paramValue(everestThingHostNameParamTypeId).toString());
QString connector(thing->paramValue(everestThingConnectorParamTypeId).toString());
if (!macAddress.isNull()) {
EverestClient *everstClient = nullptr;
qCInfo(dcEverest()) << "Setting up everest for" << macAddress.toString() << connector;
EverestClient *everstClient = nullptr;
foreach (EverestClient *ec, m_everstClients) {
if (ec->macAddress() == macAddress) {
// We have already a client for this host
qCDebug(dcEverest()) << "Using existing" << ec;
everstClient = ec;
}
foreach (EverestClient *ec, m_everstClients) {
if (ec->monitor()->macAddress() == macAddress &&
ec->monitor()->hostName() == hostName &&
ec->monitor()->address() == address) {
// We have already a client for this host
qCDebug(dcEverest()) << "Using existing" << ec;
everstClient = ec;
}
if (!everstClient) {
qCDebug(dcEverest()) << "Creating new mac address based everst client";
everstClient = new EverestClient(this);
everstClient->setMacAddress(macAddress);
everstClient->setMonitor(hardwareManager()->networkDeviceDiscovery()->registerMonitor(macAddress));
m_everstClients.append(everstClient);
everstClient->start();
}
everstClient->addThing(thing);
m_thingClients.insert(thing, everstClient);
info->finish(Thing::ThingErrorNoError);
return;
} else {
qCInfo(dcEverest()) << "Setting up IP based everest for" << address.toString() << connector;
EverestClient *everstClient = nullptr;
foreach (EverestClient *ec, m_everstClients) {
if (ec->address().isNull())
continue;
if (ec->address() == address) {
// We have already a client for this host
qCDebug(dcEverest()) << "Using existing" << ec;
everstClient = ec;
break;
}
}
if (!everstClient) {
qCDebug(dcEverest()) << "Creating new IP based everst client";
everstClient = new EverestClient(this);
everstClient->setAddress(address);
m_everstClients.append(everstClient);
everstClient->start();
}
everstClient->addThing(thing);
m_thingClients.insert(thing, everstClient);
info->finish(Thing::ThingErrorNoError);
return;
}
if (!everstClient) {
everstClient = new EverestClient(this);
everstClient->setMonitor(hardwareManager()->networkDeviceDiscovery()->registerMonitor(thing));
m_everstClients.append(everstClient);
qCDebug(dcEverest()) << "Created new" << everstClient;
everstClient->start();
}
everstClient->addThing(thing);
m_thingClients.insert(thing, everstClient);
info->finish(Thing::ThingErrorNoError);
return;
}
void IntegrationPluginTruffle::executeAction(ThingActionInfo *info)
void IntegrationPluginEverest::executeAction(ThingActionInfo *info)
{
qCDebug(dcEverest()) << "Executing action for thing" << info->thing()
<< info->action().actionTypeId().toString() << info->action().params();
@ -298,7 +277,7 @@ void IntegrationPluginTruffle::executeAction(ThingActionInfo *info)
info->finish(Thing::ThingErrorNoError);
}
void IntegrationPluginTruffle::thingRemoved(Thing *thing)
void IntegrationPluginEverest::thingRemoved(Thing *thing)
{
qCDebug(dcEverest()) << "Remove thing" << thing;
if (thing->thingClassId() == everestThingClassId) {
@ -308,8 +287,16 @@ void IntegrationPluginTruffle::thingRemoved(Thing *thing)
qCDebug(dcEverest()) << "Deleting" << everestClient << "since there is no thing left";
// No more things related to this client, we can delete it
m_everstClients.removeAll(everestClient);
// Unregister monitor
if (everestClient->monitor())
hardwareManager()->networkDeviceDiscovery()->unregisterMonitor(everestClient->monitor());
everestClient->deleteLater();
}
}
}

View File

@ -38,7 +38,7 @@
#include <mqttclient.h>
class IntegrationPluginTruffle: public IntegrationPlugin
class IntegrationPluginEverest: public IntegrationPlugin
{
Q_OBJECT
@ -46,7 +46,7 @@ class IntegrationPluginTruffle: public IntegrationPlugin
Q_INTERFACES(IntegrationPlugin)
public:
explicit IntegrationPluginTruffle();
explicit IntegrationPluginEverest();
void init() override;
void startMonitoringAutoThings() override;

View File

@ -14,23 +14,29 @@
"id": "965cbe0d-088c-42a2-965d-ceafbb8b01e9",
"setupMethod": "JustAdd",
"createMethods": ["discovery", "user"],
"interfaces": [ "evcharger", "smartmeterconsumer", "connectable" ],
"interfaces": [ "evcharger", "smartmeterconsumer", "networkdevice", "connectable" ],
"paramTypes": [
{
"id": "f1f3e9a7-3a35-4089-8869-b9bfd64659e5",
"name": "hostName",
"displayName": "Host name",
"type": "QString"
},
{
"id": "911b6fa3-010c-486e-8251-71a6aa21adb3",
"name": "address",
"displayName": "Host address",
"displayName": "IP address",
"type": "QString",
"inputType": "IPv4Address",
"defaultValue": ""
},
{
"id": "cb9517ef-1ae2-49c9-9036-0c6e15bb3652",
"name": "mac",
"name": "macAddress",
"displayName": "MAC address",
"type": "QString",
"readOnly": true,
"defaultValue": "00:00:00:00:00:00"
"defaultValue": "00:00:00:00:00:00",
"readOnly": true
},
{
"id": "73f27e36-6f68-40a9-8805-22e88911736c",

View File

@ -0,0 +1,138 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="de">
<context>
<name>IntegrationPluginEverest</name>
<message>
<location filename="../integrationplugineverest.cpp" line="116"/>
<source>The network device discovery is not available.</source>
<translation>Die Netzwersuche ist auf diesem System nicht verfügbar.</translation>
</message>
</context>
<context>
<name>everest</name>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="47"/>
<source>Active phases</source>
<extracomment>The name of the StateType ({9597c21f-d8a6-424d-8e35-bdd69dc57d35}) of ThingClass everest</extracomment>
<translation>Aktive Phasen</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="50"/>
<source>Chargebyte GmbH</source>
<extracomment>The name of the vendor ({07ba8a98-799f-4a6e-a8d9-b45cd38dbcc5})</extracomment>
<translation>Chargebyte GmbH</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="53"/>
<source>Charging</source>
<extracomment>The name of the StateType ({79f44541-7967-4394-bb50-8bf69e4115ca}) of ThingClass everest</extracomment>
<translation>Lade</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="56"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="59"/>
<source>Charging enabled</source>
<extracomment>The name of the ParamType (ThingClass: everest, ActionType: power, ID: {018d1f2f-4ede-4ab0-b76e-369684cd0da5})
----------
The name of the StateType ({018d1f2f-4ede-4ab0-b76e-369684cd0da5}) of ThingClass everest</extracomment>
<translation>Ladefreigabe</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="62"/>
<source>Connected</source>
<extracomment>The name of the StateType ({2104641b-1004-4637-8eca-108f53dcb402}) of ThingClass everest</extracomment>
<translation>Verbunden</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="65"/>
<source>Connector name</source>
<extracomment>The name of the ParamType (ThingClass: everest, Type: thing, ID: {73f27e36-6f68-40a9-8805-22e88911736c})</extracomment>
<translation>Konnektorname</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="68"/>
<source>Current power</source>
<extracomment>The name of the StateType ({120a4028-b01c-4a31-8d9b-bf34f602a095}) of ThingClass everest</extracomment>
<translation>Aktuelle Leistung</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="71"/>
<source>Enable or disable charging</source>
<extracomment>The name of the ActionType ({018d1f2f-4ede-4ab0-b76e-369684cd0da5}) of ThingClass everest</extracomment>
<translation>Laden starten oder stoppen</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="74"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="77"/>
<source>Everest</source>
<extracomment>The name of the ThingClass ({965cbe0d-088c-42a2-965d-ceafbb8b01e9})
----------
The name of the plugin everest ({27e4b1c4-bc27-4699-84ef-41af1a9e1cea})</extracomment>
<translation>Everest</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="80"/>
<source>Fan speed</source>
<extracomment>The name of the StateType ({2ca678ff-6d6f-49cf-b265-545ed15c12b7}) of ThingClass everest</extracomment>
<translation>Lüfter Geschwindigkeit</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="83"/>
<source>Host address</source>
<extracomment>The name of the ParamType (ThingClass: everest, Type: thing, ID: {911b6fa3-010c-486e-8251-71a6aa21adb3})</extracomment>
<translation>IP Adresse</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="86"/>
<source>MAC address</source>
<extracomment>The name of the ParamType (ThingClass: everest, Type: thing, ID: {cb9517ef-1ae2-49c9-9036-0c6e15bb3652})</extracomment>
<translation>MAC-Adresse</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="89"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="92"/>
<source>Maximum charging current</source>
<extracomment>The name of the ParamType (ThingClass: everest, ActionType: maxChargingCurrent, ID: {d5d71037-a2b1-4abe-be75-883e6fef75c6})
----------
The name of the StateType ({d5d71037-a2b1-4abe-be75-883e6fef75c6}) of ThingClass everest</extracomment>
<translation>Maxmialer Ladestrom</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="95"/>
<source>Plugged in</source>
<extracomment>The name of the StateType ({5b963e54-15f0-459f-8754-d172f2febee2}) of ThingClass everest</extracomment>
<translation>Fahrzeug angesteckt</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="98"/>
<source>Session energy</source>
<extracomment>The name of the StateType ({b7455160-98e4-47ad-a1db-f3fbda009aa2}) of ThingClass everest</extracomment>
<translation>Sitzungsenergie</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="101"/>
<source>Set maximum charging current</source>
<extracomment>The name of the ActionType ({d5d71037-a2b1-4abe-be75-883e6fef75c6}) of ThingClass everest</extracomment>
<translation>Setze maximalen Ladestrom</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="104"/>
<source>State</source>
<extracomment>The name of the StateType ({75a52f23-7d65-4b33-9262-99085beb7ee2}) of ThingClass everest</extracomment>
<translation>Zustand</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="107"/>
<source>Temperature</source>
<extracomment>The name of the StateType ({b7c76f2d-520a-4bb1-9bd3-d6ffcbef73b6}) of ThingClass everest</extracomment>
<translation>Temperatur</translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="110"/>
<source>Total energy</source>
<extracomment>The name of the StateType ({8946aee7-caa1-47cc-bef9-37ca4c8b5e49}) of ThingClass everest</extracomment>
<translation>Gesamtenergie</translation>
</message>
</context>
</TS>

View File

@ -2,9 +2,9 @@
<!DOCTYPE TS>
<TS version="2.1">
<context>
<name>IntegrationPluginTruffle</name>
<name>IntegrationPluginEverest</name>
<message>
<location filename="../integrationplugineverest.cpp" line="47"/>
<location filename="../integrationplugineverest.cpp" line="116"/>
<source>The network device discovery is not available.</source>
<translation type="unfinished"></translation>
</message>
@ -12,38 +12,26 @@
<context>
<name>everest</name>
<message>
<location filename="../../build-everest-Desktop-Debug/plugininfo.h" line="50"/>
<source>1</source>
<extracomment>The name of a possible value of StateType {19abdab4-5607-4f6f-9f73-1c42ffe8939f} of ThingClass everest</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../build-everest-Desktop-Debug/plugininfo.h" line="53"/>
<source>3</source>
<extracomment>The name of a possible value of StateType {19abdab4-5607-4f6f-9f73-1c42ffe8939f} of ThingClass everest</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../build-everest-Desktop-Debug/plugininfo.h" line="56"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="47"/>
<source>Active phases</source>
<extracomment>The name of the StateType ({9597c21f-d8a6-424d-8e35-bdd69dc57d35}) of ThingClass everest</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../build-everest-Desktop-Debug/plugininfo.h" line="59"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="50"/>
<source>Chargebyte GmbH</source>
<extracomment>The name of the vendor ({07ba8a98-799f-4a6e-a8d9-b45cd38dbcc5})</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../build-everest-Desktop-Debug/plugininfo.h" line="62"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="53"/>
<source>Charging</source>
<extracomment>The name of the StateType ({79f44541-7967-4394-bb50-8bf69e4115ca}) of ThingClass everest</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../build-everest-Desktop-Debug/plugininfo.h" line="65"/>
<location filename="../../build-everest-Desktop-Debug/plugininfo.h" line="68"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="56"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="59"/>
<source>Charging enabled</source>
<extracomment>The name of the ParamType (ThingClass: everest, ActionType: power, ID: {018d1f2f-4ede-4ab0-b76e-369684cd0da5})
----------
@ -51,41 +39,32 @@ The name of the StateType ({018d1f2f-4ede-4ab0-b76e-369684cd0da5}) of ThingClass
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../build-everest-Desktop-Debug/plugininfo.h" line="71"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="62"/>
<source>Connected</source>
<extracomment>The name of the StateType ({2104641b-1004-4637-8eca-108f53dcb402}) of ThingClass everest</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../build-everest-Desktop-Debug/plugininfo.h" line="74"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="65"/>
<source>Connector name</source>
<extracomment>The name of the ParamType (ThingClass: everest, Type: thing, ID: {73f27e36-6f68-40a9-8805-22e88911736c})</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../build-everest-Desktop-Debug/plugininfo.h" line="77"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="68"/>
<source>Current power</source>
<extracomment>The name of the StateType ({120a4028-b01c-4a31-8d9b-bf34f602a095}) of ThingClass everest</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../build-everest-Desktop-Debug/plugininfo.h" line="80"/>
<location filename="../../build-everest-Desktop-Debug/plugininfo.h" line="83"/>
<source>Desired phase count</source>
<extracomment>The name of the ParamType (ThingClass: everest, ActionType: desiredPhaseCount, ID: {19abdab4-5607-4f6f-9f73-1c42ffe8939f})
----------
The name of the StateType ({19abdab4-5607-4f6f-9f73-1c42ffe8939f}) of ThingClass everest</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../build-everest-Desktop-Debug/plugininfo.h" line="86"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="71"/>
<source>Enable or disable charging</source>
<extracomment>The name of the ActionType ({018d1f2f-4ede-4ab0-b76e-369684cd0da5}) of ThingClass everest</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../build-everest-Desktop-Debug/plugininfo.h" line="89"/>
<location filename="../../build-everest-Desktop-Debug/plugininfo.h" line="92"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="74"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="77"/>
<source>Everest</source>
<extracomment>The name of the ThingClass ({965cbe0d-088c-42a2-965d-ceafbb8b01e9})
----------
@ -93,26 +72,26 @@ The name of the plugin everest ({27e4b1c4-bc27-4699-84ef-41af1a9e1cea})</extraco
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../build-everest-Desktop-Debug/plugininfo.h" line="95"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="80"/>
<source>Fan speed</source>
<extracomment>The name of the StateType ({2ca678ff-6d6f-49cf-b265-545ed15c12b7}) of ThingClass everest</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../build-everest-Desktop-Debug/plugininfo.h" line="98"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="83"/>
<source>Host address</source>
<extracomment>The name of the ParamType (ThingClass: everest, Type: thing, ID: {911b6fa3-010c-486e-8251-71a6aa21adb3})</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../build-everest-Desktop-Debug/plugininfo.h" line="101"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="86"/>
<source>MAC address</source>
<extracomment>The name of the ParamType (ThingClass: everest, Type: thing, ID: {cb9517ef-1ae2-49c9-9036-0c6e15bb3652})</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../build-everest-Desktop-Debug/plugininfo.h" line="104"/>
<location filename="../../build-everest-Desktop-Debug/plugininfo.h" line="107"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="89"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="92"/>
<source>Maximum charging current</source>
<extracomment>The name of the ParamType (ThingClass: everest, ActionType: maxChargingCurrent, ID: {d5d71037-a2b1-4abe-be75-883e6fef75c6})
----------
@ -120,43 +99,37 @@ The name of the StateType ({d5d71037-a2b1-4abe-be75-883e6fef75c6}) of ThingClass
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../build-everest-Desktop-Debug/plugininfo.h" line="110"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="95"/>
<source>Plugged in</source>
<extracomment>The name of the StateType ({5b963e54-15f0-459f-8754-d172f2febee2}) of ThingClass everest</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../build-everest-Desktop-Debug/plugininfo.h" line="113"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="98"/>
<source>Session energy</source>
<extracomment>The name of the StateType ({b7455160-98e4-47ad-a1db-f3fbda009aa2}) of ThingClass everest</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../build-everest-Desktop-Debug/plugininfo.h" line="116"/>
<source>Set desired phase count</source>
<extracomment>The name of the ActionType ({19abdab4-5607-4f6f-9f73-1c42ffe8939f}) of ThingClass everest</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../build-everest-Desktop-Debug/plugininfo.h" line="119"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="101"/>
<source>Set maximum charging current</source>
<extracomment>The name of the ActionType ({d5d71037-a2b1-4abe-be75-883e6fef75c6}) of ThingClass everest</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../build-everest-Desktop-Debug/plugininfo.h" line="122"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="104"/>
<source>State</source>
<extracomment>The name of the StateType ({75a52f23-7d65-4b33-9262-99085beb7ee2}) of ThingClass everest</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../build-everest-Desktop-Debug/plugininfo.h" line="125"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="107"/>
<source>Temperature</source>
<extracomment>The name of the StateType ({b7c76f2d-520a-4bb1-9bd3-d6ffcbef73b6}) of ThingClass everest</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../build-everest-Desktop-Debug/plugininfo.h" line="128"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/everest/plugininfo.h" line="110"/>
<source>Total energy</source>
<extracomment>The name of the StateType ({8946aee7-caa1-47cc-bef9-37ca4c8b5e49}) of ThingClass everest</extracomment>
<translation type="unfinished"></translation>