diff --git a/libnymea-sunspec/models/sunspecflowbatterymodel.h b/libnymea-sunspec/models/sunspecflowbatterymodel.h index 1ef2a86..57e7091 100644 --- a/libnymea-sunspec/models/sunspecflowbatterymodel.h +++ b/libnymea-sunspec/models/sunspecflowbatterymodel.h @@ -55,7 +55,7 @@ public: void processBlockData(const QVector blockData) override; protected: - void initDataPoints(); + void initDataPoints() override; private: SunSpecFlowBatteryModel *m_parentModel = nullptr; diff --git a/libnymea-sunspec/models/sunspecflowbatterymodulemodel.h b/libnymea-sunspec/models/sunspecflowbatterymodulemodel.h index 6f1d3ed..6fbcc3c 100644 --- a/libnymea-sunspec/models/sunspecflowbatterymodulemodel.h +++ b/libnymea-sunspec/models/sunspecflowbatterymodulemodel.h @@ -55,7 +55,7 @@ public: void processBlockData(const QVector blockData) override; protected: - void initDataPoints(); + void initDataPoints() override; private: SunSpecFlowBatteryModuleModel *m_parentModel = nullptr; diff --git a/libnymea-sunspec/models/sunspecflowbatterystackmodel.h b/libnymea-sunspec/models/sunspecflowbatterystackmodel.h index b281d4d..2cd74af 100644 --- a/libnymea-sunspec/models/sunspecflowbatterystackmodel.h +++ b/libnymea-sunspec/models/sunspecflowbatterystackmodel.h @@ -55,7 +55,7 @@ public: void processBlockData(const QVector blockData) override; protected: - void initDataPoints(); + void initDataPoints() override; private: SunSpecFlowBatteryStackModel *m_parentModel = nullptr; diff --git a/libnymea-sunspec/models/sunspecflowbatterystringmodel.h b/libnymea-sunspec/models/sunspecflowbatterystringmodel.h index 90e8642..c92dea6 100644 --- a/libnymea-sunspec/models/sunspecflowbatterystringmodel.h +++ b/libnymea-sunspec/models/sunspecflowbatterystringmodel.h @@ -202,7 +202,7 @@ public: void processBlockData(const QVector blockData) override; protected: - void initDataPoints(); + void initDataPoints() override; private: SunSpecFlowBatteryStringModel *m_parentModel = nullptr; diff --git a/libnymea-sunspec/models/sunspecfreqwattmodel.h b/libnymea-sunspec/models/sunspecfreqwattmodel.h index 4ef4ce4..f2fac81 100644 --- a/libnymea-sunspec/models/sunspecfreqwattmodel.h +++ b/libnymea-sunspec/models/sunspecfreqwattmodel.h @@ -212,7 +212,7 @@ public: void processBlockData(const QVector blockData) override; protected: - void initDataPoints(); + void initDataPoints() override; private: SunSpecFreqWattModel *m_parentModel = nullptr; diff --git a/libnymea-sunspec/models/sunspechfrtcmodel.h b/libnymea-sunspec/models/sunspechfrtcmodel.h index d6a06be..b88afcb 100644 --- a/libnymea-sunspec/models/sunspechfrtcmodel.h +++ b/libnymea-sunspec/models/sunspechfrtcmodel.h @@ -188,7 +188,7 @@ public: void processBlockData(const QVector blockData) override; protected: - void initDataPoints(); + void initDataPoints() override; private: SunSpecHfrtcModel *m_parentModel = nullptr; diff --git a/libnymea-sunspec/models/sunspechfrtmodel.h b/libnymea-sunspec/models/sunspechfrtmodel.h index 758caba..18d7382 100644 --- a/libnymea-sunspec/models/sunspechfrtmodel.h +++ b/libnymea-sunspec/models/sunspechfrtmodel.h @@ -188,7 +188,7 @@ public: void processBlockData(const QVector blockData) override; protected: - void initDataPoints(); + void initDataPoints() override; private: SunSpecHfrtModel *m_parentModel = nullptr; diff --git a/libnymea-sunspec/models/sunspechfrtxmodel.h b/libnymea-sunspec/models/sunspechfrtxmodel.h index 2d7c611..7584076 100644 --- a/libnymea-sunspec/models/sunspechfrtxmodel.h +++ b/libnymea-sunspec/models/sunspechfrtxmodel.h @@ -188,7 +188,7 @@ public: void processBlockData(const QVector blockData) override; protected: - void initDataPoints(); + void initDataPoints() override; private: SunSpecHfrtxModel *m_parentModel = nullptr; diff --git a/libnymea-sunspec/models/sunspechvrtcmodel.h b/libnymea-sunspec/models/sunspechvrtcmodel.h index 4f3990b..e9902b6 100644 --- a/libnymea-sunspec/models/sunspechvrtcmodel.h +++ b/libnymea-sunspec/models/sunspechvrtcmodel.h @@ -188,7 +188,7 @@ public: void processBlockData(const QVector blockData) override; protected: - void initDataPoints(); + void initDataPoints() override; private: SunSpecHvrtcModel *m_parentModel = nullptr; diff --git a/libnymea-sunspec/models/sunspechvrtmodel.h b/libnymea-sunspec/models/sunspechvrtmodel.h index 41b6d36..44efd08 100644 --- a/libnymea-sunspec/models/sunspechvrtmodel.h +++ b/libnymea-sunspec/models/sunspechvrtmodel.h @@ -188,7 +188,7 @@ public: void processBlockData(const QVector blockData) override; protected: - void initDataPoints(); + void initDataPoints() override; private: SunSpecHvrtModel *m_parentModel = nullptr; diff --git a/libnymea-sunspec/models/sunspechvrtxmodel.h b/libnymea-sunspec/models/sunspechvrtxmodel.h index 9aa6cc1..e12fbcc 100644 --- a/libnymea-sunspec/models/sunspechvrtxmodel.h +++ b/libnymea-sunspec/models/sunspechvrtxmodel.h @@ -188,7 +188,7 @@ public: void processBlockData(const QVector blockData) override; protected: - void initDataPoints(); + void initDataPoints() override; private: SunSpecHvrtxModel *m_parentModel = nullptr; diff --git a/libnymea-sunspec/models/sunspecirradiancemodel.h b/libnymea-sunspec/models/sunspecirradiancemodel.h index ee921e6..f5373d0 100644 --- a/libnymea-sunspec/models/sunspecirradiancemodel.h +++ b/libnymea-sunspec/models/sunspecirradiancemodel.h @@ -59,7 +59,7 @@ public: void processBlockData(const QVector blockData) override; protected: - void initDataPoints(); + void initDataPoints() override; private: SunSpecIrradianceModel *m_parentModel = nullptr; diff --git a/libnymea-sunspec/models/sunspeclfrtcmodel.h b/libnymea-sunspec/models/sunspeclfrtcmodel.h index 4545392..af4a6d9 100644 --- a/libnymea-sunspec/models/sunspeclfrtcmodel.h +++ b/libnymea-sunspec/models/sunspeclfrtcmodel.h @@ -188,7 +188,7 @@ public: void processBlockData(const QVector blockData) override; protected: - void initDataPoints(); + void initDataPoints() override; private: SunSpecLfrtcModel *m_parentModel = nullptr; diff --git a/libnymea-sunspec/models/sunspeclfrtmodel.h b/libnymea-sunspec/models/sunspeclfrtmodel.h index 823428e..b650c0d 100644 --- a/libnymea-sunspec/models/sunspeclfrtmodel.h +++ b/libnymea-sunspec/models/sunspeclfrtmodel.h @@ -188,7 +188,7 @@ public: void processBlockData(const QVector blockData) override; protected: - void initDataPoints(); + void initDataPoints() override; private: SunSpecLfrtModel *m_parentModel = nullptr; diff --git a/libnymea-sunspec/models/sunspeclfrtxmodel.h b/libnymea-sunspec/models/sunspeclfrtxmodel.h index aaadf99..fa0ea31 100644 --- a/libnymea-sunspec/models/sunspeclfrtxmodel.h +++ b/libnymea-sunspec/models/sunspeclfrtxmodel.h @@ -188,7 +188,7 @@ public: void processBlockData(const QVector blockData) override; protected: - void initDataPoints(); + void initDataPoints() override; private: SunSpecLfrtxModel *m_parentModel = nullptr; diff --git a/libnymea-sunspec/models/sunspeclithiumionbankmodel.h b/libnymea-sunspec/models/sunspeclithiumionbankmodel.h index 5de1cd9..16c27f2 100644 --- a/libnymea-sunspec/models/sunspeclithiumionbankmodel.h +++ b/libnymea-sunspec/models/sunspeclithiumionbankmodel.h @@ -197,7 +197,7 @@ public: void processBlockData(const QVector blockData) override; protected: - void initDataPoints(); + void initDataPoints() override; private: SunSpecLithiumIonBankModel *m_parentModel = nullptr; diff --git a/libnymea-sunspec/models/sunspeclithiumionmodulemodel.h b/libnymea-sunspec/models/sunspeclithiumionmodulemodel.h index 353b8a6..48428bb 100644 --- a/libnymea-sunspec/models/sunspeclithiumionmodulemodel.h +++ b/libnymea-sunspec/models/sunspeclithiumionmodulemodel.h @@ -63,7 +63,7 @@ public: void processBlockData(const QVector blockData) override; protected: - void initDataPoints(); + void initDataPoints() override; private: SunSpecLithiumIonModuleModel *m_parentModel = nullptr; diff --git a/libnymea-sunspec/models/sunspeclithiumionstringmodel.h b/libnymea-sunspec/models/sunspeclithiumionstringmodel.h index 15fd184..f01328c 100644 --- a/libnymea-sunspec/models/sunspeclithiumionstringmodel.h +++ b/libnymea-sunspec/models/sunspeclithiumionstringmodel.h @@ -70,7 +70,7 @@ public: void processBlockData(const QVector blockData) override; protected: - void initDataPoints(); + void initDataPoints() override; private: SunSpecLithiumIonStringModel *m_parentModel = nullptr; diff --git a/libnymea-sunspec/models/sunspeclvrtcmodel.h b/libnymea-sunspec/models/sunspeclvrtcmodel.h index 7e05d19..6f55253 100644 --- a/libnymea-sunspec/models/sunspeclvrtcmodel.h +++ b/libnymea-sunspec/models/sunspeclvrtcmodel.h @@ -188,7 +188,7 @@ public: void processBlockData(const QVector blockData) override; protected: - void initDataPoints(); + void initDataPoints() override; private: SunSpecLvrtcModel *m_parentModel = nullptr; diff --git a/libnymea-sunspec/models/sunspeclvrtmodel.h b/libnymea-sunspec/models/sunspeclvrtmodel.h index 25c3d42..8b4eb1b 100644 --- a/libnymea-sunspec/models/sunspeclvrtmodel.h +++ b/libnymea-sunspec/models/sunspeclvrtmodel.h @@ -188,7 +188,7 @@ public: void processBlockData(const QVector blockData) override; protected: - void initDataPoints(); + void initDataPoints() override; private: SunSpecLvrtModel *m_parentModel = nullptr; diff --git a/libnymea-sunspec/models/sunspeclvrtxmodel.h b/libnymea-sunspec/models/sunspeclvrtxmodel.h index 38fa8c0..8c2adfb 100644 --- a/libnymea-sunspec/models/sunspeclvrtxmodel.h +++ b/libnymea-sunspec/models/sunspeclvrtxmodel.h @@ -188,7 +188,7 @@ public: void processBlockData(const QVector blockData) override; protected: - void initDataPoints(); + void initDataPoints() override; private: SunSpecLvrtxModel *m_parentModel = nullptr; diff --git a/libnymea-sunspec/models/sunspecmpptmodel.h b/libnymea-sunspec/models/sunspecmpptmodel.h index ce00ed8..28f8bd6 100644 --- a/libnymea-sunspec/models/sunspecmpptmodel.h +++ b/libnymea-sunspec/models/sunspecmpptmodel.h @@ -106,7 +106,7 @@ public: void processBlockData(const QVector blockData) override; protected: - void initDataPoints(); + void initDataPoints() override; private: SunSpecMpptModel *m_parentModel = nullptr; diff --git a/libnymea-sunspec/models/sunspecschedulemodel.h b/libnymea-sunspec/models/sunspecschedulemodel.h index 83a4b1d..2f814a3 100644 --- a/libnymea-sunspec/models/sunspecschedulemodel.h +++ b/libnymea-sunspec/models/sunspecschedulemodel.h @@ -188,7 +188,7 @@ public: void processBlockData(const QVector blockData) override; protected: - void initDataPoints(); + void initDataPoints() override; private: SunSpecScheduleModel *m_parentModel = nullptr; diff --git a/libnymea-sunspec/models/sunspecsecureacmeterselectedreadingsmodel.h b/libnymea-sunspec/models/sunspecsecureacmeterselectedreadingsmodel.h index d20eff3..fdd8b9b 100644 --- a/libnymea-sunspec/models/sunspecsecureacmeterselectedreadingsmodel.h +++ b/libnymea-sunspec/models/sunspecsecureacmeterselectedreadingsmodel.h @@ -55,7 +55,7 @@ public: void processBlockData(const QVector blockData) override; protected: - void initDataPoints(); + void initDataPoints() override; private: SunSpecSecureAcMeterSelectedReadingsModel *m_parentModel = nullptr; diff --git a/libnymea-sunspec/models/sunspecstringcombineradvancedmodel.h b/libnymea-sunspec/models/sunspecstringcombineradvancedmodel.h index 6904deb..f81275a 100644 --- a/libnymea-sunspec/models/sunspecstringcombineradvancedmodel.h +++ b/libnymea-sunspec/models/sunspecstringcombineradvancedmodel.h @@ -88,7 +88,7 @@ public: void processBlockData(const QVector blockData) override; protected: - void initDataPoints(); + void initDataPoints() override; private: SunSpecStringCombinerAdvancedModel *m_parentModel = nullptr; diff --git a/libnymea-sunspec/models/sunspecstringcombinercurrentmodel.h b/libnymea-sunspec/models/sunspecstringcombinercurrentmodel.h index 1185218..fd93d94 100644 --- a/libnymea-sunspec/models/sunspecstringcombinercurrentmodel.h +++ b/libnymea-sunspec/models/sunspecstringcombinercurrentmodel.h @@ -83,7 +83,7 @@ public: void processBlockData(const QVector blockData) override; protected: - void initDataPoints(); + void initDataPoints() override; private: SunSpecStringCombinerCurrentModel *m_parentModel = nullptr; diff --git a/libnymea-sunspec/models/sunspectrackercontrollermodel.h b/libnymea-sunspec/models/sunspectrackercontrollermodel.h index 9886afd..90bf5fc 100644 --- a/libnymea-sunspec/models/sunspectrackercontrollermodel.h +++ b/libnymea-sunspec/models/sunspectrackercontrollermodel.h @@ -85,7 +85,7 @@ public: void processBlockData(const QVector blockData) override; protected: - void initDataPoints(); + void initDataPoints() override; private: SunSpecTrackerControllerModel *m_parentModel = nullptr; diff --git a/libnymea-sunspec/models/sunspecvoltvarmodel.h b/libnymea-sunspec/models/sunspecvoltvarmodel.h index 5e96c8e..ade4782 100644 --- a/libnymea-sunspec/models/sunspecvoltvarmodel.h +++ b/libnymea-sunspec/models/sunspecvoltvarmodel.h @@ -207,7 +207,7 @@ public: void processBlockData(const QVector blockData) override; protected: - void initDataPoints(); + void initDataPoints() override; private: SunSpecVoltVarModel *m_parentModel = nullptr; diff --git a/libnymea-sunspec/models/sunspecvoltwattmodel.h b/libnymea-sunspec/models/sunspecvoltwattmodel.h index cdc3d3e..d42eb38 100644 --- a/libnymea-sunspec/models/sunspecvoltwattmodel.h +++ b/libnymea-sunspec/models/sunspecvoltwattmodel.h @@ -206,7 +206,7 @@ public: void processBlockData(const QVector blockData) override; protected: - void initDataPoints(); + void initDataPoints() override; private: SunSpecVoltWattModel *m_parentModel = nullptr; diff --git a/libnymea-sunspec/models/sunspecwattpfmodel.h b/libnymea-sunspec/models/sunspecwattpfmodel.h index 1ae3240..3647681 100644 --- a/libnymea-sunspec/models/sunspecwattpfmodel.h +++ b/libnymea-sunspec/models/sunspecwattpfmodel.h @@ -198,7 +198,7 @@ public: void processBlockData(const QVector blockData) override; protected: - void initDataPoints(); + void initDataPoints() override; private: SunSpecWattPfModel *m_parentModel = nullptr; diff --git a/libnymea-sunspec/sunspecconnection.cpp b/libnymea-sunspec/sunspecconnection.cpp index 2017879..ebe7bfc 100644 --- a/libnymea-sunspec/sunspecconnection.cpp +++ b/libnymea-sunspec/sunspecconnection.cpp @@ -417,6 +417,7 @@ void SunSpecConnection::scanModelsOnBaseRegister(quint16 offset) scanModelsOnBaseRegister(offset + 2 + modelLength); } else { qCWarning(dcSunSpec()) << "Error occured while reading model header from" << this << "using offset" << offset << m_modbusTcpClient->errorString(); + // FIXME: check if models have already been found, finish with success in that case so we show at least the models found so far... setDiscoveryRunning(false); emit discoveryFinished(false); } diff --git a/libnymea-sunspec/tools/generate-models.py b/libnymea-sunspec/tools/generate-models.py index caca42e..eaa5cf9 100644 --- a/libnymea-sunspec/tools/generate-models.py +++ b/libnymea-sunspec/tools/generate-models.py @@ -867,7 +867,7 @@ def writeRepeatingBlockClassDefinition(fileDescriptor, className, modelId): # Protected members writeLine(fileDescriptor) writeLine(fileDescriptor, 'protected:') - writeLine(fileDescriptor, ' void initDataPoints();') + writeLine(fileDescriptor, ' void initDataPoints() override;') # Private members writeLine(fileDescriptor) diff --git a/sunspec/integrationpluginsunspec.cpp b/sunspec/integrationpluginsunspec.cpp index d72705b..32e6ec9 100644 --- a/sunspec/integrationpluginsunspec.cpp +++ b/sunspec/integrationpluginsunspec.cpp @@ -66,20 +66,25 @@ void IntegrationPluginSunSpec::init() // SunSpec connection params m_connectionIpParamTypeIds.insert(sunspecConnectionThingClassId, sunspecConnectionThingIpAddressParamTypeId); m_connectionIpParamTypeIds.insert(solarEdgeConnectionThingClassId, solarEdgeConnectionThingIpAddressParamTypeId); + m_connectionIpParamTypeIds.insert(kostalConnectionThingClassId, kostalConnectionThingIpAddressParamTypeId); m_connectionPortParamTypeIds.insert(sunspecConnectionThingClassId, sunspecConnectionThingPortParamTypeId); m_connectionPortParamTypeIds.insert(solarEdgeConnectionThingClassId, solarEdgeConnectionThingPortParamTypeId); + m_connectionPortParamTypeIds.insert(kostalConnectionThingClassId, kostalConnectionThingPortParamTypeId); m_connectionMacAddressParamTypeIds.insert(sunspecConnectionThingClassId, sunspecConnectionThingMacAddressParamTypeId); m_connectionMacAddressParamTypeIds.insert(solarEdgeConnectionThingClassId, solarEdgeConnectionThingMacAddressParamTypeId); + m_connectionMacAddressParamTypeIds.insert(kostalConnectionThingClassId, kostalConnectionThingMacAddressParamTypeId); m_connectionSlaveIdParamTypeIds.insert(sunspecConnectionThingClassId, sunspecConnectionThingSlaveIdParamTypeId); m_connectionSlaveIdParamTypeIds.insert(solarEdgeConnectionThingClassId, solarEdgeConnectionThingSlaveIdParamTypeId); + m_connectionSlaveIdParamTypeIds.insert(kostalConnectionThingClassId, kostalConnectionThingSlaveIdParamTypeId); // Connected state for all things m_connectedStateTypeIds.insert(sunspecConnectionThingClassId, sunspecConnectionConnectedStateTypeId); m_connectedStateTypeIds.insert(solarEdgeConnectionThingClassId, solarEdgeConnectionConnectedStateTypeId); m_connectedStateTypeIds.insert(solarEdgeBatteryThingClassId, solarEdgeBatteryConnectedStateTypeId); + m_connectedStateTypeIds.insert(kostalConnectionThingClassId, kostalConnectionConnectedStateTypeId); m_connectedStateTypeIds.insert(sunspecStorageThingClassId, sunspecStorageConnectedStateTypeId); m_connectedStateTypeIds.insert(sunspecSinglePhaseInverterThingClassId, sunspecSinglePhaseInverterConnectedStateTypeId); @@ -162,6 +167,8 @@ void IntegrationPluginSunSpec::discoverThings(ThingDiscoveryInfo *info) title += networkDeviceInfo.address().toString() + " (" + networkDeviceInfo.hostName() + ")"; } } else { + // Kostal does not provide usefull information for filterin in the discovery + // Generic or not discoverable sunspec connection, show all network results if (networkDeviceInfo.hostName().isEmpty()) { title += networkDeviceInfo.address().toString(); @@ -205,7 +212,7 @@ void IntegrationPluginSunSpec::setupThing(ThingSetupInfo *info) Thing *thing = info->thing(); qCDebug(dcSunSpec()) << "Setup thing" << thing->name(); - if (thing->thingClassId() == sunspecConnectionThingClassId || thing->thingClassId() == solarEdgeConnectionThingClassId) { + if (thing->thingClassId() == sunspecConnectionThingClassId || thing->thingClassId() == solarEdgeConnectionThingClassId || thing->thingClassId() == kostalConnectionThingClassId) { setupConnection(info); } else if (thing->thingClassId() == sunspecThreePhaseInverterThingClassId || thing->thingClassId() == sunspecSplitPhaseInverterThingClassId || thing->thingClassId() == sunspecSinglePhaseInverterThingClassId ) { Thing *parentThing = myThings().findById(thing->parentId()); @@ -287,7 +294,7 @@ void IntegrationPluginSunSpec::thingRemoved(Thing *thing) { qCDebug(dcSunSpec()) << "Thing removed" << thing->name(); - if (thing->thingClassId() == sunspecConnectionThingClassId) { + if (m_sunSpecConnections.contains(thing->id())) { SunSpecConnection *connection = m_sunSpecConnections.take(thing->id()); if (connection) connection->deleteLater(); @@ -360,6 +367,8 @@ void IntegrationPluginSunSpec::processDiscoveryResult(Thing *thing, SunSpecConne continue; } + // TODO: Make sure to not add duplicated models like inverter + inverter float.. + switch (model->modelId()) { case SunSpecModelFactory::ModelIdCommon: // Skip the common model, we already handled this one for each thing model diff --git a/sunspec/integrationpluginsunspec.json b/sunspec/integrationpluginsunspec.json index 8cd3e9b..e8dc28c 100644 --- a/sunspec/integrationpluginsunspec.json +++ b/sunspec/integrationpluginsunspec.json @@ -1463,6 +1463,61 @@ ] } ] + }, + { + "name": "kostal", + "displayName": "KOSTAL Solar Electric", + "id": "862d1ebf-cb78-4c55-89b2-819fddfd9acd", + "thingClasses": [ + { + "name": "kostalConnection", + "displayName": "Kostal SunSpec connection", + "id": "0cad2dca-66ac-489c-8443-074e32aa27a0", + "createMethods": [ "User", "Discovery" ], + "interfaces": ["gateway"], + "paramTypes": [ + { + "id": "9fe10047-b2fd-460b-88ad-7f00977efc57", + "name":"ipAddress", + "displayName": "IP address", + "type": "QString", + "defaultValue": "127.0.0.1" + }, + { + "id": "047b048d-2e93-4129-80df-231688436da4", + "name":"macAddress", + "displayName": "MAC address", + "type": "QString", + "defaultValue": "00:00:00:00:00:00" + }, + { + "id": "bf87f540-ce2e-4c35-af62-942da7be2f80", + "name":"port", + "displayName": "Port", + "type": "int", + "defaultValue": 502 + }, + { + "id": "48b133da-cce3-47f3-9c7c-470026af7829", + "name":"slaveId", + "displayName": "Slave ID", + "type": "int", + "defaultValue": 1 + } + ], + "stateTypes":[ + { + "id": "b9c52ae8-cb9b-4742-8e9a-450dce3a009f", + "name": "connected", + "displayName": "Connected", + "displayNameEvent": "Connected changed", + "type": "bool", + "defaultValue": false, + "cached": false + } + ] + } + ] } ] }