diff --git a/everest/everestclient.cpp b/everest/everestclient.cpp index fb1999aae..5b2359c8d 100644 --- a/everest/everestclient.cpp +++ b/everest/everestclient.cpp @@ -208,11 +208,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 { + break; + case NetworkDeviceInfo::MonitorModeHostName: + debug.nospace() << everestClient->monitor()->networkDeviceInfo().hostName() << ", "; + debug.nospace() << everestClient->monitor()->networkDeviceInfo().address().toString() << ", "; + break; + case NetworkDeviceInfo::MonitorModeIp: debug.nospace() << everestClient->address().toString() << ", "; + break; } debug.nospace() << "MQTT connected: " << everestClient->client()->isConnected() << ")"; diff --git a/everest/everestdiscovery.cpp b/everest/everestdiscovery.cpp index fadc3534a..bfe8005c7 100644 --- a/everest/everestdiscovery.cpp +++ b/everest/everestdiscovery.cpp @@ -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::results() const @@ -86,7 +84,7 @@ QList 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"); diff --git a/everest/everestdiscovery.h b/everest/everestdiscovery.h index 7a64d552f..ccfdd363f 100644 --- a/everest/everestdiscovery.h +++ b/everest/everestdiscovery.h @@ -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 @@ class EverestDiscovery : public QObject explicit EverestDiscovery(NetworkDeviceDiscovery *networkDeviceDiscovery, QObject *parent = nullptr); void start(); - void startLocalhost(); QList results() const; @@ -62,12 +62,13 @@ class EverestDiscovery : public QObject QDateTime m_startDateTime; QList m_results; QList 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(); }; diff --git a/everest/integrationplugineverest.cpp b/everest/integrationplugineverest.cpp index a4f7e394f..873b7dfde 100644 --- a/everest/integrationplugineverest.cpp +++ b/everest/integrationplugineverest.cpp @@ -34,17 +34,17 @@ #include -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,12 +193,13 @@ 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()) { @@ -205,7 +220,7 @@ void IntegrationPluginTruffle::setupThing(ThingSetupInfo *info) qCDebug(dcEverest()) << "Creating new mac address based everst client"; everstClient = new EverestClient(this); everstClient->setMacAddress(macAddress); - everstClient->setMonitor(hardwareManager()->networkDeviceDiscovery()->registerMonitor(macAddress)); + everstClient->setMonitor(hardwareManager()->networkDeviceDiscovery()->registerMonitor(thing)); m_everstClients.append(everstClient); everstClient->start(); } @@ -249,7 +264,7 @@ void IntegrationPluginTruffle::setupThing(ThingSetupInfo *info) } } -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 +313,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) { diff --git a/everest/integrationplugineverest.h b/everest/integrationplugineverest.h index 6c173ac46..fd8fcb720 100644 --- a/everest/integrationplugineverest.h +++ b/everest/integrationplugineverest.h @@ -38,7 +38,7 @@ #include -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; diff --git a/everest/integrationplugineverest.json b/everest/integrationplugineverest.json index 60e52878d..2640122db 100644 --- a/everest/integrationplugineverest.json +++ b/everest/integrationplugineverest.json @@ -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",