// SPDX-License-Identifier: GPL-3.0-or-later // Extension : Gestionnaire Pompe à chaleur + ECS pour nymea-energy-plugin-nymea #ifndef HEATPUMPMANAGER_H #define HEATPUMPMANAGER_H #include #include #include // from libnymea #include #include // from libnymea-energy #include // ─── UUIDs ThingClass ──────────────────────────────────────── // Ces UUIDs doivent correspondre aux entrées dans le fichier JSON // du plugin d'intégration ETM. static const QUuid kHeatPumpThingClassId = QUuid("b5a8f3d2-4c1e-4a9f-8b2d-3e6c0f1d5a7b"); static const QUuid kDomesticHotWaterClassId = QUuid("c7d2e4f1-5b3a-4c0d-9e6f-2a4b7c1d3e5f"); // ─── UUIDs StateTypes — Heat Pump ─────────────────────────── static const QUuid kHPStatePower = QUuid("d4e5f6a7-b8c9-4d0e-1f2a-3b4c5d6e7f8a"); static const QUuid kHPStateMode = QUuid("e5f6a7b8-c9d0-4e1f-2a3b-4c5d6e7f8a9b"); static const QUuid kHPStateTargetTemperature = QUuid("f6a7b8c9-d0e1-4f2a-3b4c-5d6e7f8a9b0c"); static const QUuid kHPStateCurrentTemp = QUuid("a7b8c9d0-e1f2-4a3b-4c5d-6e7f8a9b0c1d"); static const QUuid kHPStateCurrentPower = QUuid("c9d0e1f2-a3b4-4c5d-6e7f-8a9b0c1d2e3f"); static const QUuid kHPStateCop = QUuid("d0e1f2a3-b4c5-4d6e-7f8a-9b0c1d2e3f4a"); static const QUuid kHPStateDefrostActive = QUuid("e1f2a3b4-c5d6-4e7f-8a9b-0c1d2e3f4a5b"); // ─── UUIDs ActionTypes — Heat Pump ────────────────────────── static const QUuid kHPActionSetMode = QUuid("a3b4c5d6-e7f8-4a9b-0c1d-2e3f4a5b6c7d"); static const QUuid kHPActionSetTargetTemperature = QUuid("c5d6e7f8-a9b0-4c1d-2e3f-4a5b6c7d8e9f"); static const QUuid kHPActionParamMode = QUuid("b4c5d6e7-f8a9-4b0c-1d2e-3f4a5b6c7d8e"); static const QUuid kHPActionParamTargetTemp = QUuid("d6e7f8a9-b0c1-4d2e-3f4a-5b6c7d8e9f0a"); // ─── UUIDs StateTypes — DHW ───────────────────────────────── static const QUuid kDHWStatePower = QUuid("d2e3f4a5-b6c7-4d8e-9f0a-1b2c3d4e5f6a"); static const QUuid kDHWStateTargetTemperature = QUuid("e3f4a5b6-c7d8-4e9f-0a1b-2c3d4e5f6a7b"); static const QUuid kDHWStateCurrentTemp = QUuid("f4a5b6c7-d8e9-4f0a-1b2c-3d4e5f6a7b8c"); static const QUuid kDHWStateBoostMode = QUuid("a5b6c7d8-e9f0-4a1b-2c3d-4e5f6a7b8c9d"); static const QUuid kDHWStateCurrentPower = QUuid("b6c7d8e9-f0a1-4b2c-3d4e-5f6a7b8c9d0e"); // ─── UUIDs ActionTypes — DHW ──────────────────────────────── static const QUuid kDHWActionTriggerBoost = QUuid("d8e9f0a1-b2c3-4d4e-5f6a-7b8c9d0e1f2a"); static const QUuid kDHWActionParamDuration = QUuid("e9f0a1b2-c3d4-4e5f-6a7b-8c9d0e1f2a3b"); // ───────────────────────────────────────────────────────────── class HeatPumpDevice; class DomesticHotWaterDevice; class HeatPumpManager : public QObject { Q_OBJECT public: explicit HeatPumpManager(EnergyManager *energyManager, ThingManager *thingManager, QObject *parent = nullptr); // ─── Heat Pump ─────────────────────────────────────────── /// Retourne tous les appareils PAC connus QList heatPumps() const; /// Allume/éteint une PAC EnergyManager::EnergyError setPower(const ThingId &thingId, bool on); /// Change le mode (heating / cooling / auto / standby) EnergyManager::EnergyError setMode(const ThingId &thingId, const QString &mode); /// Définit la température cible [15–65 °C] EnergyManager::EnergyError setTargetTemperature(const ThingId &thingId, double temperature); // ─── Domestic Hot Water ────────────────────────────────── QList dhwDevices() const; EnergyManager::EnergyError setDHWPower(const ThingId &thingId, bool on); EnergyManager::EnergyError setDHWTargetTemperature(const ThingId &thingId, double temperature); EnergyManager::EnergyError triggerDHWBoost(const ThingId &thingId, uint durationMinutes = 30); // ─── Gestion énergie ───────────────────────────────────── /// Puissance totale consommée par toutes les PAC + ECS double totalThermalPower() const; signals: void heatPumpAdded(const ThingId &thingId); void heatPumpRemoved(const ThingId &thingId); void heatPumpStateChanged(const ThingId &thingId, const QString &stateName, const QVariant &value); void dhwDeviceAdded(const ThingId &thingId); void dhwDeviceRemoved(const ThingId &thingId); void dhwStateChanged(const ThingId &thingId, const QString &stateName, const QVariant &value); private slots: void onThingAdded(Thing *thing); void onThingRemoved(const ThingId &thingId); void onThingStateChanged(Thing *thing, const StateType &stateType, const QVariant &value, const QVariant &minValue, const QVariant &maxValue); private: void setupHeatPump(Thing *thing); void setupDHWDevice(Thing *thing); EnergyManager *m_energyManager = nullptr; ThingManager *m_thingManager = nullptr; QHash m_heatPumps; QHash m_dhwDevices; }; // ───────────────────────────────────────────────────────────── // Wrappers de Thing // ───────────────────────────────────────────────────────────── class HeatPumpDevice : public QObject { Q_OBJECT public: explicit HeatPumpDevice(Thing *thing, QObject *parent = nullptr); ThingId id() const; QString name() const; Thing *thing() const; bool power() const; QString mode() const; // "heating" | "cooling" | "auto" | "standby" double targetTemperature() const; double currentTemperature() const; double currentPower() const; double cop() const; bool defrostActive() const; signals: void powerChanged(bool power); void modeChanged(const QString &mode); void targetTemperatureChanged(double temperature); void currentTemperatureChanged(double temperature); void currentPowerChanged(double power); void copChanged(double cop); private: Thing *m_thing = nullptr; }; class DomesticHotWaterDevice : public QObject { Q_OBJECT public: explicit DomesticHotWaterDevice(Thing *thing, QObject *parent = nullptr); ThingId id() const; QString name() const; Thing *thing() const; bool power() const; double targetTemperature() const; double currentTemperature() const; bool boostMode() const; double currentPower() const; signals: void powerChanged(bool power); void targetTemperatureChanged(double temperature); void currentTemperatureChanged(double temperature); void boostModeChanged(bool active); void currentPowerChanged(double power); private: Thing *m_thing = nullptr; }; #endif // HEATPUMPMANAGER_H