Add MQTT based go-eCharger plugin

master
Simon Stürz 2021-05-28 15:54:24 +02:00
parent 88729479ee
commit cb3076ee6e
11 changed files with 982 additions and 0 deletions

15
debian/control vendored
View File

@ -376,6 +376,21 @@ Description: nymea.io plugin for gpio
This package will install the nymea.io plugin for gpio This package will install the nymea.io plugin for gpio
Package: nymea-plugin-goecharger
Architecture: any
Depends: ${shlibs:Depends},
${misc:Depends},
nymea-plugins-translations,
Description: nymea.io plugin for the go-eCharger wallbox
The nymea daemon is a plugin based IoT (Internet of Things) server. The
server works like a translator for devices, things and services and
allows them to interact.
With the powerful rule engine you are able to connect any device available
in the system and create individual scenes and behaviors for your environment.
.
This package will install the nymea.io plugin for the go-eCharger wallbox
Package: nymea-plugin-homeconnect Package: nymea-plugin-homeconnect
Architecture: any Architecture: any
Depends: ${shlibs:Depends}, Depends: ${shlibs:Depends},

View File

@ -0,0 +1 @@
usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationplugingoecharger.so

25
goecharger/README.md Normal file
View File

@ -0,0 +1,25 @@
# go-eCharger
nymea plug-in for go-eCharger smart wallbox for electic vehicles.
Once you connect to the go-eCharger, nymea will configure the wallbox to use MQTT and send information to nymea.
Please make sure no ther service is using the custom MQTT server in the local network, otherwise they will exclude each other, depending who comes first.
## Supported Things
* go-eCharger Home
## Requirements
* The package "nymea-plugin-goecharger" must be installed.
* The device must be in the same local area network as nymea.
* The Firmware version has to be at least `030.00`.
## Developer documentation
The documentation of the API can be found [here](https://github.com/goecharger/go-eCharger-API-v1).
## More
https://go-e.co/

BIN
goecharger/go-e-logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

13
goecharger/goecharger.pro Normal file
View File

@ -0,0 +1,13 @@
include(../plugins.pri)
TARGET = $$qtLibraryTarget(nymea_integrationplugingoecharger)
QT += network
PKGCONFIG += nymea-mqtt
SOURCES += \
integrationplugingoecharger.cpp \
HEADERS += \
integrationplugingoecharger.h \

View File

@ -0,0 +1,381 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
* Copyright 2013 - 2021, 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 "plugininfo.h"
#include "integrationplugingoecharger.h"
#include <QUrlQuery>
#include <QHostAddress>
#include <QDataStream>
#include <QJsonDocument>
#include <QJsonParseError>
// Modbus documentation: https://github.com/goecharger/go-eCharger-API-v1
IntegrationPluginGoECharger::IntegrationPluginGoECharger()
{
}
void IntegrationPluginGoECharger::discoverThings(ThingDiscoveryInfo *info)
{
// TODO: perform nmap discovery and filter for "go-eCharger" hosts
info->finish(Thing::ThingErrorNoError);
}
void IntegrationPluginGoECharger::setupThing(ThingSetupInfo *info)
{
Thing *thing = info->thing();
if (thing->thingClassId() == goeHomeThingClassId) {
QHostAddress address = QHostAddress(thing->paramValue(goeHomeThingIpAddressParamTypeId).toString());
QUrl requestUrl;
requestUrl.setScheme("http");
requestUrl.setHost(address.toString());
requestUrl.setPath("/status");
QNetworkRequest request(requestUrl);
QNetworkReply *reply = hardwareManager()->networkManager()->get(request);
connect(reply, &QNetworkReply::finished, thing, [=](){
if (reply->error() != QNetworkReply::NoError) {
qCWarning(dcGoECharger()) << "HTTP status reply returned error:" << reply->errorString();
info->finish(Thing::ThingErrorHardwareNotAvailable, QT_TR_NOOP("The wallbox does not seem to be reachable."));
return;
}
QByteArray data = reply->readAll();
QJsonParseError error;
QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &error);
if (error.error != QJsonParseError::NoError) {
qCWarning(dcGoECharger()) << "Failed to parse status data for thing " << thing->name() << qUtf8Printable(data) << error.errorString();
info->finish(Thing::ThingErrorHardwareFailure, QT_TR_NOOP("The wallbox returned invalid data."));
return;
}
qCDebug(dcGoECharger()) << "Received" << qUtf8Printable(jsonDoc.toJson());
// Verify mqtt client and set it up
setupMqttChannel(info, address, jsonDoc.toVariant().toMap());
});
return;
}
Q_ASSERT_X(false, "setupThing", QString("Unhandled thingClassId: %1").arg(thing->thingClassId().toString()).toUtf8());
}
void IntegrationPluginGoECharger::thingRemoved(Thing *thing)
{
if (m_channels.contains(thing)) {
hardwareManager()->mqttProvider()->releaseChannel(m_channels.take(thing));
}
}
void IntegrationPluginGoECharger::executeAction(ThingActionInfo *info)
{
//Thing *thing = info->thing();
//Action action = info->action();
info->finish(Thing::ThingErrorNoError);
}
void IntegrationPluginGoECharger::onClientConnected(MqttChannel *channel)
{
Thing *thing = m_channels.key(channel);
if (!thing) {
qCWarning(dcGoECharger()) << "Received a client connect for an unknown thing. Ignoring the event.";
return;
}
qCDebug(dcGoECharger()) << thing << "connected";
thing->setStateValue(goeHomeConnectedStateTypeId, true);
}
void IntegrationPluginGoECharger::onClientDisconnected(MqttChannel *channel)
{
Thing *thing = m_channels.key(channel);
if (!thing) {
qCWarning(dcGoECharger()) << "Received a client disconnect for an unknown thing. Ignoring the event.";
return;
}
qCDebug(dcGoECharger()) << thing << "connected";
thing->setStateValue(goeHomeConnectedStateTypeId, false);
}
void IntegrationPluginGoECharger::onPublishReceived(MqttChannel *channel, const QString &topic, const QByteArray &payload)
{
Thing *thing = m_channels.key(channel);
if (!thing) {
qCWarning(dcGoECharger()) << "Received a MQTT client publish from an unknown thing. Ignoring the event.";
return;
}
qCDebug(dcGoECharger()) << thing << "publish received" << topic << qUtf8Printable(payload);
}
void IntegrationPluginGoECharger::update(Thing *thing, const QVariantMap &statusMap)
{
if (thing->thingClassId() == goeHomeThingClassId) {
// Parse status map and update states...
CarState carState = static_cast<CarState>(statusMap.value("car").toUInt());
switch (carState) {
case CarStateReadyNoCar:
thing->setStateValue(goeHomeCarStatusStateTypeId, "Ready but no vehicle connected");
break;
case CarStateCharging:
thing->setStateValue(goeHomeCarStatusStateTypeId, "Vehicle loads");
break;
case CarStateWaitForCar:
thing->setStateValue(goeHomeCarStatusStateTypeId, "Waiting for vehicle");
break;
case CarStateChargedCarConnected:
thing->setStateValue(goeHomeCarStatusStateTypeId, "Charging finished and vehicle still connected");
break;
}
Access accessStatus = static_cast<Access>(statusMap.value("ast").toUInt());
switch (accessStatus) {
case AccessOpen:
thing->setStateValue(goeHomeAccessStateTypeId, "Open");
break;
case AccessRfid:
thing->setStateValue(goeHomeAccessStateTypeId, "RFID");
break;
case AccessAuto:
thing->setStateValue(goeHomeAccessStateTypeId, "Automatic");
break;
}
thing->setStateValue(goeHomeTotalEnergyStateTypeId, statusMap.value("eto").toUInt() / 10.0);
thing->setStateValue(goeHomeChargeEnergyStateTypeId, statusMap.value("dws").toUInt() / 360000.0);
thing->setStateValue(goeHomePowerStateTypeId, (statusMap.value("alw").toUInt() == 0 ? false : true));
thing->setStateValue(goeHomeUpdateAvailableStateTypeId, (statusMap.value("upd").toUInt() == 0 ? false : true));
thing->setStateValue(goeHomeCloudStateTypeId, (statusMap.value("cdi").toUInt() == 0 ? false : true));
thing->setStateValue(goeHomeFirmwareVersionStateTypeId, statusMap.value("fwv").toString());
thing->setStateValue(goeHomeMaxChargingCurrentStateTypeId, statusMap.value("ama").toUInt());
thing->setStateValue(goeHomeSerialNumberStateTypeId, statusMap.value("sse").toString());
}
}
QNetworkRequest IntegrationPluginGoECharger::buildConfigurationRequest(const QHostAddress &address, const QString &configuration)
{
QUrl requestUrl;
requestUrl.setScheme("http");
requestUrl.setHost(address.toString());
requestUrl.setPath("/mqtt");
QUrlQuery query;
query.addQueryItem("payload", configuration);
requestUrl.setQuery(query);
return QNetworkRequest(requestUrl);
}
void IntegrationPluginGoECharger::setupMqttChannel(ThingSetupInfo *info, const QHostAddress &address, const QVariantMap &statusMap)
{
Thing *thing = info->thing();
QString statusTopic = QString("go-eCharger/%1/status").arg(statusMap.value("sse").toString());
qCDebug(dcGoECharger()) << "Setting up mqtt channel for" << thing << address.toString() << statusTopic;
MqttChannel *channel = hardwareManager()->mqttProvider()->createChannel(thing->id().toString(), address, {statusTopic});
if (!channel) {
qCWarning(dcGoECharger()) << "Failed to create MQTT channel for" << thing;
info->finish(Thing::ThingErrorHardwareFailure, QT_TR_NOOP("Error creating MQTT channel. Please check MQTT server settings."));
return;
}
m_channels.insert(thing, channel);
connect(channel, &MqttChannel::clientConnected, this, &IntegrationPluginGoECharger::onClientConnected);
connect(channel, &MqttChannel::clientDisconnected, this, &IntegrationPluginGoECharger::onClientDisconnected);
connect(channel, &MqttChannel::publishReceived, this, &IntegrationPluginGoECharger::onPublishReceived);
// Configure the mqtt server on the go-e
QNetworkRequest request = buildConfigurationRequest(address, QString("mcs=%1").arg(channel->serverAddress().toString()));
qCDebug(dcGoECharger()) << "Configure nymea mqtt server address on" << thing << request.url().toString();
QNetworkReply *reply = hardwareManager()->networkManager()->sendCustomRequest(request, "SET");
connect(reply, &QNetworkReply::finished, thing, [=](){
reply->deleteLater();
if (reply->error() != QNetworkReply::NoError) {
qCWarning(dcGoECharger()) << "HTTP status reply returned error:" << reply->errorString();
info->finish(Thing::ThingErrorHardwareNotAvailable, QT_TR_NOOP("The wallbox does not seem to be reachable."));
return;
}
QByteArray data = reply->readAll();
QJsonParseError error;
QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &error);
if (error.error != QJsonParseError::NoError) {
qCWarning(dcGoECharger()) << "Failed to parse status data for thing " << thing->name() << qUtf8Printable(data) << error.errorString();
info->finish(Thing::ThingErrorHardwareFailure, QT_TR_NOOP("The wallbox returned invalid data."));
return;
}
// Verify response matches the requsted value
if (jsonDoc.toVariant().toMap().value("mcs").toString() != channel->serverAddress().toString()) {
qCWarning(dcGoECharger()) << "Configured MQTT server but the response does not match with requested server address" << channel->serverAddress().toString();
info->finish(Thing::ThingErrorHardwareNotAvailable, QT_TR_NOOP("Error while configuring MQTT settings on the wallbox."));
return;
} else {
qCDebug(dcGoECharger()) << "Configured successfully MQTT server" << thing << channel->serverAddress().toString();
}
QNetworkRequest request = buildConfigurationRequest(address, QString("mcp=%1").arg(channel->serverPort()));
qCDebug(dcGoECharger()) << "Configure nymea mqtt server port on" << thing << request.url().toString();
QNetworkReply *reply = hardwareManager()->networkManager()->sendCustomRequest(request, "SET");
connect(reply, &QNetworkReply::finished, thing, [=](){
reply->deleteLater();
if (reply->error() != QNetworkReply::NoError) {
qCWarning(dcGoECharger()) << "HTTP status reply returned error:" << reply->errorString();
info->finish(Thing::ThingErrorHardwareNotAvailable, QT_TR_NOOP("The wallbox does not seem to be reachable."));
return;
}
QByteArray data = reply->readAll();
QJsonParseError error;
QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &error);
if (error.error != QJsonParseError::NoError) {
qCWarning(dcGoECharger()) << "Failed to parse status data for thing " << thing->name() << qUtf8Printable(data) << error.errorString();
info->finish(Thing::ThingErrorHardwareFailure, QT_TR_NOOP("The wallbox returned invalid data."));
return;
}
// Verify response matches the requsted value
if (jsonDoc.toVariant().toMap().value("mcp").toUInt() != channel->serverPort()) {
qCWarning(dcGoECharger()) << "Configured MQTT server but the response does not match with requested server port" << channel->serverPort();
info->finish(Thing::ThingErrorHardwareNotAvailable, QT_TR_NOOP("Error while configuring MQTT settings on the wallbox."));
return;
} else {
qCDebug(dcGoECharger()) << "Configured successfully MQTT server" << thing << channel->serverPort();
}
QNetworkRequest request = buildConfigurationRequest(address, QString("mcu=%1").arg(channel->username()));
qCDebug(dcGoECharger()) << "Configure nymea mqtt server user name on" << thing << request.url().toString();
QNetworkReply *reply = hardwareManager()->networkManager()->sendCustomRequest(request, "SET");
connect(reply, &QNetworkReply::finished, thing, [=](){
reply->deleteLater();
if (reply->error() != QNetworkReply::NoError) {
qCWarning(dcGoECharger()) << "HTTP status reply returned error:" << reply->errorString();
info->finish(Thing::ThingErrorHardwareNotAvailable, QT_TR_NOOP("The wallbox does not seem to be reachable."));
return;
}
QByteArray data = reply->readAll();
QJsonParseError error;
QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &error);
if (error.error != QJsonParseError::NoError) {
qCWarning(dcGoECharger()) << "Failed to parse status data for thing " << thing->name() << qUtf8Printable(data) << error.errorString();
info->finish(Thing::ThingErrorHardwareFailure, QT_TR_NOOP("The wallbox returned invalid data."));
return;
}
// Verify response matches the requsted value
if (jsonDoc.toVariant().toMap().value("mcu").toString() != channel->username()) {
qCWarning(dcGoECharger()) << "Configured MQTT server but the response does not match with requested server username" << channel->username();
info->finish(Thing::ThingErrorHardwareNotAvailable, QT_TR_NOOP("Error while configuring MQTT settings on the wallbox."));
return;
} else {
qCDebug(dcGoECharger()) << "Configured successfully MQTT server" << thing << channel->username();
}
QNetworkRequest request = buildConfigurationRequest(address, QString("mck=%1").arg(channel->password()));
qCDebug(dcGoECharger()) << "Configure nymea mqtt server password on" << thing << request.url().toString();
QNetworkReply *reply = hardwareManager()->networkManager()->sendCustomRequest(request, "SET");
connect(reply, &QNetworkReply::finished, thing, [=](){
reply->deleteLater();
if (reply->error() != QNetworkReply::NoError) {
qCWarning(dcGoECharger()) << "HTTP status reply returned error:" << reply->errorString();
info->finish(Thing::ThingErrorHardwareNotAvailable, QT_TR_NOOP("The wallbox does not seem to be reachable."));
return;
}
QByteArray data = reply->readAll();
QJsonParseError error;
QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &error);
if (error.error != QJsonParseError::NoError) {
qCWarning(dcGoECharger()) << "Failed to parse status data for thing " << thing->name() << qUtf8Printable(data) << error.errorString();
info->finish(Thing::ThingErrorHardwareFailure, QT_TR_NOOP("The wallbox returned invalid data."));
return;
}
// Verify response matches the requsted value
if (jsonDoc.toVariant().toMap().value("mck").toString() != channel->password()) {
qCWarning(dcGoECharger()) << "Configured MQTT server but the response does not match with requested server password" << channel->password();
info->finish(Thing::ThingErrorHardwareNotAvailable, QT_TR_NOOP("Error while configuring MQTT settings on the wallbox."));
return;
} else {
qCDebug(dcGoECharger()) << "Configured successfully MQTT server" << thing << channel->password();
}
QNetworkRequest request = buildConfigurationRequest(address, QString("mce=1"));
qCDebug(dcGoECharger()) << "Enable custom mqtt server on" << thing << request.url().toString();
QNetworkReply *reply = hardwareManager()->networkManager()->sendCustomRequest(request, "SET");
connect(reply, &QNetworkReply::finished, thing, [=](){
reply->deleteLater();
if (reply->error() != QNetworkReply::NoError) {
qCWarning(dcGoECharger()) << "HTTP status reply returned error:" << reply->errorString();
info->finish(Thing::ThingErrorHardwareNotAvailable, QT_TR_NOOP("The wallbox does not seem to be reachable."));
return;
}
QByteArray data = reply->readAll();
QJsonParseError error;
QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &error);
if (error.error != QJsonParseError::NoError) {
qCWarning(dcGoECharger()) << "Failed to parse status data for thing " << thing->name() << qUtf8Printable(data) << error.errorString();
info->finish(Thing::ThingErrorHardwareFailure, QT_TR_NOOP("The wallbox returned invalid data."));
return;
}
// Verify response matches the requsted value
QVariantMap statusMap = jsonDoc.toVariant().toMap();
if (statusMap.value("mce").toInt() != 1) {
qCWarning(dcGoECharger()) << "Configured MQTT server but the response does not match with requested value 1";
info->finish(Thing::ThingErrorHardwareNotAvailable, QT_TR_NOOP("Error while configuring MQTT settings on the wallbox."));
return;
} else {
qCDebug(dcGoECharger()) << "Configured successfully MQTT server enabled" << thing;
}
info->finish(Thing::ThingErrorNoError);
qCDebug(dcGoECharger()) << "Configuration of MQTT for" << thing << "finished successfully";
// Update states...
update(thing, statusMap);
});
});
});
});
});
}

View File

@ -0,0 +1,102 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
* Copyright 2013 - 2021, 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 INTEGRATIONPLUGINGOECHARGER_H
#define INTEGRATIONPLUGINGOECHARGER_H
#include <QUuid>
#include <network/networkaccessmanager.h>
#include <network/mqtt/mqttchannel.h>
#include <network/mqtt/mqttprovider.h>
#include <integrations/integrationplugin.h>
#include <plugintimer.h>
class IntegrationPluginGoECharger: public IntegrationPlugin
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "io.nymea.IntegrationPlugin" FILE "integrationplugingoecharger.json")
Q_INTERFACES(IntegrationPlugin)
public:
enum CarState {
CarStateReadyNoCar = 1,
CarStateCharging = 2,
CarStateWaitForCar = 3,
CarStateChargedCarConnected = 4
};
Q_ENUM(CarState)
enum Access {
AccessOpen = 0,
AccessRfid = 1,
AccessAuto = 2
};
Q_ENUM(Access)
enum ErrorCode {
ErrorCodeResidualCurrentCircuitBreaker = 1,
ErrorCodePhase = 3,
ErrorCodeNoGround = 8,
ErrorCodeInternalError = 10
};
Q_ENUM(ErrorCode)
enum CableLockMode {
CableLockModeLockWhileCareConnected = 0,
CableLockModeUnlockAfterCharging = 1,
CableLockModeAlwaysLock = 2
};
Q_ENUM(CableLockMode)
explicit IntegrationPluginGoECharger();
void discoverThings(ThingDiscoveryInfo *info) override;
void setupThing(ThingSetupInfo *info) override;
void thingRemoved(Thing *thing) override;
void executeAction(ThingActionInfo *info) override;
private:
QHash<Thing *, MqttChannel *> m_channels;
void update(Thing *thing, const QVariantMap &statusMap);
QNetworkRequest buildConfigurationRequest(const QHostAddress &address, const QString &configuration);
void setupMqttChannel(ThingSetupInfo *info, const QHostAddress &address, const QVariantMap &statusMap);
private slots:
void onClientConnected(MqttChannel* channel);
void onClientDisconnected(MqttChannel* channel);
void onPublishReceived(MqttChannel* channel, const QString &topic, const QByteArray &payload);
};
#endif // INTEGRATIONPLUGINGOECHARGER_H

View File

@ -0,0 +1,156 @@
{
"name": "GoECharger",
"displayName": "go-eCharger",
"id": "a1dfca21-3f41-4a67-bc8c-c8b333411bd9",
"vendors": [
{
"name": "goE",
"displayName": "go-e",
"id": "c2cf9998-3584-489f-8d82-68a0baed2064",
"thingClasses": [
{
"name": "goeHome",
"displayName": "go-eCharger Home",
"id": "3b663d51-fdb5-4944-b409-c07f7933877e",
"createMethods": ["User"],
"interfaces": ["connectable"],
"paramTypes": [
{
"id": "4342b72c-99d0-41a5-abc6-ea6c1cc1352c",
"name":"ipAddress",
"displayName": "IP address",
"type": "QString"
}
],
"stateTypes":[
{
"id": "a5afaad5-78bf-4cac-b98d-7eae31aac518",
"name": "connected",
"displayName": "Connected",
"displayNameEvent": "Connected changed",
"type": "bool",
"defaultValue": false,
"cached": false
},
{
"id": "c69053bc-3a53-4e76-868b-ccf0958e9e44",
"name": "carStatus",
"displayName": "Car state",
"displayNameEvent": "Car status changed",
"type": "QString",
"possibleValues": [
"Ready but no vehicle connected",
"Vehicle loads",
"Waiting for vehicle",
"Charging finished and vehicle still connected"
],
"defaultValue": "Ready but no vehicle connected"
},
{
"id": "d80e1ed8-c3ae-4b68-bf86-21b4d7b2b201",
"name": "access",
"displayName": "Access",
"displayNameEvent": "Access changed",
"type": "QString",
"possibleValues": [
"Open",
"RFID",
"Automatic"
],
"defaultValue": "Open"
},
{
"id": "8a7ab9f1-0143-494c-98ee-69f94125fe42",
"name": "power",
"displayName": "Charging",
"type": "bool",
"displayNameAction": "Start charging",
"displayNameEvent": "Charging status changed",
"defaultValue": false,
"writable": true
},
{
"id": "446fb786-bfbe-4938-963c-73d02184573f",
"name": "maxChargingCurrent",
"displayName": "Charging current",
"displayNameEvent": "Charging current changed",
"displayNameAction": "Set charging current",
"type": "double",
"unit": "Ampere",
"minValue": 6,
"maxValue": 32,
"defaultValue": 16,
"writable": true
},
{
"id": "ac849296-3f70-4b1b-aa30-127d774667bb",
"name": "cloud",
"displayName": "Cloud enabled",
"displayNameAction": "Set cloud enabled",
"displayNameEvent": "Cloud enabled changed",
"type": "bool",
"defaultValue": true,
"writable": true
},
{
"id": "08b107bc-1284-455d-9e5a-6a1c3adc389f",
"name": "updateAvailable",
"displayName": "Update available",
"displayNameEvent": "Update available changed",
"type": "bool",
"defaultValue": false
},
{
"id": "d8f5abb6-5db3-4040-8829-553b1d881ce4",
"name": "totalEnergy",
"displayName": "Total energy",
"displayNameEvent": "Total energy changed",
"type": "double",
"unit": "KiloWattHour",
"defaultValue": 0.0
},
{
"id": "e8258831-ad89-4d27-b295-e8c10dd42b76",
"name": "chargeEnergy",
"displayName": "Charge energy",
"displayNameEvent": "Charge energy changed",
"type": "double",
"unit": "KiloWattHour",
"defaultValue": 0.0
},
{
"id": "b06479d5-7a38-4fbd-867e-e55bdb54651b",
"name": "ledBrightness",
"displayName": "Led brightness",
"displayNameEvent": "Led brightness changed",
"type": "int",
"minValue": 0,
"maxValue": 255,
"defaultValue": 255
},
{
"id": "5d18b48d-b886-409e-ab2e-336d9c94a55c",
"name": "firmwareVersion",
"displayName": "Firmware version",
"displayNameEvent": "Firmware version changed",
"type": "QString",
"defaultValue": ""
},
{
"id": "8ecdf24b-daca-4b7a-98b5-3236f1e6ad85",
"name": "serialNumber",
"displayName": "Serial number",
"displayNameEvent": "Serial number changed",
"type": "QString",
"defaultValue": ""
}
]
}
]
}
]
}

13
goecharger/meta.json Normal file
View File

@ -0,0 +1,13 @@
{
"title": "go-eCharger",
"tagline": "Control and monitor the go-eCharger smart wallbox for electric vehicles.",
"icon": "go-e-logo.png",
"stability": "community",
"offline": true,
"technologies": [
"network"
],
"categories": [
"energy"
]
}

View File

@ -0,0 +1,275 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1">
<context>
<name>GoECharger</name>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="71"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="74"/>
<source>Access</source>
<extracomment>The name of the ParamType (ThingClass: goeHome, EventType: access, ID: {d80e1ed8-c3ae-4b68-bf86-21b4d7b2b201})
----------
The name of the StateType ({d80e1ed8-c3ae-4b68-bf86-21b4d7b2b201}) of ThingClass goeHome</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="77"/>
<source>Access changed</source>
<extracomment>The name of the EventType ({d80e1ed8-c3ae-4b68-bf86-21b4d7b2b201}) of ThingClass goeHome</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="80"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="83"/>
<source>Car state</source>
<extracomment>The name of the ParamType (ThingClass: goeHome, EventType: carStatus, ID: {c69053bc-3a53-4e76-868b-ccf0958e9e44})
----------
The name of the StateType ({c69053bc-3a53-4e76-868b-ccf0958e9e44}) of ThingClass goeHome</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="86"/>
<source>Car status changed</source>
<extracomment>The name of the EventType ({c69053bc-3a53-4e76-868b-ccf0958e9e44}) of ThingClass goeHome</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="89"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="92"/>
<source>Charge energy</source>
<extracomment>The name of the ParamType (ThingClass: goeHome, EventType: chargeEnergy, ID: {e8258831-ad89-4d27-b295-e8c10dd42b76})
----------
The name of the StateType ({e8258831-ad89-4d27-b295-e8c10dd42b76}) of ThingClass goeHome</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="95"/>
<source>Charge energy changed</source>
<extracomment>The name of the EventType ({e8258831-ad89-4d27-b295-e8c10dd42b76}) of ThingClass goeHome</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="98"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="101"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="104"/>
<source>Charging</source>
<extracomment>The name of the ParamType (ThingClass: goeHome, ActionType: power, ID: {8a7ab9f1-0143-494c-98ee-69f94125fe42})
----------
The name of the ParamType (ThingClass: goeHome, EventType: power, ID: {8a7ab9f1-0143-494c-98ee-69f94125fe42})
----------
The name of the StateType ({8a7ab9f1-0143-494c-98ee-69f94125fe42}) of ThingClass goeHome</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="107"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="110"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="113"/>
<source>Charging current</source>
<extracomment>The name of the ParamType (ThingClass: goeHome, ActionType: maxChargingCurrent, ID: {446fb786-bfbe-4938-963c-73d02184573f})
----------
The name of the ParamType (ThingClass: goeHome, EventType: maxChargingCurrent, ID: {446fb786-bfbe-4938-963c-73d02184573f})
----------
The name of the StateType ({446fb786-bfbe-4938-963c-73d02184573f}) of ThingClass goeHome</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="116"/>
<source>Charging current changed</source>
<extracomment>The name of the EventType ({446fb786-bfbe-4938-963c-73d02184573f}) of ThingClass goeHome</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="119"/>
<source>Charging status changed</source>
<extracomment>The name of the EventType ({8a7ab9f1-0143-494c-98ee-69f94125fe42}) of ThingClass goeHome</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="122"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="125"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="128"/>
<source>Cloud enabled</source>
<extracomment>The name of the ParamType (ThingClass: goeHome, ActionType: cloud, ID: {ac849296-3f70-4b1b-aa30-127d774667bb})
----------
The name of the ParamType (ThingClass: goeHome, EventType: cloud, ID: {ac849296-3f70-4b1b-aa30-127d774667bb})
----------
The name of the StateType ({ac849296-3f70-4b1b-aa30-127d774667bb}) of ThingClass goeHome</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="131"/>
<source>Cloud enabled changed</source>
<extracomment>The name of the EventType ({ac849296-3f70-4b1b-aa30-127d774667bb}) of ThingClass goeHome</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="134"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="137"/>
<source>Connected</source>
<extracomment>The name of the ParamType (ThingClass: goeHome, EventType: connected, ID: {a5afaad5-78bf-4cac-b98d-7eae31aac518})
----------
The name of the StateType ({a5afaad5-78bf-4cac-b98d-7eae31aac518}) of ThingClass goeHome</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="140"/>
<source>Connected changed</source>
<extracomment>The name of the EventType ({a5afaad5-78bf-4cac-b98d-7eae31aac518}) of ThingClass goeHome</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="143"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="146"/>
<source>Firmware version</source>
<extracomment>The name of the ParamType (ThingClass: goeHome, EventType: firmwareVersion, ID: {5d18b48d-b886-409e-ab2e-336d9c94a55c})
----------
The name of the StateType ({5d18b48d-b886-409e-ab2e-336d9c94a55c}) of ThingClass goeHome</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="149"/>
<source>Firmware version changed</source>
<extracomment>The name of the EventType ({5d18b48d-b886-409e-ab2e-336d9c94a55c}) of ThingClass goeHome</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="152"/>
<source>IP address</source>
<extracomment>The name of the ParamType (ThingClass: goeHome, Type: thing, ID: {4342b72c-99d0-41a5-abc6-ea6c1cc1352c})</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="155"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="158"/>
<source>Led brightness</source>
<extracomment>The name of the ParamType (ThingClass: goeHome, EventType: ledBrightness, ID: {b06479d5-7a38-4fbd-867e-e55bdb54651b})
----------
The name of the StateType ({b06479d5-7a38-4fbd-867e-e55bdb54651b}) of ThingClass goeHome</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="161"/>
<source>Led brightness changed</source>
<extracomment>The name of the EventType ({b06479d5-7a38-4fbd-867e-e55bdb54651b}) of ThingClass goeHome</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="164"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="167"/>
<source>Serial number</source>
<extracomment>The name of the ParamType (ThingClass: goeHome, EventType: serialNumber, ID: {8ecdf24b-daca-4b7a-98b5-3236f1e6ad85})
----------
The name of the StateType ({8ecdf24b-daca-4b7a-98b5-3236f1e6ad85}) of ThingClass goeHome</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="170"/>
<source>Serial number changed</source>
<extracomment>The name of the EventType ({8ecdf24b-daca-4b7a-98b5-3236f1e6ad85}) of ThingClass goeHome</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="173"/>
<source>Set charging current</source>
<extracomment>The name of the ActionType ({446fb786-bfbe-4938-963c-73d02184573f}) of ThingClass goeHome</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="176"/>
<source>Set cloud enabled</source>
<extracomment>The name of the ActionType ({ac849296-3f70-4b1b-aa30-127d774667bb}) of ThingClass goeHome</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="179"/>
<source>Start charging</source>
<extracomment>The name of the ActionType ({8a7ab9f1-0143-494c-98ee-69f94125fe42}) of ThingClass goeHome</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="182"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="185"/>
<source>Total energy</source>
<extracomment>The name of the ParamType (ThingClass: goeHome, EventType: totalEnergy, ID: {d8f5abb6-5db3-4040-8829-553b1d881ce4})
----------
The name of the StateType ({d8f5abb6-5db3-4040-8829-553b1d881ce4}) of ThingClass goeHome</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="188"/>
<source>Total energy changed</source>
<extracomment>The name of the EventType ({d8f5abb6-5db3-4040-8829-553b1d881ce4}) of ThingClass goeHome</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="191"/>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="194"/>
<source>Update available</source>
<extracomment>The name of the ParamType (ThingClass: goeHome, EventType: updateAvailable, ID: {08b107bc-1284-455d-9e5a-6a1c3adc389f})
----------
The name of the StateType ({08b107bc-1284-455d-9e5a-6a1c3adc389f}) of ThingClass goeHome</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="197"/>
<source>Update available changed</source>
<extracomment>The name of the EventType ({08b107bc-1284-455d-9e5a-6a1c3adc389f}) of ThingClass goeHome</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="200"/>
<source>go-e</source>
<extracomment>The name of the vendor ({c2cf9998-3584-489f-8d82-68a0baed2064})</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="203"/>
<source>go-eCharger</source>
<extracomment>The name of the plugin GoECharger ({a1dfca21-3f41-4a67-bc8c-c8b333411bd9})</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../../build-nymea-plugins-Desktop-Debug/goecharger/plugininfo.h" line="206"/>
<source>go-eCharger Home</source>
<extracomment>The name of the ThingClass ({3b663d51-fdb5-4944-b409-c07f7933877e})</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>IntegrationPluginGoECharger</name>
<message>
<location filename="../integrationplugingoecharger.cpp" line="68"/>
<location filename="../integrationplugingoecharger.cpp" line="226"/>
<location filename="../integrationplugingoecharger.cpp" line="256"/>
<location filename="../integrationplugingoecharger.cpp" line="286"/>
<location filename="../integrationplugingoecharger.cpp" line="316"/>
<location filename="../integrationplugingoecharger.cpp" line="346"/>
<source>The wallbox does not seem to be reachable.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../integrationplugingoecharger.cpp" line="78"/>
<location filename="../integrationplugingoecharger.cpp" line="236"/>
<location filename="../integrationplugingoecharger.cpp" line="266"/>
<location filename="../integrationplugingoecharger.cpp" line="296"/>
<location filename="../integrationplugingoecharger.cpp" line="326"/>
<location filename="../integrationplugingoecharger.cpp" line="356"/>
<source>The wallbox returned invalid data.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../integrationplugingoecharger.cpp" line="209"/>
<source>Error creating MQTT channel. Please check MQTT server settings.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../integrationplugingoecharger.cpp" line="243"/>
<location filename="../integrationplugingoecharger.cpp" line="273"/>
<location filename="../integrationplugingoecharger.cpp" line="303"/>
<location filename="../integrationplugingoecharger.cpp" line="333"/>
<location filename="../integrationplugingoecharger.cpp" line="364"/>
<source>Error while configuring MQTT settings on the wallbox.</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

View File

@ -23,6 +23,7 @@ PLUGIN_DIRS = \
fronius \ fronius \
genericelements \ genericelements \
genericthings \ genericthings \
goecharger \
gpio \ gpio \
i2cdevices \ i2cdevices \
httpcommander \ httpcommander \