Skip to content

Commit

Permalink
Merge PR #749: EVerest: Autosetup connectors on localhost
Browse files Browse the repository at this point in the history
  • Loading branch information
jenkins committed Nov 27, 2024
2 parents 6c7d65a + 3995238 commit 0a1cf08
Show file tree
Hide file tree
Showing 7 changed files with 107 additions and 6 deletions.
15 changes: 11 additions & 4 deletions everest/everest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,11 @@ Everest::~Everest()
deinitialize();
}

Thing *Everest::thing() const
{
return m_thing;
}

QString Everest::connector() const
{
return m_connector;
Expand Down Expand Up @@ -192,11 +197,13 @@ void Everest::onPublishReceived(const QString &topic, const QByteArray &payload,
*/

QVariantMap dataMap = jsonDoc.toVariant().toMap();
uint maxCurrent = dataMap.value("max_current_A_import").toUInt();
uint minCurrent = dataMap.value("min_current_A_import").toUInt();

m_thing->setStateMaxValue(everestMaxChargingCurrentStateTypeId, maxCurrent);
m_thing->setStateMinValue(everestMaxChargingCurrentStateTypeId, minCurrent == 0 ? 6 : minCurrent);

m_thing->setStateMaxValue(everestMaxChargingCurrentStateTypeId,
dataMap.value("max_current_A_import").toUInt());
m_thing->setStateMinValue(everestMaxChargingCurrentStateTypeId,
dataMap.value("min_current_A_import").toUInt());
// FIXME: once we have a method for phase switching, we can re-enable the featre here

// bool phaseSwitchingAvailable = dataMap.value("supports_changing_phases_during_charging", false).toBool();
// if (!phaseSwitchingAvailable) {
Expand Down
2 changes: 2 additions & 0 deletions everest/everest.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,8 @@ class Everest : public QObject
explicit Everest(MqttClient *client, Thing *thing, QObject *parent = nullptr);
~Everest();

Thing *thing() const;

QString connector() const;

void initialize();
Expand Down
10 changes: 9 additions & 1 deletion everest/everestclient.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ EverestClient::EverestClient(QObject *parent)
{
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()) {
Expand Down Expand Up @@ -71,6 +72,13 @@ EverestClient::EverestClient(QObject *parent)
});
}

EverestClient::~EverestClient()
{
foreach (Everest *everest, m_everests) {
removeThing(everest->thing());
}
}

MqttClient *EverestClient::client() const
{
return m_client;
Expand All @@ -86,7 +94,7 @@ void EverestClient::addThing(Thing *thing)
if (m_everests.contains(thing)) {
qCWarning(dcEverest()) << "The" << thing << "has already been added to the everest client. "
"Please report a bug if you see this message.";
// FIXME: maybe cleanup and recreate the client due to reconfigure
// TODO: maybe cleanup and recreate the client due to reconfigure
return;
}

Expand Down
1 change: 1 addition & 0 deletions everest/everestclient.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ class EverestClient : public QObject
Q_OBJECT
public:
explicit EverestClient(QObject *parent = nullptr);
~EverestClient();

MqttClient *client() const;

Expand Down
20 changes: 20 additions & 0 deletions everest/everestdiscovery.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,18 @@ void EverestDiscovery::start()
checkNetworkDevice(localHostInfo);
}

void EverestDiscovery::startLocalhost()
{
qCInfo(dcEverest()) << "Discovery: Start discovering EVerest on localhost ...";
m_startDateTime = QDateTime::currentDateTime();
m_localhostDiscovery = true;

// For development, check local host
NetworkDeviceInfo localHostInfo;
localHostInfo.setAddress(QHostAddress::LocalHost);
checkNetworkDevice(localHostInfo);
}

QList<EverestDiscovery::Result> EverestDiscovery::results() const
{
return m_results;
Expand All @@ -88,6 +100,10 @@ void EverestDiscovery::checkNetworkDevice(const NetworkDeviceInfo &networkDevice
<< "...skip connection";
// We give up on the first error here
cleanupClient(client);

if (m_localhostDiscovery) {
finishDiscovery();
}
});

connect(client, &MqttClient::disconnected, this, [this, client](){
Expand Down Expand Up @@ -156,6 +172,10 @@ void EverestDiscovery::cleanupClient(MqttClient *client)

client->disconnectFromHost();
client->deleteLater();

if (m_localhostDiscovery) {
finishDiscovery();
}
}

void EverestDiscovery::finishDiscovery()
Expand Down
4 changes: 4 additions & 0 deletions everest/everestdiscovery.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ class EverestDiscovery : public QObject

void start();

void startLocalhost();

QList<EverestDiscovery::Result> results() const;

signals:
Expand All @@ -61,6 +63,8 @@ class EverestDiscovery : public QObject
QList<EverestDiscovery::Result> m_results;
QList<MqttClient *> m_clients;

bool m_localhostDiscovery = false;

QString m_everestApiModuleTopicConnectors = "everest_api/connectors";

void checkNetworkDevice(const NetworkDeviceInfo &networkDeviceInfo);
Expand Down
61 changes: 60 additions & 1 deletion everest/integrationplugineverest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,66 @@ void IntegrationPluginTruffle::init()

void IntegrationPluginTruffle::startMonitoringAutoThings()
{
// TODO: auto setup everest instance running on localhost
// 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
// be set up automatically. Additional instances in the network can still be added by running a normal network discovery

EverestDiscovery *discovery = new EverestDiscovery(nullptr, this);
connect(discovery, &EverestDiscovery::finished, discovery, &EverestDiscovery::deleteLater);
connect(discovery, &EverestDiscovery::finished, this, [this, discovery](){

ThingDescriptors descriptors;

foreach (const EverestDiscovery::Result &result, discovery->results()) {

// Create one EV charger foreach available connector on that host
foreach(const QString &connectorName, result.connectors) {

QString title = QString("EVerest");
QString description = connectorName;
ThingDescriptor descriptor(everestThingClassId, title, description);

qCInfo(dcEverest()) << "Discovered -->" << title << description;

ParamList params;
params.append(Param(everestThingConnectorParamTypeId, connectorName));
params.append(Param(everestThingAddressParamTypeId, result.networkDeviceInfo.address().toString()));
descriptor.setParams(params);

// Let's check if we aleardy have a thing with those params
bool thingExists = true;
Thing *existingThing = nullptr;
foreach (Thing *thing, myThings()) {
foreach(const Param &param, params) {
if (param.value() != thing->paramValue(param.paramTypeId())) {
thingExists = false;
break;
}
}

// The params are equal, we already have set up this thing
if (thingExists) {
existingThing = thing;
}
}

// Add only connectors we don't have set up yet
if (existingThing) {
qCDebug(dcEverest()) << "Discovered EVerest connector on localhost but we already set up this connector" << existingThing->name() << existingThing->params();
} else {
qCDebug(dcEverest()) << "Adding new EVerest connector on localhost" << title << params;
descriptors.append(descriptor);
}
}
}

if (!descriptors.isEmpty()) {
qCDebug(dcEverest()) << "Adding" << descriptors.count() << "new EVerest instances.";
emit autoThingsAppeared(descriptors);
}
});

discovery->startLocalhost();
}

void IntegrationPluginTruffle::discoverThings(ThingDiscoveryInfo *info)
Expand Down

0 comments on commit 0a1cf08

Please sign in to comment.