From 31f601a96ff53ac9d1c364b312628aa4404180f8 Mon Sep 17 00:00:00 2001 From: Michael Edholm Date: Wed, 14 Jan 2026 00:03:42 +0100 Subject: [PATCH 1/5] Added ability to set temperature --- .DS_Store | Bin 6148 -> 6148 bytes .homeyignore | 19 + app.json | 10 + docs/rawscan.txt | 2744 +++++++++++++++++++++++++ drivers/.DS_Store | Bin 0 -> 6148 bytes drivers/heat-pump/device.js | 104 +- drivers/heat-pump/driver.compose.json | 10 + lib/.DS_Store | Bin 0 -> 6148 bytes lib/bosch-xmpp | 2 +- package-lock.json | 14 +- 10 files changed, 2868 insertions(+), 35 deletions(-) create mode 100644 .homeyignore create mode 100644 docs/rawscan.txt create mode 100644 drivers/.DS_Store create mode 100644 lib/.DS_Store diff --git a/.DS_Store b/.DS_Store index 84f56612f1a27cb61eff36a7ae198c6a185c30e1..e53362f0f54c3dd0eee900583d1c46b776453b39 100644 GIT binary patch delta 91 zcmZoMXfc=|&e%S&P;8=}A|vy}0Ba!8Bd^NBkiwA9kjzk=QkZC-aNwGBRv-6gkX1v4I5ugM=B! delta 57 zcmZoMXfc=|&e%4wP;8=}A|vC(0Ba!8Bfs&AG5f>^nw!}<1UMMmHeUSBJeglamz9x$ Mf#JYrTam-e01GD(lmGw# diff --git a/.homeyignore b/.homeyignore new file mode 100644 index 0000000..04344dd --- /dev/null +++ b/.homeyignore @@ -0,0 +1,19 @@ +node_modules/ +.git/ +.gitignore +.vscode/ +.idea/ +*.log +*.md +!README.txt +.DS_Store +Thumbs.db +*.bak +*.tmp +test/ +tests/ +docs/ +documentation/ +tools/ +app.ts +.github/ \ No newline at end of file diff --git a/app.json b/app.json index 8ec20d2..ec683a2 100644 --- a/app.json +++ b/app.json @@ -128,6 +128,7 @@ "measure_temperature.return", "measure_temperature.outdoor", "measure_temperature.water", + "target_temperature", "alarm_status", "meter_power.last_hour_eheater", "meter_power.last_hour_total", @@ -158,6 +159,15 @@ "sv": "Vattentemperatur" } }, + "target_temperature": { + "title": { + "en": "Target Temperature", + "sv": "Måltemperatur" + }, + "min": 16, + "max": 25, + "step": 0.5 + }, "meter_power.last_hour_eheater": { "title": { "en": "Last hour (eheater)", diff --git a/docs/rawscan.txt b/docs/rawscan.txt new file mode 100644 index 0000000..72f59da --- /dev/null +++ b/docs/rawscan.txt @@ -0,0 +1,2744 @@ +data: + - - /systemStates: not found + - - id: /dhwCircuits + type: refEnum + references: + - id: /dhwCircuits/dhw1 + uri: http://THERMOSTAT/dhwCircuits/dhw1 + - id: /dhwCircuits/dhw1 + type: refEnum + references: + - id: /dhwCircuits/dhw1/operationMode + uri: http://THERMOSTAT/dhwCircuits/dhw1/operationMode + - id: /dhwCircuits/dhw1/switchPrograms + uri: http://THERMOSTAT/dhwCircuits/dhw1/switchPrograms + - id: /dhwCircuits/dhw1/temperatureLevels + uri: http://THERMOSTAT/dhwCircuits/dhw1/temperatureLevels + - id: /dhwCircuits/dhw1/currentSetpoint + uri: http://THERMOSTAT/dhwCircuits/dhw1/currentSetpoint + - id: /dhwCircuits/dhw1/actualTemp + uri: http://THERMOSTAT/dhwCircuits/dhw1/actualTemp + - id: /dhwCircuits/dhw1/waterFlow + uri: http://THERMOSTAT/dhwCircuits/dhw1/waterFlow + - id: /dhwCircuits/dhw1/workingTime + uri: http://THERMOSTAT/dhwCircuits/dhw1/workingTime + - id: /dhwCircuits/dhw1/charge + uri: http://THERMOSTAT/dhwCircuits/dhw1/charge + - id: /dhwCircuits/dhw1/chargeDuration + uri: http://THERMOSTAT/dhwCircuits/dhw1/chargeDuration + - id: /dhwCircuits/dhw1/tdMode + uri: http://THERMOSTAT/dhwCircuits/dhw1/tdMode + - id: /dhwCircuits/dhw1/tdsetPoint + uri: http://THERMOSTAT/dhwCircuits/dhw1/tdsetPoint + - id: /dhwCircuits/dhw1/tdweekDay + uri: http://THERMOSTAT/dhwCircuits/dhw1/tdweekDay + - id: /dhwCircuits/dhw1/tddayTime + uri: http://THERMOSTAT/dhwCircuits/dhw1/tddayTime + - id: /dhwCircuits/dhw1/cpStartph + uri: http://THERMOSTAT/dhwCircuits/dhw1/cpStartph + - id: /dhwCircuits/dhw1/singleChargeSetpoint + uri: http://THERMOSTAT/dhwCircuits/dhw1/singleChargeSetpoint + - id: /dhwCircuits/dhw1/extBlocked + uri: http://THERMOSTAT/dhwCircuits/dhw1/extBlocked + - id: /dhwCircuits/dhw1/highStop + uri: http://THERMOSTAT/dhwCircuits/dhw1/highStop + - id: /dhwCircuits/dhw1/holidayMode + uri: http://THERMOSTAT/dhwCircuits/dhw1/holidayMode + - id: /dhwCircuits/dhw1/status + uri: http://THERMOSTAT/dhwCircuits/dhw1/status + - id: /dhwCircuits/dhw1/operationMode + type: stringValue + writeable: 1 + recordable: 0 + value: low + allowedValues: + - low + - high + - eco + - id: /dhwCircuits/dhw1/switchPrograms + type: refEnum + references: [] + - id: /dhwCircuits/dhw1/temperatureLevels + type: refEnum + references: + - id: /dhwCircuits/dhw1/temperatureLevels/off + uri: http://THERMOSTAT/dhwCircuits/dhw1/temperatureLevels/off + - id: /dhwCircuits/dhw1/temperatureLevels/low + uri: http://THERMOSTAT/dhwCircuits/dhw1/temperatureLevels/low + - id: /dhwCircuits/dhw1/temperatureLevels/high + uri: http://THERMOSTAT/dhwCircuits/dhw1/temperatureLevels/high + - id: /dhwCircuits/dhw1/temperatureLevels/eco + uri: http://THERMOSTAT/dhwCircuits/dhw1/temperatureLevels/eco + - id: /dhwCircuits/dhw1/temperatureLevels/off + type: floatValue + writeable: 0 + recordable: 0 + value: 0 + unitOfMeasure: C + - id: /dhwCircuits/dhw1/temperatureLevels/low + type: floatValue + writeable: 1 + recordable: 0 + value: 47 + unitOfMeasure: C + minValue: 40 + maxValue: 52 + - id: /dhwCircuits/dhw1/temperatureLevels/high + type: floatValue + writeable: 1 + recordable: 0 + value: 51 + unitOfMeasure: C + minValue: 40 + maxValue: 52 + - id: /dhwCircuits/dhw1/temperatureLevels/eco + type: floatValue + writeable: 1 + recordable: 0 + value: 42 + unitOfMeasure: C + minValue: 30 + maxValue: 46 + - id: /dhwCircuits/dhw1/currentSetpoint + type: floatValue + writeable: 0 + recordable: 0 + value: 60 + unitOfMeasure: C + - id: /dhwCircuits/dhw1/actualTemp + type: floatValue + writeable: 0 + recordable: 0 + value: 52 + unitOfMeasure: C + state: + - open: -3276.8 + - short: 3276.7 + - id: /dhwCircuits/dhw1/waterFlow + type: floatValue + writeable: 0 + recordable: 0 + value: 0 + unitOfMeasure: l/min + - id: /dhwCircuits/dhw1/workingTime + type: floatValue + writeable: 0 + recordable: 0 + value: 0 + unitOfMeasure: mins + - id: /dhwCircuits/dhw1/charge + type: stringValue + writeable: 1 + recordable: 0 + value: stop + allowedValues: + - stop + - start + - id: /dhwCircuits/dhw1/chargeDuration + type: floatValue + writeable: 1 + recordable: 0 + value: 180 + unitOfMeasure: mins + minValue: 60 + maxValue: 2880 + - id: /dhwCircuits/dhw1/singleChargeSetpoint + type: floatValue + writeable: 1 + recordable: 0 + value: 65 + unitOfMeasure: C + minValue: 50 + maxValue: 70 + - id: /dhwCircuits/dhw1/holidayMode + type: refEnum + references: + - id: /dhwCircuits/dhw1/holidayMode/activated + uri: http://THERMOSTAT/dhwCircuits/dhw1/holidayMode/activated + - id: /dhwCircuits/dhw1/holidayMode/activated + type: stringValue + writeable: 0 + recordable: 0 + value: "" + allowedValues: + - "" + - hm1 + - hm2 + - hm3 + - hm4 + - hm5 + - id: /dhwCircuits/dhw1/status + type: stringValue + writeable: 0 + recordable: 0 + value: ACTIVE + allowedValues: + - INACTIVE + - ACTIVE + - - id: /gateway + type: refEnum + references: + - id: /gateway/uuid + uri: http://THERMOSTAT/gateway/uuid + - id: /gateway/firmware + uri: http://THERMOSTAT/gateway/firmware + - id: /gateway/userpassword + uri: http://THERMOSTAT/gateway/userpassword + - id: /gateway/versionFirmware + uri: http://THERMOSTAT/gateway/versionFirmware + - id: /gateway/versionHardware + uri: http://THERMOSTAT/gateway/versionHardware + - id: /gateway/boschSHPassword + uri: http://THERMOSTAT/gateway/boschSHPassword + - id: /gateway/portalPassword + uri: http://THERMOSTAT/gateway/portalPassword + - id: /gateway/knxPassword + uri: http://THERMOSTAT/gateway/knxPassword + - id: /gateway/haiPassword + uri: http://THERMOSTAT/gateway/haiPassword + - id: /gateway/DateTime + uri: http://THERMOSTAT/gateway/DateTime + - id: /gateway/instPassword + uri: http://THERMOSTAT/gateway/instPassword + - id: /gateway/instAccess + uri: http://THERMOSTAT/gateway/instAccess + - id: /gateway/instWriteAccess + uri: http://THERMOSTAT/gateway/instWriteAccess + - id: /gateway/version + uri: http://THERMOSTAT/gateway/version + - id: /gateway/update + uri: http://THERMOSTAT/gateway/update + - id: /gateway/logging + uri: http://THERMOSTAT/gateway/logging + - id: /gateway/uuid + type: stringValue + writeable: 0 + recordable: 0 + value: "-1" + allowedValues: + - "-1" + - id: /gateway/versionFirmware + type: stringValue + writeable: 0 + recordable: 0 + value: 04.08.02 + - id: /gateway/versionHardware + type: stringValue + writeable: 0 + recordable: 0 + value: iCom_Low_NSC_v1 + - id: /gateway/DateTime + type: stringValue + writeable: 1 + recordable: 0 + value: "2026-01-13T22:37:36" + - id: /gateway/instAccess + type: stringValue + writeable: 1 + recordable: 0 + value: "off" + allowedValues: + - "off" + - "on" + - id: /gateway/instWriteAccess + type: stringValue + writeable: 1 + recordable: 0 + value: "off" + allowedValues: + - "off" + - "on" + - id: /gateway/update + type: refEnum + references: + - id: /gateway/update/version + uri: http://THERMOSTAT/gateway/update/version + - id: /gateway/update/request + uri: http://THERMOSTAT/gateway/update/request + - id: /gateway/update/strategy + uri: http://THERMOSTAT/gateway/update/strategy + - id: /gateway/update/status + uri: http://THERMOSTAT/gateway/update/status + - id: /gateway/update/status + type: stringValue + writeable: 0 + recordable: 0 + value: completed + allowedValues: + - inprogress + - completed + - interrupted + - id: /gateway/logging + type: refEnum + references: + - id: /gateway/logging/switch + uri: http://THERMOSTAT/gateway/logging/switch + - id: /gateway/logging/reqBusVar + uri: http://THERMOSTAT/gateway/logging/reqBusVar + - id: /gateway/logging/userAcceptance + uri: http://THERMOSTAT/gateway/logging/userAcceptance + - id: /gateway/logging/userAcceptance + type: stringValue + writeable: 1 + recordable: 0 + value: "false" + allowedValues: + - "false" + - "true" + - - id: /heatingCircuits + type: refEnum + references: + - id: /heatingCircuits/hc1 + uri: http://THERMOSTAT/heatingCircuits/hc1 + - id: /heatingCircuits/hc1 + type: refEnum + references: + - id: /heatingCircuits/hc1/currentRoomSetpoint + uri: http://THERMOSTAT/heatingCircuits/hc1/currentRoomSetpoint + - id: /heatingCircuits/hc1/actualSupplyTemperature + uri: http://THERMOSTAT/heatingCircuits/hc1/actualSupplyTemperature + - id: /heatingCircuits/hc1/operationMode + uri: http://THERMOSTAT/heatingCircuits/hc1/operationMode + - id: /heatingCircuits/hc1/temperatureRoomSetpoint + uri: http://THERMOSTAT/heatingCircuits/hc1/temperatureRoomSetpoint + - id: /heatingCircuits/hc1/manualRoomSetpoint + uri: http://THERMOSTAT/heatingCircuits/hc1/manualRoomSetpoint + - id: /heatingCircuits/hc1/temporaryRoomSetpoint + uri: http://THERMOSTAT/heatingCircuits/hc1/temporaryRoomSetpoint + - id: /heatingCircuits/hc1/roomtemperature + uri: http://THERMOSTAT/heatingCircuits/hc1/roomtemperature + - id: /heatingCircuits/hc1/switchPrograms + uri: http://THERMOSTAT/heatingCircuits/hc1/switchPrograms + - id: /heatingCircuits/hc1/temperatureLevels + uri: http://THERMOSTAT/heatingCircuits/hc1/temperatureLevels + - id: /heatingCircuits/hc1/pumpModulation + uri: http://THERMOSTAT/heatingCircuits/hc1/pumpModulation + - id: /heatingCircuits/hc1/suWiThreshold + uri: http://THERMOSTAT/heatingCircuits/hc1/suWiThreshold + - id: /heatingCircuits/hc1/designTemp + uri: http://THERMOSTAT/heatingCircuits/hc1/designTemp + - id: /heatingCircuits/hc1/heatCurveMin + uri: http://THERMOSTAT/heatingCircuits/hc1/heatCurveMin + - id: /heatingCircuits/hc1/heatCurveMax + uri: http://THERMOSTAT/heatingCircuits/hc1/heatCurveMax + - id: /heatingCircuits/hc1/suWiSwitchMode + uri: http://THERMOSTAT/heatingCircuits/hc1/suWiSwitchMode + - id: /heatingCircuits/hc1/currentOpModeInfo + uri: http://THERMOSTAT/heatingCircuits/hc1/currentOpModeInfo + - id: /heatingCircuits/hc1/cooling + uri: http://THERMOSTAT/heatingCircuits/hc1/cooling + - id: /heatingCircuits/hc1/currentSuWiMode + uri: http://THERMOSTAT/heatingCircuits/hc1/currentSuWiMode + - id: /heatingCircuits/hc1/holidayMode + uri: http://THERMOSTAT/heatingCircuits/hc1/holidayMode + - id: /heatingCircuits/hc1/status + uri: http://THERMOSTAT/heatingCircuits/hc1/status + - id: /heatingCircuits/hc1/currentRoomSetpoint + type: floatValue + writeable: 0 + recordable: 0 + value: 21 + unitOfMeasure: C + state: + - "off": 0 + - id: /heatingCircuits/hc1/actualSupplyTemperature + type: floatValue + writeable: 0 + recordable: 0 + value: 35.6 + unitOfMeasure: C + state: + - open: -3276.8 + - short: 3276.7 + - id: /heatingCircuits/hc1/operationMode + type: stringValue + writeable: 1 + recordable: 0 + value: manual + allowedValues: + - manual + - id: /heatingCircuits/hc1/temperatureRoomSetpoint + type: floatValue + writeable: 1 + recordable: 0 + value: 21 + unitOfMeasure: C + minValue: 5 + maxValue: 30 + state: + - "off": 0 + - id: /heatingCircuits/hc1/manualRoomSetpoint + type: floatValue + writeable: 1 + recordable: 0 + value: 21 + unitOfMeasure: C + minValue: 5 + maxValue: 30 + state: + - "off": 0 + - id: /heatingCircuits/hc1/temporaryRoomSetpoint + type: floatValue + writeable: 1 + recordable: 0 + value: -1 + unitOfMeasure: C + minValue: 5 + maxValue: 30 + state: + - "off": 0 + - na: -1 + - id: /heatingCircuits/hc1/roomtemperature + type: floatValue + writeable: 0 + recordable: 1 + value: 21.5 + unitOfMeasure: C + state: + - open: -3276.8 + - short: 3276.7 + - id: /heatingCircuits/hc1/switchPrograms + type: refEnum + references: [] + - id: /heatingCircuits/hc1/temperatureLevels + type: refEnum + references: + - id: /heatingCircuits/hc1/temperatureLevels/eco + uri: http://THERMOSTAT/heatingCircuits/hc1/temperatureLevels/eco + - id: /heatingCircuits/hc1/temperatureLevels/comfort2 + uri: http://THERMOSTAT/heatingCircuits/hc1/temperatureLevels/comfort2 + - id: /heatingCircuits/hc1/temperatureLevels/eco + type: floatValue + writeable: 1 + recordable: 0 + value: 15 + unitOfMeasure: C + minValue: 5 + maxValue: 20.5 + state: + - "off": 0 + - id: /heatingCircuits/hc1/temperatureLevels/comfort2 + type: floatValue + writeable: 1 + recordable: 0 + value: 21 + unitOfMeasure: C + minValue: 15.5 + maxValue: 30 + - id: /heatingCircuits/hc1/pumpModulation + type: floatValue + writeable: 0 + recordable: 0 + value: 0 + unitOfMeasure: "%" + - id: /heatingCircuits/hc1/suWiThreshold + type: floatValue + writeable: 1 + recordable: 0 + value: 20 + unitOfMeasure: C + minValue: 5 + maxValue: 35 + - id: /heatingCircuits/hc1/suWiSwitchMode + type: stringValue + writeable: 1 + recordable: 0 + value: automatic + allowedValues: + - automatic + - id: /heatingCircuits/hc1/cooling + type: refEnum + references: [] + - id: /heatingCircuits/hc1/currentSuWiMode + type: stringValue + writeable: 0 + recordable: 0 + value: forced + allowedValues: + - "off" + - forced + - cooling + - id: /heatingCircuits/hc1/holidayMode + type: refEnum + references: + - id: /heatingCircuits/hc1/holidayMode/activated + uri: http://THERMOSTAT/heatingCircuits/hc1/holidayMode/activated + - id: /heatingCircuits/hc1/holidayMode/activated + type: stringValue + writeable: 0 + recordable: 0 + value: "" + allowedValues: + - "" + - hm1 + - hm2 + - hm3 + - hm4 + - hm5 + - id: /heatingCircuits/hc1/status + type: stringValue + writeable: 0 + recordable: 0 + value: ACTIVE + allowedValues: + - INACTIVE + - ACTIVE + - - id: /heatSources + type: refEnum + references: + - id: /heatSources/info + uri: http://THERMOSTAT/heatSources/info + - id: /heatSources/actualModulation + uri: http://THERMOSTAT/heatSources/actualModulation + - id: /heatSources/burnerModulationSetpoint + uri: http://THERMOSTAT/heatSources/burnerModulationSetpoint + - id: /heatSources/flameStatus + uri: http://THERMOSTAT/heatSources/flameStatus + - id: /heatSources/actualSupplyTemperature + uri: http://THERMOSTAT/heatSources/actualSupplyTemperature + - id: /heatSources/powerSetpoint + uri: http://THERMOSTAT/heatSources/powerSetpoint + - id: /heatSources/ChimneySweeper + uri: http://THERMOSTAT/heatSources/ChimneySweeper + - id: /heatSources/returnTemperature + uri: http://THERMOSTAT/heatSources/returnTemperature + - id: /heatSources/numberOfStarts + uri: http://THERMOSTAT/heatSources/numberOfStarts + - id: /heatSources/supplyTemperatureSetpoint + uri: http://THERMOSTAT/heatSources/supplyTemperatureSetpoint + - id: /heatSources/applianceSupplyTemperature + uri: http://THERMOSTAT/heatSources/applianceSupplyTemperature + - id: /heatSources/cumulatedHeatEnergySecondBurner + uri: http://THERMOSTAT/heatSources/cumulatedHeatEnergySecondBurner + - id: /heatSources/smartGridMode + uri: http://THERMOSTAT/heatSources/smartGridMode + - id: /heatSources/evuActive + uri: http://THERMOSTAT/heatSources/evuActive + - id: /heatSources/elecSolarCollectorActive + uri: http://THERMOSTAT/heatSources/elecSolarCollectorActive + - id: /heatSources/poolTemperature + uri: http://THERMOSTAT/heatSources/poolTemperature + - id: /heatSources/delayTimer + uri: http://THERMOSTAT/heatSources/delayTimer + - id: /heatSources/heating + uri: http://THERMOSTAT/heatSources/heating + - id: /heatSources/Source + uri: http://THERMOSTAT/heatSources/Source + - id: /heatSources/sensors + uri: http://THERMOSTAT/heatSources/sensors + - id: /heatSources/workingTime + uri: http://THERMOSTAT/heatSources/workingTime + - id: /heatSources/fuelCell + uri: http://THERMOSTAT/heatSources/fuelCell + - id: /heatSources/energyMonitoring + uri: http://THERMOSTAT/heatSources/energyMonitoring + - id: /heatSources/hs1 + uri: http://THERMOSTAT/heatSources/hs1 + - id: /heatSources/ch + uri: http://THERMOSTAT/heatSources/ch + - id: /heatSources/dhw + uri: http://THERMOSTAT/heatSources/dhw + - id: /heatSources/pool + uri: http://THERMOSTAT/heatSources/pool + - id: /heatSources/total + uri: http://THERMOSTAT/heatSources/total + - id: /heatSources/electricGrid + uri: http://THERMOSTAT/heatSources/electricGrid + - id: /heatSources/info + type: systeminfo + recordable: 0 + writeable: 0 + values: + - Tok: "8" + Id: "20007" + Ver: "75" + "No": >- + 323630303137383030303031353837333337313036393800000000000000000000000000000000000000000000000000000000000000 + - id: /heatSources/actualModulation + type: floatValue + writeable: 0 + recordable: 0 + value: 32 + unitOfMeasure: "%" + - id: /heatSources/burnerModulationSetpoint + type: floatValue + writeable: 0 + recordable: 0 + value: 32 + unitOfMeasure: "%" + - id: /heatSources/flameStatus + type: stringValue + writeable: 0 + recordable: 0 + value: "off" + allowedValues: + - "off" + - "on" + - id: /heatSources/actualSupplyTemperature + type: floatValue + writeable: 0 + recordable: 0 + value: 35.6 + unitOfMeasure: C + state: + - open: -3276.8 + - short: 3276.7 + - id: /heatSources/powerSetpoint + type: floatValue + writeable: 0 + recordable: 0 + value: 32 + unitOfMeasure: "%" + - id: /heatSources/ChimneySweeper + type: stringValue + writeable: 0 + recordable: 0 + value: "off" + - id: /heatSources/returnTemperature + type: floatValue + writeable: 0 + recordable: 0 + value: 32.2 + unitOfMeasure: C + state: + - open: -3276.8 + - short: 3276.7 + - id: /heatSources/numberOfStarts + type: floatValue + writeable: 0 + recordable: 0 + value: 10384 + unitOfMeasure: " " + - id: /heatSources/supplyTemperatureSetpoint + type: floatValue + writeable: 0 + recordable: 0 + value: 36 + unitOfMeasure: C + - id: /heatSources/applianceSupplyTemperature + type: floatValue + writeable: 0 + recordable: 0 + value: 35.6 + unitOfMeasure: C + state: + - open: -3276.8 + - short: 3276.7 + - id: /heatSources/cumulatedHeatEnergySecondBurner + type: floatValue + writeable: 0 + recordable: 0 + value: 81540 + unitOfMeasure: kWh + - id: /heatSources/poolTemperature + type: floatValue + writeable: 0 + recordable: 0 + value: -3276.8 + unitOfMeasure: C + state: + - open: -3276.8 + - short: 3276.7 + - id: /heatSources/delayTimer + type: arrayData + writeable: 0 + recordable: 0 + values: + - alarm + allowedValues: + - warm + - compStart + - integrator + - addIntegrator + - alarm + - dhw + - ch + - mixer + - hc1CoolStart + - hc2CoolStart + - hc3CoolStart + - hc4CoolStart + - hc1HeatStart + - hc2HeatStart + - hc3HeatStart + - hc4HeatStart + - hc1CoolStop + - hc2CoolStop + - hc3CoolStop + - hc4CoolStop + - hc1HeatStop + - hc2HeatStop + - hc3HeatStop + - hc4HeatStop + - id: /heatSources/heating + type: refEnum + references: + - id: /heatSources/heating/extBlocked + uri: http://THERMOSTAT/heatSources/heating/extBlocked + - id: /heatSources/Source + type: refEnum + references: + - id: /heatSources/Source/Compressor + uri: http://THERMOSTAT/heatSources/Source/Compressor + - id: /heatSources/Source/eHeater + uri: http://THERMOSTAT/heatSources/Source/eHeater + - id: /heatSources/Source/Compressor + type: refEnum + references: + - id: /heatSources/Source/Compressor/extBlocked + uri: http://THERMOSTAT/heatSources/Source/Compressor/extBlocked + - id: /heatSources/Source/Compressor/power + uri: http://THERMOSTAT/heatSources/Source/Compressor/power + - id: /heatSources/Source/eHeater + type: refEnum + references: + - id: /heatSources/Source/eHeater/extBlocked + uri: http://THERMOSTAT/heatSources/Source/eHeater/extBlocked + - id: /heatSources/Source/eHeater/dhw + uri: http://THERMOSTAT/heatSources/Source/eHeater/dhw + - id: /heatSources/Source/eHeater/status + uri: http://THERMOSTAT/heatSources/Source/eHeater/status + - id: /heatSources/sensors + type: refEnum + references: + - id: /heatSources/sensors/collectorInTemp + uri: http://THERMOSTAT/heatSources/sensors/collectorInTemp + - id: /heatSources/sensors/collectorOutTemp + uri: http://THERMOSTAT/heatSources/sensors/collectorOutTemp + - id: /heatSources/sensors/compressorTemp + uri: http://THERMOSTAT/heatSources/sensors/compressorTemp + - id: /heatSources/workingTime + type: refEnum + references: + - id: /heatSources/workingTime/totalSystem + uri: http://THERMOSTAT/heatSources/workingTime/totalSystem + - id: /heatSources/workingTime/totalSystem + type: floatValue + writeable: 0 + recordable: 0 + value: 57201900 + unitOfMeasure: s + - id: /heatSources/fuelCell + type: refEnum + references: [] + - id: /heatSources/energyMonitoring + type: refEnum + references: + - id: /heatSources/energyMonitoring/consumption + uri: http://THERMOSTAT/heatSources/energyMonitoring/consumption + - id: /heatSources/energyMonitoring/correctionFactor + uri: http://THERMOSTAT/heatSources/energyMonitoring/correctionFactor + - id: /heatSources/energyMonitoring/maxTankLevel + uri: http://THERMOSTAT/heatSources/energyMonitoring/maxTankLevel + - id: /heatSources/energyMonitoring/minTankLevel + uri: http://THERMOSTAT/heatSources/energyMonitoring/minTankLevel + - id: /heatSources/energyMonitoring/tankLevel + uri: http://THERMOSTAT/heatSources/energyMonitoring/tankLevel + - id: /heatSources/energyMonitoring/startDateTime + uri: http://THERMOSTAT/heatSources/energyMonitoring/startDateTime + - id: /heatSources/energyMonitoring/consumption + type: floatValue + writeable: 1 + recordable: 0 + value: 0 + unitOfMeasure: kWh + minValue: 0 + maxValue: 135780000 + - id: /heatSources/hs1 + type: refEnum + references: + - id: /heatSources/hs1/info + uri: http://THERMOSTAT/heatSources/hs1/info + - id: /heatSources/hs1/type + uri: http://THERMOSTAT/heatSources/hs1/type + - id: /heatSources/hs1/actualModulation + uri: http://THERMOSTAT/heatSources/hs1/actualModulation + - id: /heatSources/hs1/flameStatus + uri: http://THERMOSTAT/heatSources/hs1/flameStatus + - id: /heatSources/hs1/info + type: systeminfo + recordable: 0 + writeable: 0 + values: + - Tok: "8" + Id: "20007" + Ver: "75" + "No": >- + 323630303137383030303031353837333337313036393800000000000000000000000000000000000000000000000000000000000000 + - id: /heatSources/hs1/type + type: stringValue + writeable: 0 + recordable: 0 + value: Heatpump + allowedValues: + - No_Appliance + - OilBoiler + - GasBoiler + - Heatpump + - unknownBoiler + - id: /heatSources/hs1/actualModulation + type: floatValue + writeable: 0 + recordable: 0 + value: 32 + unitOfMeasure: "%" + - id: /heatSources/hs1/flameStatus + type: stringValue + writeable: 0 + recordable: 0 + value: "off" + allowedValues: + - "off" + - "on" + - id: /heatSources/ch + type: refEnum + references: + - id: /heatSources/ch/energyMonitoring + uri: http://THERMOSTAT/heatSources/ch/energyMonitoring + - id: /heatSources/ch/energyMonitoring + type: refEnum + references: + - id: /heatSources/ch/energyMonitoring/outputProduced + uri: http://THERMOSTAT/heatSources/ch/energyMonitoring/outputProduced + - id: /heatSources/ch/energyMonitoring/eheater + uri: http://THERMOSTAT/heatSources/ch/energyMonitoring/eheater + - id: /heatSources/ch/energyMonitoring/compressor + uri: http://THERMOSTAT/heatSources/ch/energyMonitoring/compressor + - id: /heatSources/ch/energyMonitoring/workingTime + uri: http://THERMOSTAT/heatSources/ch/energyMonitoring/workingTime + - id: /heatSources/ch/energyMonitoring/numberOfStarts + uri: http://THERMOSTAT/heatSources/ch/energyMonitoring/numberOfStarts + - id: /heatSources/dhw + type: refEnum + references: + - id: /heatSources/dhw/energyMonitoring + uri: http://THERMOSTAT/heatSources/dhw/energyMonitoring + - id: /heatSources/dhw/energyMonitoring + type: refEnum + references: + - id: /heatSources/dhw/energyMonitoring/outputProduced + uri: http://THERMOSTAT/heatSources/dhw/energyMonitoring/outputProduced + - id: /heatSources/dhw/energyMonitoring/eheater + uri: http://THERMOSTAT/heatSources/dhw/energyMonitoring/eheater + - id: /heatSources/dhw/energyMonitoring/compressor + uri: http://THERMOSTAT/heatSources/dhw/energyMonitoring/compressor + - id: /heatSources/dhw/energyMonitoring/workingTime + uri: http://THERMOSTAT/heatSources/dhw/energyMonitoring/workingTime + - id: /heatSources/dhw/energyMonitoring/numberOfStarts + uri: http://THERMOSTAT/heatSources/dhw/energyMonitoring/numberOfStarts + - id: /heatSources/pool + type: refEnum + references: + - id: /heatSources/pool/energyMonitoring + uri: http://THERMOSTAT/heatSources/pool/energyMonitoring + - id: /heatSources/pool/energyMonitoring + type: refEnum + references: + - id: /heatSources/pool/energyMonitoring/outputProduced + uri: http://THERMOSTAT/heatSources/pool/energyMonitoring/outputProduced + - id: /heatSources/pool/energyMonitoring/eheater + uri: http://THERMOSTAT/heatSources/pool/energyMonitoring/eheater + - id: /heatSources/pool/energyMonitoring/compressor + uri: http://THERMOSTAT/heatSources/pool/energyMonitoring/compressor + - id: /heatSources/pool/energyMonitoring/workingTime + uri: http://THERMOSTAT/heatSources/pool/energyMonitoring/workingTime + - id: /heatSources/pool/energyMonitoring/numberOfStarts + uri: http://THERMOSTAT/heatSources/pool/energyMonitoring/numberOfStarts + - id: /heatSources/total + type: refEnum + references: + - id: /heatSources/total/energyMonitoring + uri: http://THERMOSTAT/heatSources/total/energyMonitoring + - id: /heatSources/total/energyMonitoring + type: refEnum + references: + - id: /heatSources/total/energyMonitoring/consumedEnergy + uri: >- + http://THERMOSTAT/heatSources/total/energyMonitoring/consumedEnergy + - id: /heatSources/total/energyMonitoring/outputProduced + uri: >- + http://THERMOSTAT/heatSources/total/energyMonitoring/outputProduced + - id: /heatSources/total/energyMonitoring/eheater + uri: http://THERMOSTAT/heatSources/total/energyMonitoring/eheater + - id: /heatSources/total/energyMonitoring/compressor + uri: http://THERMOSTAT/heatSources/total/energyMonitoring/compressor + - id: /heatSources/total/energyMonitoring/workingTime + uri: http://THERMOSTAT/heatSources/total/energyMonitoring/workingTime + - id: /heatSources/total/energyMonitoring/numberOfStarts + uri: >- + http://THERMOSTAT/heatSources/total/energyMonitoring/numberOfStarts + - id: /heatSources/electricGrid + type: refEnum + references: [] + - - id: /notifications + type: errorList + recordable: 0 + writeable: 0 + values: [] + - - id: /system + type: refEnum + references: + - id: /system/brand + uri: http://THERMOSTAT/system/brand + - id: /system/systemType + uri: http://THERMOSTAT/system/systemType + - id: /system/bus + uri: http://THERMOSTAT/system/bus + - id: /system/busReq + uri: http://THERMOSTAT/system/busReq + - id: /system/info + uri: http://THERMOSTAT/system/info + - id: /system/minOutdoorTemp + uri: http://THERMOSTAT/system/minOutdoorTemp + - id: /system/healthStatus + uri: http://THERMOSTAT/system/healthStatus + - id: /system/sensors + uri: http://THERMOSTAT/system/sensors + - id: /system/appliance + uri: http://THERMOSTAT/system/appliance + - id: /system/holidayModes + uri: http://THERMOSTAT/system/holidayModes + - id: /system/brand + type: stringValue + writeable: 0 + recordable: 0 + value: IVT + allowedValues: + - unknown + - Bosch + - Junkers + - Buderus + - Nefit + - Sieger + - Tata + - Dakon + - Elm + - Boulter + - Vulcano + - Worcester + - British Gas + - IVT + - Geminox + - Neckar + - Zeus + - Milton + - id: /system/systemType + type: stringValue + writeable: 0 + recordable: 0 + value: NSC_ICOM_GATEWAY + allowedValues: + - NSC_ICOM_GATEWAY + - id: /system/bus + type: stringValue + writeable: 0 + recordable: 0 + value: EMS2_0 + allowedValues: + - No_Bus + - EMS1_0 + - EMS2_0 + - CAN + - id: /system/info + type: systeminfo + recordable: 0 + writeable: 0 + values: + - Tok: "8" + Id: "172" + Ver: "02.03" + "No": >- + 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + - Tok: "16" + Id: "172" + Ver: NF02.03 + "No": >- + 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + - Tok: "9" + Id: "240" + Ver: NF38.03 + "No": >- + 333136333038353530323130383032313030323132363538373138363735343435000000000000000000 + - Tok: "80" + Id: "218" + Ver: NF03.03 + "No": >- + 3337333031343030303033383238373138363737333334FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 + - id: /system/minOutdoorTemp + type: floatValue + writeable: 1 + recordable: 0 + value: -20 + unitOfMeasure: C + minValue: -35 + maxValue: 10 + - id: /system/healthStatus + type: stringValue + writeable: 0 + recordable: 0 + value: ok + allowedValues: + - error + - maintenance + - ok + - id: /system/sensors + type: refEnum + references: + - id: /system/sensors/temperatures + uri: http://THERMOSTAT/system/sensors/temperatures + - id: /system/sensors/temperatures + type: refEnum + references: + - id: /system/sensors/temperatures/outdoor_t1 + uri: http://THERMOSTAT/system/sensors/temperatures/outdoor_t1 + - id: /system/sensors/temperatures/supply_t1_setpoint + uri: http://THERMOSTAT/system/sensors/temperatures/supply_t1_setpoint + - id: /system/sensors/temperatures/supply_t1 + uri: http://THERMOSTAT/system/sensors/temperatures/supply_t1 + - id: /system/sensors/temperatures/return + uri: http://THERMOSTAT/system/sensors/temperatures/return + - id: /system/sensors/temperatures/switch + uri: http://THERMOSTAT/system/sensors/temperatures/switch + - id: /system/sensors/temperatures/outdoor_t1 + type: floatValue + writeable: 0 + recordable: 1 + value: 1.7 + unitOfMeasure: C + state: + - open: -3276.8 + - short: 3276.7 + - id: /system/sensors/temperatures/supply_t1_setpoint + type: floatValue + writeable: 0 + recordable: 0 + value: 36 + unitOfMeasure: C + - id: /system/sensors/temperatures/supply_t1 + type: floatValue + writeable: 0 + recordable: 0 + value: 35.6 + unitOfMeasure: C + state: + - open: -3276.8 + - short: 3276.7 + - id: /system/sensors/temperatures/return + type: floatValue + writeable: 0 + recordable: 0 + value: 32.2 + unitOfMeasure: C + state: + - open: -3276.8 + - short: 3276.7 + - id: /system/sensors/temperatures/switch + type: floatValue + writeable: 0 + recordable: 0 + value: 35.6 + unitOfMeasure: C + state: + - open: -3276.8 + - short: 3276.7 + - id: /system/appliance + type: refEnum + references: + - id: /system/appliance/actualSupplyTemperature + uri: http://THERMOSTAT/system/appliance/actualSupplyTemperature + - id: /system/appliance/actualSupplyTemperature + type: floatValue + writeable: 0 + recordable: 0 + value: 35.6 + unitOfMeasure: C + state: + - open: -3276.8 + - short: 3276.7 + - id: /system/holidayModes + type: refEnum + references: + - id: /system/holidayModes/hm1 + uri: http://THERMOSTAT/system/holidayModes/hm1 + - id: /system/holidayModes/hm1 + type: refEnum + references: + - id: /system/holidayModes/hm1/startStop + uri: http://THERMOSTAT/system/holidayModes/hm1/startStop + - id: /system/holidayModes/hm1/fixTemperature + uri: http://THERMOSTAT/system/holidayModes/hm1/fixTemperature + - id: /system/holidayModes/hm1/delete + uri: http://THERMOSTAT/system/holidayModes/hm1/delete + - id: /system/holidayModes/hm1/startStop + type: stringValue + writeable: 1 + recordable: 0 + value: 2018-01-01/2018-01-01 + - id: /system/holidayModes/hm1/fixTemperature + type: floatValue + writeable: 1 + recordable: 0 + value: 17 + unitOfMeasure: C + minValue: 5 + maxValue: 30 + - - id: /solarCircuits + type: refEnum + references: [] + - - id: /recordings + type: refEnum + references: + - id: /recordings/system + uri: http://THERMOSTAT/recordings/system + - id: /recordings/heatSources + uri: http://THERMOSTAT/recordings/heatSources + - id: /recordings/heatingCircuits + uri: http://THERMOSTAT/recordings/heatingCircuits + - id: /recordings/dhwCircuits + uri: http://THERMOSTAT/recordings/dhwCircuits + - id: /recordings/system + type: refEnum + references: + - id: /recordings/system/sensors + uri: http://THERMOSTAT/recordings/system/sensors + - id: /recordings/system/heatSources + uri: http://THERMOSTAT/recordings/system/heatSources + - id: /recordings/system/sensors + type: refEnum + references: + - id: /recordings/system/sensors/temperatures + uri: http://THERMOSTAT/recordings/system/sensors/temperatures + - id: /recordings/system/sensors/temperatures + type: refEnum + references: + - id: /recordings/system/sensors/temperatures/outdoor_t1 + uri: >- + http://THERMOSTAT/recordings/system/sensors/temperatures/outdoor_t1 + - id: /recordings/system/sensors/temperatures/outdoor_t1?interval=2026-1-12 + type: yRecording + writeable: 0 + recordable: 0 + recordedResource: + id: /system/sensors/temperatures/outdoor_t1 + uri: http://192.168.7.67/system/sensors/temperatures/outdoor_t1 + interval: 2026-1-12 + sampleRate: P1H + recording-type: actual + recording: + - "y": -173 + c: 60 + - "y": -173 + c: 60 + - "y": -173 + c: 60 + - "y": -170 + c: 59 + - "y": -192 + c: 60 + - "y": -233 + c: 60 + - "y": -276 + c: 60 + - "y": -263 + c: 60 + - "y": -233 + c: 60 + - "y": -229 + c: 59 + - "y": -233 + c: 60 + - "y": -182 + c: 60 + - "y": -173 + c: 60 + - "y": -173 + c: 60 + - "y": -173 + c: 60 + - "y": -170 + c: 59 + - "y": -173 + c: 60 + - "y": -153 + c: 60 + - "y": -164 + c: 60 + - "y": -146 + c: 60 + - "y": -58 + c: 60 + - "y": -52 + c: 59 + - "y": -53 + c: 60 + - "y": -15 + c: 60 + - id: /recordings/system/sensors/temperatures/outdoor_t1?interval=2026-1 + type: yRecording + writeable: 0 + recordable: 0 + recordedResource: + id: /system/sensors/temperatures/outdoor_t1 + uri: http://192.168.7.67/system/sensors/temperatures/outdoor_t1 + interval: 2026-1 + sampleRate: P1D + recording-type: actual + recording: + - "y": 162 + c: 1435 + - "y": -215 + c: 1436 + - "y": -1138 + c: 1436 + - "y": -5221 + c: 1436 + - "y": -7172 + c: 1436 + - "y": 0 + c: 1435 + - "y": -2888 + c: 1436 + - "y": 279 + c: 1437 + - "y": -2309 + c: 1436 + - "y": -6240 + c: 1435 + - "y": -4405 + c: 1436 + - "y": -4033 + c: 1436 + - "y": 119 + c: 1316 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - id: /recordings/system/sensors/temperatures/outdoor_t1?interval=2026-W3 + type: yRecording + writeable: 0 + recordable: 0 + recordedResource: + id: /system/sensors/temperatures/outdoor_t1 + uri: http://192.168.7.67/system/sensors/temperatures/outdoor_t1 + interval: 2026-W3 + sampleRate: P6H + recording-type: actual + recording: + - "y": -1114 + c: 359 + - "y": -1416 + c: 359 + - "y": -1015 + c: 359 + - "y": -488 + c: 359 + - "y": -81 + c: 359 + - "y": -84 + c: 359 + - "y": 45 + c: 359 + - "y": 239 + c: 239 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - id: /recordings/system/sensors/temperatures/outdoor_t1 + type: yRecording + writeable: 0 + recordable: 0 + recordedResource: + id: /system/sensors/temperatures/outdoor_t1 + uri: http://192.168.7.67/system/sensors/temperatures/outdoor_t1 + interval: "" + sampleRate: "" + recording-type: actual + recording: [] + - id: /recordings/system/heatSources + type: refEnum + references: + - id: /recordings/system/heatSources/hs1 + uri: http://THERMOSTAT/recordings/system/heatSources/hs1 + - id: /recordings/system/heatSources/hs1 + type: refEnum + references: [] + - id: /recordings/heatSources + type: refEnum + references: + - id: /recordings/heatSources/hs1 + uri: http://THERMOSTAT/recordings/heatSources/hs1 + - id: /recordings/heatSources/total + uri: http://THERMOSTAT/recordings/heatSources/total + - id: /recordings/heatSources/hs1 + type: refEnum + references: [] + - id: /recordings/heatSources/total + type: refEnum + references: + - id: /recordings/heatSources/total/energyMonitoring + uri: http://THERMOSTAT/recordings/heatSources/total/energyMonitoring + - id: /recordings/heatSources/total/energyMonitoring + type: refEnum + references: + - id: /recordings/heatSources/total/energyMonitoring/consumedEnergy + uri: >- + http://THERMOSTAT/recordings/heatSources/total/energyMonitoring/consumedEnergy + - id: /recordings/heatSources/total/energyMonitoring/outputProduced + uri: >- + http://THERMOSTAT/recordings/heatSources/total/energyMonitoring/outputProduced + - id: /recordings/heatSources/total/energyMonitoring/eheater + uri: >- + http://THERMOSTAT/recordings/heatSources/total/energyMonitoring/eheater + - id: /recordings/heatSources/total/energyMonitoring/compressor + uri: >- + http://THERMOSTAT/recordings/heatSources/total/energyMonitoring/compressor + - id: >- + /recordings/heatSources/total/energyMonitoring/consumedEnergy?interval=2026-1-12 + type: yRecording + writeable: 0 + recordable: 0 + recordedResource: + id: /heatSources/total/energyMonitoring/consumedEnergy + uri: >- + http://192.168.7.67/heatSources/total/energyMonitoring/consumedEnergy + interval: 2026-1-12 + sampleRate: P1H + recording-type: actual + recording: + - "y": 120 + c: 60 + - "y": 120 + c: 60 + - "y": 120 + c: 60 + - "y": 120 + c: 59 + - "y": 60 + c: 60 + - "y": 120 + c: 60 + - "y": 120 + c: 60 + - "y": 120 + c: 60 + - "y": 120 + c: 60 + - "y": 180 + c: 59 + - "y": 120 + c: 60 + - "y": 60 + c: 60 + - "y": 60 + c: 60 + - "y": 60 + c: 60 + - "y": 120 + c: 60 + - "y": 60 + c: 59 + - "y": 120 + c: 60 + - "y": 60 + c: 60 + - "y": 120 + c: 60 + - "y": 120 + c: 60 + - "y": 120 + c: 60 + - "y": 60 + c: 59 + - "y": 60 + c: 60 + - "y": 60 + c: 60 + - id: >- + /recordings/heatSources/total/energyMonitoring/consumedEnergy?interval=2026-1 + type: yRecording + writeable: 0 + recordable: 0 + recordedResource: + id: /heatSources/total/energyMonitoring/consumedEnergy + uri: >- + http://192.168.7.67/heatSources/total/energyMonitoring/consumedEnergy + interval: 2026-1 + sampleRate: P1D + recording-type: actual + recording: + - "y": 1380 + c: 1435 + - "y": 1200 + c: 1436 + - "y": 1260 + c: 1436 + - "y": 1800 + c: 1436 + - "y": 1560 + c: 1436 + - "y": 2460 + c: 1435 + - "y": 2580 + c: 1436 + - "y": 2460 + c: 1437 + - "y": 2640 + c: 1436 + - "y": 2700 + c: 1435 + - "y": 2400 + c: 1436 + - "y": 2400 + c: 1436 + - "y": 1980 + c: 1316 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - id: >- + /recordings/heatSources/total/energyMonitoring/consumedEnergy?interval=2026-W3 + type: yRecording + writeable: 0 + recordable: 0 + recordedResource: + id: /heatSources/total/energyMonitoring/consumedEnergy + uri: >- + http://192.168.7.67/heatSources/total/energyMonitoring/consumedEnergy + interval: 2026-W3 + sampleRate: P6H + recording-type: actual + recording: + - "y": 660 + c: 359 + - "y": 720 + c: 359 + - "y": 480 + c: 359 + - "y": 540 + c: 359 + - "y": 480 + c: 359 + - "y": 720 + c: 359 + - "y": 480 + c: 359 + - "y": 300 + c: 239 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - id: /recordings/heatSources/total/energyMonitoring/consumedEnergy + type: yRecording + writeable: 0 + recordable: 0 + recordedResource: + id: /heatSources/total/energyMonitoring/consumedEnergy + uri: >- + http://192.168.7.67/heatSources/total/energyMonitoring/consumedEnergy + interval: "" + sampleRate: "" + recording-type: actual + recording: [] + - id: >- + /recordings/heatSources/total/energyMonitoring/outputProduced?interval=2026-1-12 + type: yRecording + writeable: 0 + recordable: 0 + recordedResource: + id: /heatSources/total/energyMonitoring/outputProduced + uri: >- + http://192.168.7.67/heatSources/total/energyMonitoring/outputProduced + interval: 2026-1-12 + sampleRate: P1H + recording-type: actual + recording: + - "y": 360 + c: 60 + - "y": 420 + c: 60 + - "y": 420 + c: 60 + - "y": 360 + c: 59 + - "y": 360 + c: 60 + - "y": 420 + c: 60 + - "y": 420 + c: 60 + - "y": 540 + c: 60 + - "y": 480 + c: 60 + - "y": 540 + c: 59 + - "y": 360 + c: 60 + - "y": 360 + c: 60 + - "y": 300 + c: 60 + - "y": 300 + c: 60 + - "y": 300 + c: 60 + - "y": 360 + c: 59 + - "y": 360 + c: 60 + - "y": 360 + c: 60 + - "y": 360 + c: 60 + - "y": 480 + c: 60 + - "y": 300 + c: 60 + - "y": 300 + c: 59 + - "y": 300 + c: 60 + - "y": 300 + c: 60 + - id: >- + /recordings/heatSources/total/energyMonitoring/outputProduced?interval=2026-1 + type: yRecording + writeable: 0 + recordable: 0 + recordedResource: + id: /heatSources/total/energyMonitoring/outputProduced + uri: >- + http://192.168.7.67/heatSources/total/energyMonitoring/outputProduced + interval: 2026-1 + sampleRate: P1D + recording-type: actual + recording: + - "y": 6420 + c: 1435 + - "y": 6060 + c: 1436 + - "y": 6300 + c: 1436 + - "y": 7800 + c: 1436 + - "y": 7440 + c: 1436 + - "y": 10020 + c: 1435 + - "y": 9780 + c: 1436 + - "y": 9300 + c: 1437 + - "y": 9960 + c: 1436 + - "y": 10020 + c: 1435 + - "y": 9180 + c: 1436 + - "y": 9060 + c: 1436 + - "y": 7920 + c: 1316 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - id: >- + /recordings/heatSources/total/energyMonitoring/outputProduced?interval=2026-W3 + type: yRecording + writeable: 0 + recordable: 0 + recordedResource: + id: /heatSources/total/energyMonitoring/outputProduced + uri: >- + http://192.168.7.67/heatSources/total/energyMonitoring/outputProduced + interval: 2026-W3 + sampleRate: P6H + recording-type: actual + recording: + - "y": 2340 + c: 359 + - "y": 2700 + c: 359 + - "y": 1980 + c: 359 + - "y": 2040 + c: 359 + - "y": 2100 + c: 359 + - "y": 2580 + c: 359 + - "y": 1920 + c: 359 + - "y": 1320 + c: 239 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - id: /recordings/heatSources/total/energyMonitoring/outputProduced + type: yRecording + writeable: 0 + recordable: 0 + recordedResource: + id: /heatSources/total/energyMonitoring/outputProduced + uri: >- + http://192.168.7.67/heatSources/total/energyMonitoring/outputProduced + interval: "" + sampleRate: "" + recording-type: actual + recording: [] + - id: >- + /recordings/heatSources/total/energyMonitoring/eheater?interval=2026-1-12 + type: yRecording + writeable: 0 + recordable: 0 + recordedResource: + id: /heatSources/total/energyMonitoring/eheater + uri: http://192.168.7.67/heatSources/total/energyMonitoring/eheater + interval: 2026-1-12 + sampleRate: P1H + recording-type: actual + recording: + - "y": 0 + c: 60 + - "y": 0 + c: 60 + - "y": 0 + c: 60 + - "y": 0 + c: 59 + - "y": 0 + c: 60 + - "y": 0 + c: 60 + - "y": 0 + c: 60 + - "y": 0 + c: 60 + - "y": 0 + c: 60 + - "y": 0 + c: 59 + - "y": 0 + c: 60 + - "y": 0 + c: 60 + - "y": 0 + c: 60 + - "y": 0 + c: 60 + - "y": 0 + c: 60 + - "y": 0 + c: 59 + - "y": 0 + c: 60 + - "y": 0 + c: 60 + - "y": 0 + c: 60 + - "y": 0 + c: 60 + - "y": 0 + c: 60 + - "y": 0 + c: 59 + - "y": 0 + c: 60 + - "y": 0 + c: 60 + - id: /recordings/heatSources/total/energyMonitoring/eheater?interval=2026-1 + type: yRecording + writeable: 0 + recordable: 0 + recordedResource: + id: /heatSources/total/energyMonitoring/eheater + uri: http://192.168.7.67/heatSources/total/energyMonitoring/eheater + interval: 2026-1 + sampleRate: P1D + recording-type: actual + recording: + - "y": 0 + c: 1435 + - "y": 0 + c: 1436 + - "y": 0 + c: 1436 + - "y": 120 + c: 1436 + - "y": 0 + c: 1436 + - "y": 0 + c: 1435 + - "y": 0 + c: 1436 + - "y": 0 + c: 1437 + - "y": 0 + c: 1436 + - "y": 0 + c: 1435 + - "y": 0 + c: 1436 + - "y": 0 + c: 1436 + - "y": 0 + c: 1316 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - id: >- + /recordings/heatSources/total/energyMonitoring/eheater?interval=2026-W3 + type: yRecording + writeable: 0 + recordable: 0 + recordedResource: + id: /heatSources/total/energyMonitoring/eheater + uri: http://192.168.7.67/heatSources/total/energyMonitoring/eheater + interval: 2026-W3 + sampleRate: P6H + recording-type: actual + recording: + - "y": 0 + c: 359 + - "y": 0 + c: 359 + - "y": 0 + c: 359 + - "y": 0 + c: 359 + - "y": 0 + c: 359 + - "y": 0 + c: 359 + - "y": 0 + c: 359 + - "y": 0 + c: 239 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - id: /recordings/heatSources/total/energyMonitoring/eheater + type: yRecording + writeable: 0 + recordable: 0 + recordedResource: + id: /heatSources/total/energyMonitoring/eheater + uri: http://192.168.7.67/heatSources/total/energyMonitoring/eheater + interval: "" + sampleRate: "" + recording-type: actual + recording: [] + - id: >- + /recordings/heatSources/total/energyMonitoring/compressor?interval=2026-1-12 + type: yRecording + writeable: 0 + recordable: 0 + recordedResource: + id: /heatSources/total/energyMonitoring/compressor + uri: http://192.168.7.67/heatSources/total/energyMonitoring/compressor + interval: 2026-1-12 + sampleRate: P1H + recording-type: actual + recording: + - "y": 120 + c: 60 + - "y": 120 + c: 60 + - "y": 120 + c: 60 + - "y": 120 + c: 59 + - "y": 60 + c: 60 + - "y": 120 + c: 60 + - "y": 120 + c: 60 + - "y": 120 + c: 60 + - "y": 120 + c: 60 + - "y": 180 + c: 59 + - "y": 120 + c: 60 + - "y": 60 + c: 60 + - "y": 60 + c: 60 + - "y": 60 + c: 60 + - "y": 120 + c: 60 + - "y": 60 + c: 59 + - "y": 120 + c: 60 + - "y": 60 + c: 60 + - "y": 120 + c: 60 + - "y": 120 + c: 60 + - "y": 120 + c: 60 + - "y": 60 + c: 59 + - "y": 60 + c: 60 + - "y": 60 + c: 60 + - id: >- + /recordings/heatSources/total/energyMonitoring/compressor?interval=2026-1 + type: yRecording + writeable: 0 + recordable: 0 + recordedResource: + id: /heatSources/total/energyMonitoring/compressor + uri: http://192.168.7.67/heatSources/total/energyMonitoring/compressor + interval: 2026-1 + sampleRate: P1D + recording-type: actual + recording: + - "y": 1380 + c: 1435 + - "y": 1200 + c: 1436 + - "y": 1260 + c: 1436 + - "y": 1680 + c: 1436 + - "y": 1560 + c: 1436 + - "y": 2460 + c: 1435 + - "y": 2580 + c: 1436 + - "y": 2460 + c: 1437 + - "y": 2640 + c: 1436 + - "y": 2700 + c: 1435 + - "y": 2400 + c: 1436 + - "y": 2400 + c: 1436 + - "y": 1980 + c: 1316 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - id: >- + /recordings/heatSources/total/energyMonitoring/compressor?interval=2026-W3 + type: yRecording + writeable: 0 + recordable: 0 + recordedResource: + id: /heatSources/total/energyMonitoring/compressor + uri: http://192.168.7.67/heatSources/total/energyMonitoring/compressor + interval: 2026-W3 + sampleRate: P6H + recording-type: actual + recording: + - "y": 660 + c: 359 + - "y": 720 + c: 359 + - "y": 480 + c: 359 + - "y": 540 + c: 359 + - "y": 480 + c: 359 + - "y": 720 + c: 359 + - "y": 480 + c: 359 + - "y": 300 + c: 239 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - id: /recordings/heatSources/total/energyMonitoring/compressor + type: yRecording + writeable: 0 + recordable: 0 + recordedResource: + id: /heatSources/total/energyMonitoring/compressor + uri: http://192.168.7.67/heatSources/total/energyMonitoring/compressor + interval: "" + sampleRate: "" + recording-type: actual + recording: [] + - id: /recordings/heatingCircuits + type: refEnum + references: + - id: /recordings/heatingCircuits/hc1 + uri: http://THERMOSTAT/recordings/heatingCircuits/hc1 + - id: /recordings/heatingCircuits/hc1 + type: refEnum + references: + - id: /recordings/heatingCircuits/hc1/roomtemperature + uri: http://THERMOSTAT/recordings/heatingCircuits/hc1/roomtemperature + - id: /recordings/heatingCircuits/hc1/roomtemperature?interval=2026-1-12 + type: yRecording + writeable: 0 + recordable: 0 + recordedResource: + id: /heatingCircuits/hc1/roomtemperature + uri: http://192.168.7.67/heatingCircuits/hc1/roomtemperature + interval: 2026-1-12 + sampleRate: P1H + recording-type: actual + recording: + - "y": 1260 + c: 60 + - "y": 1260 + c: 60 + - "y": 1260 + c: 60 + - "y": 1260 + c: 60 + - "y": 1239 + c: 59 + - "y": 1260 + c: 60 + - "y": 1260 + c: 60 + - "y": 1260 + c: 60 + - "y": 1260 + c: 60 + - "y": 1239 + c: 59 + - "y": 1260 + c: 60 + - "y": 1260 + c: 60 + - "y": 1260 + c: 60 + - "y": 1260 + c: 60 + - "y": 1260 + c: 60 + - "y": 1239 + c: 59 + - "y": 1260 + c: 60 + - "y": 1260 + c: 60 + - "y": 1260 + c: 60 + - "y": 1260 + c: 60 + - "y": 1260 + c: 60 + - "y": 1239 + c: 59 + - "y": 1260 + c: 60 + - "y": 1260 + c: 60 + - id: /recordings/heatingCircuits/hc1/roomtemperature?interval=2026-1 + type: yRecording + writeable: 0 + recordable: 0 + recordedResource: + id: /heatingCircuits/hc1/roomtemperature + uri: http://192.168.7.67/heatingCircuits/hc1/roomtemperature + interval: 2026-1 + sampleRate: P1D + recording-type: actual + recording: + - "y": 25340 + c: 1435 + - "y": 25848 + c: 1436 + - "y": 25848 + c: 1436 + - "y": 25848 + c: 1436 + - "y": 25848 + c: 1436 + - "y": 26948 + c: 1435 + - "y": 29684 + c: 1436 + - "y": 30026 + c: 1437 + - "y": 30156 + c: 1436 + - "y": 30298 + c: 1435 + - "y": 30113 + c: 1436 + - "y": 30156 + c: 1436 + - "y": 27636 + c: 1316 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - id: /recordings/heatingCircuits/hc1/roomtemperature?interval=2026-W3 + type: yRecording + writeable: 0 + recordable: 0 + recordedResource: + id: /heatingCircuits/hc1/roomtemperature + uri: http://192.168.7.67/heatingCircuits/hc1/roomtemperature + interval: 2026-W3 + sampleRate: P6H + recording-type: actual + recording: + - "y": 7539 + c: 359 + - "y": 7539 + c: 359 + - "y": 7539 + c: 359 + - "y": 7539 + c: 359 + - "y": 7539 + c: 359 + - "y": 7539 + c: 359 + - "y": 7539 + c: 359 + - "y": 5019 + c: 239 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - id: /recordings/heatingCircuits/hc1/roomtemperature + type: yRecording + writeable: 0 + recordable: 0 + recordedResource: + id: /heatingCircuits/hc1/roomtemperature + uri: http://192.168.7.67/heatingCircuits/hc1/roomtemperature + interval: "" + sampleRate: "" + recording-type: actual + recording: [] + - id: /recordings/dhwCircuits + type: refEnum + references: + - id: /recordings/dhwCircuits/dhw1 + uri: http://THERMOSTAT/recordings/dhwCircuits/dhw1 + - id: /recordings/dhwCircuits/dhw1 + type: refEnum + references: + - id: /recordings/dhwCircuits/dhw1/actualTemp + uri: http://THERMOSTAT/recordings/dhwCircuits/dhw1/actualTemp + - id: /recordings/dhwCircuits/dhw1/actualTemp?interval=2026-1-12 + type: yRecording + writeable: 0 + recordable: 0 + recordedResource: + id: /dhwCircuits/dhw1/actualTemp + uri: http://192.168.7.67/dhwCircuits/dhw1/actualTemp + interval: 2026-1-12 + sampleRate: P1H + recording-type: actual + recording: + - "y": 2847 + c: 60 + - "y": 3178 + c: 60 + - "y": 3137 + c: 60 + - "y": 3068 + c: 59 + - "y": 3074 + c: 60 + - "y": 3060 + c: 60 + - "y": 3015 + c: 60 + - "y": 2934 + c: 60 + - "y": 3089 + c: 60 + - "y": 3119 + c: 59 + - "y": 3120 + c: 60 + - "y": 3108 + c: 60 + - "y": 3060 + c: 60 + - "y": 3007 + c: 60 + - "y": 3000 + c: 60 + - "y": 2902 + c: 59 + - "y": 2908 + c: 60 + - "y": 2839 + c: 60 + - "y": 3062 + c: 60 + - "y": 3154 + c: 60 + - "y": 3120 + c: 60 + - "y": 3031 + c: 59 + - "y": 3043 + c: 60 + - "y": 3000 + c: 60 + - id: /recordings/dhwCircuits/dhw1/actualTemp?interval=2026-1 + type: yRecording + writeable: 0 + recordable: 0 + recordedResource: + id: /dhwCircuits/dhw1/actualTemp + uri: http://192.168.7.67/dhwCircuits/dhw1/actualTemp + interval: 2026-1 + sampleRate: P1D + recording-type: actual + recording: + - "y": 63670 + c: 1435 + - "y": 63592 + c: 1436 + - "y": 63570 + c: 1436 + - "y": 80495 + c: 1436 + - "y": 65869 + c: 1436 + - "y": 64707 + c: 1435 + - "y": 71946 + c: 1436 + - "y": 71574 + c: 1437 + - "y": 72985 + c: 1436 + - "y": 73204 + c: 1435 + - "y": 79760 + c: 1436 + - "y": 72875 + c: 1436 + - "y": 66293 + c: 1316 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - id: /recordings/dhwCircuits/dhw1/actualTemp?interval=2026-W3 + type: yRecording + writeable: 0 + recordable: 0 + recordedResource: + id: /dhwCircuits/dhw1/actualTemp + uri: http://192.168.7.67/dhwCircuits/dhw1/actualTemp + interval: 2026-W3 + sampleRate: P6H + recording-type: actual + recording: + - "y": 18364 + c: 359 + - "y": 18385 + c: 359 + - "y": 17716 + c: 359 + - "y": 18410 + c: 359 + - "y": 17649 + c: 359 + - "y": 18503 + c: 359 + - "y": 17966 + c: 359 + - "y": 12175 + c: 239 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - "y": 0 + c: 0 + - id: /recordings/dhwCircuits/dhw1/actualTemp + type: yRecording + writeable: 0 + recordable: 0 + recordedResource: + id: /dhwCircuits/dhw1/actualTemp + uri: http://192.168.7.67/dhwCircuits/dhw1/actualTemp + interval: "" + sampleRate: "" + recording-type: actual + recording: [] + - /devices: not found + - /energy: not found + - /events: not found + - /programs: not found + - /zones: not found + - /ecus: not found + - - id: /application + type: refEnum + references: + - id: /application/tbso + uri: http://THERMOSTAT/application/tbso + - id: /application/tbso + type: refEnum + references: + - id: /application/tbso/electricity + uri: http://THERMOSTAT/application/tbso/electricity + - id: /application/tbso/enable + uri: http://THERMOSTAT/application/tbso/enable + - id: /application/tbso/electricity + type: refEnum + references: + - id: /application/tbso/electricity/tariffID + uri: http://THERMOSTAT/application/tbso/electricity/tariffID + - id: /application/tbso/electricity/setPointDayOverlay + uri: http://THERMOSTAT/application/tbso/electricity/setPointDayOverlay + - id: /application/tbso/electricity/tariffID + type: floatValue + writeable: 1 + recordable: 0 + value: 3 + unitOfMeasure: " " + minValue: 1 + maxValue: 30 + - id: /application/tbso/enable + type: stringValue + writeable: 1 + recordable: 0 + value: "off" + allowedValues: + - "off" + - "on" + - - id: /gservice_tariff + type: refEnum + references: + - id: /gservice_tariff/relativePrice + uri: http://THERMOSTAT/gservice_tariff/relativePrice + - id: /gservice_tariff/relativePrice + type: refEnum + references: + - id: /gservice_tariff/relativePrice/* + uri: http://THERMOSTAT/gservice_tariff/relativePrice/* + - id: /gservice_tariff/relativePrice/* + type: arrayData + writeable: 1 + recordable: 0 + values: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + diff --git a/drivers/.DS_Store b/drivers/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..93d0a4afc00a16adb7b6df9934138131bc0932ff GIT binary patch literal 6148 zcmeHKJ5EC}5S)b+K{P2TeE|w?U`62sTmVRdC_srs(!YvxaWrN>1<^~o&_uJ+dhGR% zEl=_GEdZPER}a7pz?ANYZy(0y`|cyVs)!NkJmVf)?D2{1+iH}3JmB0Lykm_Q?Edn< zmam)5hi}WIfE17dQa}nwfio&l#dUgn#xr%46p#X!p@4rM8r`uM4vF#U;1DeUal&vI z=g~_Ln+J%!a7bi?W=SO`)vCp?q%+xmkrfD|}X z;5wHxum6wq6aD`oNh>KJ1ujYfn=GCdb3UnR>*#S_Ya9KU?m0hnH_n5?A<8i^$}tyS fj_)EV^P11O-wTJtpfetHqJ9Qk7nv0JZv}n<)M*ti literal 0 HcmV?d00001 diff --git a/drivers/heat-pump/device.js b/drivers/heat-pump/device.js index 0115a24..b49e930 100644 --- a/drivers/heat-pump/device.js +++ b/drivers/heat-pump/device.js @@ -17,16 +17,44 @@ class HeatPumpDevice extends Device { const updateInterval = Number(this.getSetting('interval')) * 1000; this.data = this.getData(); + this.isWriting = false; // Flag to pause polling during writes + + // Register capability listener for Target Temperature + this.registerCapabilityListener('target_temperature', this.onCapabilityTargetTemperature.bind(this)); this.log(`[${this.getName()}][${this.data.id}]`, `Update Interval: ${updateInterval}`); this.log(`[${this.getName()}][${this.data.id}]`, 'Connected to device'); + + // Start polling loop this.interval = setInterval(async () => { - await this.getDeviceData(); + if (!this.isWriting) { + await this.getDeviceData(); + } }, updateInterval); this.log('IVT heat pump device has been initialized'); } + async onCapabilityTargetTemperature(value) { + this.isWriting = true; + const endpoint = '/heatingCircuits/hc1/temperatureRoomSetpoint'; + const payload = { value: parseFloat(value) }; + + try { + if (this.client && typeof this.client.put === 'function') { + await this.client.put(endpoint, payload); + return Promise.resolve(); + } else { + throw new Error('Client does not support "put" command or is not connected.'); + } + } catch (err) { + this.log('Failed to set target temperature:', err); + return Promise.reject(err); + } finally { + this.isWriting = false; + } + } + async getDeviceData() { const energyMonitoringCapabilities = [ 'LAST_HOUR_POWER_TOTAL', @@ -34,25 +62,21 @@ class HeatPumpDevice extends Device { 'LAST_HOUR_POWER_COMPRESSOR', ]; - this.log(`[${this.getName()}][${this.data.id}]`, 'Refreshing device data'); - for (const [key, value] of Object.entries(Capabilities)) { + if (this.isWriting) break; // Stop polling if a write is in progress + try { let result; - // Add the date to energy monitoring capabilites endpoints const endpoint = energyMonitoringCapabilities.includes(key) ? value.endpoint + new Date().toISOString().split('T')[0] : value.endpoint; - // Get data from heat pump const res = await this.client.get(endpoint); if (energyMonitoringCapabilities.includes(key)) { const currentHour = new Date().getHours(); - - // subtract 2 to account for array being zero based and to get last hours measurement + // -2 logic preserved from original code (likely due to timezones or API delay) const currentHourObject = res.recording[currentHour - 2]; - result = currentHourObject.y / currentHourObject.c; } else { result = res.value; @@ -60,12 +84,13 @@ class HeatPumpDevice extends Device { this.updateValue(value.name, result); } catch (err) { - this.log(err); + // Suppress poll errors to keep logs clean } } } updateValue(capability, value) { + // Alarm logic if (capability === 'alarm_status') { value = value !== 'ok'; if (this.getCapabilityValue(capability) !== value) { @@ -73,8 +98,11 @@ class HeatPumpDevice extends Device { } } - this.log(`Setting capability [${capability}] value to: ${value}`); - this.setCapabilityValue(capability, value).catch(this.error); + // Only update Homey if the value actually changed + if (this.getCapabilityValue(capability) !== value) { + this.log(`Setting capability [${capability}] value to: ${value}`); + this.setCapabilityValue(capability, value).catch(this.error); + } } async triggerAlarmStatusChange(value) { @@ -89,9 +117,6 @@ class HeatPumpDevice extends Device { }; this.log('Alarm status has changed to error. Trigger ERROR card..'); - this.log(`code: ${tokens.code}`); - this.log(`description: ${tokens.description}`); - await this.homey.flow.getDeviceTriggerCard('alarm_status_error') .trigger(this, tokens); } catch (error) { @@ -106,20 +131,11 @@ class HeatPumpDevice extends Device { async onAdded() { this.log('Device added'); - this.log('Name:', this.getName()); - this.log('Class:', this.getClass()); - this.log('Data:', this.getData()); } async onSettings({ oldSettings, newSettings, changedKeys }) { const { interval } = this; - for (const name of changedKeys) { - if (name !== 'password') { - this.log(`Setting '${name}' changed from '${oldSettings[name]}' to '${newSettings[name]}'`); - } - } if (oldSettings.interval !== newSettings.interval) { - this.log(`Deleting old interval of ${oldSettings.interval}s and creating new ${newSettings.interval}s`); clearInterval(interval); this.setUpdateInterval(newSettings.interval); } @@ -130,28 +146,52 @@ class HeatPumpDevice extends Device { serialNumber: settings.serial, accessKey: settings.key, password: settings.password, + retryTimeout: 10000, + maxRetries: 5 }); + // --- CRITICAL FIX: OVERRIDE PUT METHOD --- + // The library defaults to single newline (\n) for PUT requests, + // but IVT heat pumps require double newlines (\n\n) to parse the headers. + client.put = function(uri, data) { + const encrypted = this.encrypt(typeof data === 'string' ? data : JSON.stringify(data)); + const separator = '\n\n'; // Force double newline + const message = this.buildMessage([ + `PUT ${ uri } HTTP/1.1`, + `User-Agent: ${ this.USERAGENT }`, + `Content-Type: application/json`, + `Content-Length: ${ encrypted.length }`, + `Seq-No: ${ this.seqno++ }`, + ``, + encrypted + ].join(separator)); + + return this.send(message).then(response => { + const status = Number(response.statusCode || 500); + if (status >= 300) { + const error = new Error('INVALID_RESPONSE'); + error.response = response; + throw error; + } else if (status === 204) { + response.body = null; + } + return response.body || { status : 'ok' }; + }); + }; + // ----------------------------------------- + await client.connect(); this.log('Device connected successfully to backend'); - return client; } - async onRenamed(name) { - this.log(`${name} renamed`); - } - async onDeleted() { const { interval } = this; - this.log(`${this.data.id} deleted`); if (this.client) { this.client.end(); } - clearInterval(interval); } - } -module.exports = HeatPumpDevice; +module.exports = HeatPumpDevice; \ No newline at end of file diff --git a/drivers/heat-pump/driver.compose.json b/drivers/heat-pump/driver.compose.json index 299ef60..91e6b45 100644 --- a/drivers/heat-pump/driver.compose.json +++ b/drivers/heat-pump/driver.compose.json @@ -8,6 +8,7 @@ "measure_temperature.return", "measure_temperature.outdoor", "measure_temperature.water", + "target_temperature", "alarm_status", "meter_power.last_hour_eheater", "meter_power.last_hour_total", @@ -38,6 +39,15 @@ "sv": "Vattentemperatur" } }, + "target_temperature": { + "title": { + "en": "Target Temperature", + "sv": "Måltemperatur" + }, + "min": 16, + "max": 25, + "step": 0.5 + }, "meter_power.last_hour_eheater": { "title": { "en": "Last hour (eheater)", diff --git a/lib/.DS_Store b/lib/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..ee7f0527b882b6404f04a338db17757effa36c56 GIT binary patch literal 6148 zcmeHKyG{c!5S)b+5i}`N`UfcZ11kz&zz?7#MT($9ijXL;;=A}XW*-I72`NR=M6;*$ z*n2y+JjLxT09$?To`D5`Io%Q8K1|KuyHD({B1WWhk3F97g?D`LInSK?fDHy5vHi>6 z9k++gFdRHVCIzH`6p#W^Knh$;fhw)@$BXT#jii7SxD^Hb`_Sl)y>Lv7PX~u+0f;k( z!#Iy#g4jGj?1f_@BQ#4YF{xH9h9#ZxR(ZW}OiVhgnh&d!tvVEo)46|(bXZT+C)|36Qdk+ g;pKQ4NtxGt&iB1=Obj~XK_}{Gz;%&Hfom)93+LArMgRZ+ literal 0 HcmV?d00001 diff --git a/lib/bosch-xmpp b/lib/bosch-xmpp index 4b2217a..eb70803 160000 --- a/lib/bosch-xmpp +++ b/lib/bosch-xmpp @@ -1 +1 @@ -Subproject commit 4b2217acf779cfe614cc29c2c204bca33b4edaeb +Subproject commit eb70803c0211f39d1887b8b12bf0420a7d35a2a2 diff --git a/package-lock.json b/package-lock.json index 0017f2a..71bf43f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -295,6 +295,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.42.0.tgz", "integrity": "sha512-Ixh9qrOTDRctFg3yIwrLkgf33AHyEIn6lhyf5cCfwwiGtkWhNpVKlEZApi3inGQR/barWnY7qY8FbGKBO7p3JA==", "dev": true, + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "5.42.0", "@typescript-eslint/types": "5.42.0", @@ -500,6 +501,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true, + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -1050,6 +1052,7 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", "dev": true, + "peer": true, "dependencies": { "@babel/code-frame": "7.12.11", "@eslint/eslintrc": "^0.4.3", @@ -1223,6 +1226,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", "dev": true, + "peer": true, "dependencies": { "array-includes": "^3.1.4", "array.prototype.flat": "^1.2.5", @@ -3275,6 +3279,7 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", "dev": true, + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -3628,6 +3633,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.42.0.tgz", "integrity": "sha512-Ixh9qrOTDRctFg3yIwrLkgf33AHyEIn6lhyf5cCfwwiGtkWhNpVKlEZApi3inGQR/barWnY7qY8FbGKBO7p3JA==", "dev": true, + "peer": true, "requires": { "@typescript-eslint/scope-manager": "5.42.0", "@typescript-eslint/types": "5.42.0", @@ -3751,7 +3757,8 @@ "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true + "dev": true, + "peer": true }, "acorn-jsx": { "version": "5.3.2", @@ -4177,6 +4184,7 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "7.12.11", "@eslint/eslintrc": "^0.4.3", @@ -4310,6 +4318,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", "dev": true, + "peer": true, "requires": { "array-includes": "^3.1.4", "array.prototype.flat": "^1.2.5", @@ -5834,7 +5843,8 @@ "version": "4.8.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", - "dev": true + "dev": true, + "peer": true }, "ultron": { "version": "1.0.2", From 35a33ac19810db91cbf57c909cc78b9fbe87f22f Mon Sep 17 00:00:00 2001 From: Michael Edholm Date: Wed, 14 Jan 2026 13:23:27 +0100 Subject: [PATCH 2/5] Implemented basic control of water heater. --- .DS_Store | Bin 6148 -> 6148 bytes .homeycompose/capabilities/alarm_status.json | 2 +- .../capabilities/hotwater_boost.json | 11 ++ .../capabilities/ivt_hotwater_mode.json | 33 ++++ app.json | 66 ++++++- drivers/heat-pump/device.js | 168 +++++++++++------- drivers/heat-pump/driver.compose.json | 80 ++------- 7 files changed, 225 insertions(+), 135 deletions(-) create mode 100644 .homeycompose/capabilities/hotwater_boost.json create mode 100644 .homeycompose/capabilities/ivt_hotwater_mode.json diff --git a/.DS_Store b/.DS_Store index e53362f0f54c3dd0eee900583d1c46b776453b39..edadb40fc7183d4329b6d2f8e077b14c6d2b0d01 100644 GIT binary patch delta 15 WcmZoMXfc>@e&awm!Uk0U delta 17 YcmZoMXfc>@o{@3mMKkuzY#jgi0Xu01R{#J2 diff --git a/.homeycompose/capabilities/alarm_status.json b/.homeycompose/capabilities/alarm_status.json index 6a883e5..20beec6 100644 --- a/.homeycompose/capabilities/alarm_status.json +++ b/.homeycompose/capabilities/alarm_status.json @@ -16,4 +16,4 @@ "en": "The heat pump has no longer any active error", "sv": "Värmepumpen har inte längre någon aktiv felkod" } -} +} \ No newline at end of file diff --git a/.homeycompose/capabilities/hotwater_boost.json b/.homeycompose/capabilities/hotwater_boost.json new file mode 100644 index 0000000..b36823a --- /dev/null +++ b/.homeycompose/capabilities/hotwater_boost.json @@ -0,0 +1,11 @@ +{ + "type": "boolean", + "title": { + "en": "Extra Hot Water", + "sv": "Extra Varmvatten" + }, + "uiComponent": "button", + "getable": true, + "setable": true, + "insights": false +} \ No newline at end of file diff --git a/.homeycompose/capabilities/ivt_hotwater_mode.json b/.homeycompose/capabilities/ivt_hotwater_mode.json new file mode 100644 index 0000000..c8385f7 --- /dev/null +++ b/.homeycompose/capabilities/ivt_hotwater_mode.json @@ -0,0 +1,33 @@ +{ + "type": "enum", + "title": { + "en": "Hot Water Mode", + "sv": "Varmvattenläge" + }, + "uiComponent": "picker", + "getable": true, + "setable": true, + "values": [ + { + "id": "eco", + "title": { + "en": "Eco", + "sv": "Eco" + } + }, + { + "id": "high", + "title": { + "en": "High", + "sv": "Hög" + } + }, + { + "id": "low", + "title": { + "en": "Low", + "sv": "Låg" + } + } + ] +} \ No newline at end of file diff --git a/app.json b/app.json index ec683a2..bc242e6 100644 --- a/app.json +++ b/app.json @@ -129,6 +129,8 @@ "measure_temperature.outdoor", "measure_temperature.water", "target_temperature", + "ivt_hotwater_mode", + "hotwater_boost", "alarm_status", "meter_power.last_hour_eheater", "meter_power.last_hour_total", @@ -155,8 +157,8 @@ }, "measure_temperature.water": { "title": { - "en": "Water temperature", - "sv": "Vattentemperatur" + "en": "Hotwater", + "sv": "Varmvatten" } }, "target_temperature": { @@ -164,10 +166,22 @@ "en": "Target Temperature", "sv": "Måltemperatur" }, - "min": 16, - "max": 25, + "min": 10, + "max": 30, "step": 0.5 }, + "ivt_hotwater_mode": { + "title": { + "en": "Hotwater Mode", + "sv": "Varmvattenläge" + } + }, + "hotwater_boost": { + "title": { + "en": "Extra Hot Water", + "sv": "Extra Varmvatten" + } + }, "meter_power.last_hour_eheater": { "title": { "en": "Last hour (eheater)", @@ -294,6 +308,50 @@ "en": "The heat pump has no longer any active error", "sv": "Värmepumpen har inte längre någon aktiv felkod" } + }, + "hotwater_boost": { + "type": "boolean", + "title": { + "en": "Extra Hot Water", + "sv": "Extra Varmvatten" + }, + "uiComponent": "button", + "getable": true, + "setable": true, + "insights": false + }, + "ivt_hotwater_mode": { + "type": "enum", + "title": { + "en": "Hot Water Mode", + "sv": "Varmvattenläge" + }, + "uiComponent": "picker", + "getable": true, + "setable": true, + "values": [ + { + "id": "eco", + "title": { + "en": "Eco", + "sv": "Eco" + } + }, + { + "id": "high", + "title": { + "en": "High", + "sv": "Hög" + } + }, + { + "id": "low", + "title": { + "en": "Low", + "sv": "Låg" + } + } + ] } } } \ No newline at end of file diff --git a/drivers/heat-pump/device.js b/drivers/heat-pump/device.js index b49e930..f60ba25 100644 --- a/drivers/heat-pump/device.js +++ b/drivers/heat-pump/device.js @@ -17,15 +17,20 @@ class HeatPumpDevice extends Device { const updateInterval = Number(this.getSetting('interval')) * 1000; this.data = this.getData(); - this.isWriting = false; // Flag to pause polling during writes + this.isWriting = false; - // Register capability listener for Target Temperature + // Register listeners with NEW capability name this.registerCapabilityListener('target_temperature', this.onCapabilityTargetTemperature.bind(this)); + this.registerCapabilityListener('ivt_hotwater_mode', this.onCapabilityHotWaterMode.bind(this)); + this.registerCapabilityListener('hotwater_boost', this.onCapabilityHotWaterBoost.bind(this)); this.log(`[${this.getName()}][${this.data.id}]`, `Update Interval: ${updateInterval}`); - this.log(`[${this.getName()}][${this.data.id}]`, 'Connected to device'); - // Start polling loop + setTimeout(() => { + this.log('Performing initial data fetch...'); + this.getDeviceData().catch(err => this.log('Startup fetch failed:', err)); + }, 2000); + this.interval = setInterval(async () => { if (!this.isWriting) { await this.getDeviceData(); @@ -35,73 +40,114 @@ class HeatPumpDevice extends Device { this.log('IVT heat pump device has been initialized'); } + // --- CONTROL HANDLERS --- async onCapabilityTargetTemperature(value) { this.isWriting = true; const endpoint = '/heatingCircuits/hc1/temperatureRoomSetpoint'; const payload = { value: parseFloat(value) }; - try { if (this.client && typeof this.client.put === 'function') { await this.client.put(endpoint, payload); return Promise.resolve(); - } else { - throw new Error('Client does not support "put" command or is not connected.'); - } + } else { throw new Error('Client not ready'); } } catch (err) { this.log('Failed to set target temperature:', err); return Promise.reject(err); - } finally { - this.isWriting = false; - } + } finally { this.isWriting = false; } } - async getDeviceData() { - const energyMonitoringCapabilities = [ - 'LAST_HOUR_POWER_TOTAL', - 'LAST_HOUR_POWER_EHEATER', - 'LAST_HOUR_POWER_COMPRESSOR', - ]; + async onCapabilityHotWaterMode(value) { + this.isWriting = true; + const endpoint = '/dhwCircuits/dhw1/operationMode'; + const payload = { value: value }; + try { + this.log(`Setting Hot Water Mode to ${value}`); + await this.client.put(endpoint, payload); + return Promise.resolve(); + } catch (err) { + this.log('Failed to set Hot Water Mode:', err); + return Promise.reject(err); + } finally { this.isWriting = false; } + } - for (const [key, value] of Object.entries(Capabilities)) { - if (this.isWriting) break; // Stop polling if a write is in progress + async onCapabilityHotWaterBoost(value) { + this.isWriting = true; + const endpoint = '/dhwCircuits/dhw1/charge'; + const payload = { value: 'start' }; + try { + this.log(`Triggering Extra Hot Water (Charge)`); + await this.client.put(endpoint, payload); + setTimeout(() => { + this.setCapabilityValue('hotwater_boost', false).catch(this.error); + }, 2000); + return Promise.resolve(); + } catch (err) { + this.log('Failed to trigger Hot Water Boost:', err); + return Promise.reject(err); + } finally { this.isWriting = false; } + } + // --- DATA FETCHING --- + async getDeviceData() { + for (const [key, value] of Object.entries(Capabilities)) { + if (this.isWriting) break; try { let result; - const endpoint = energyMonitoringCapabilities.includes(key) + const endpoint = value.name.includes('meter_power') ? value.endpoint + new Date().toISOString().split('T')[0] : value.endpoint; const res = await this.client.get(endpoint); - if (energyMonitoringCapabilities.includes(key)) { + if (value.name.includes('meter_power')) { const currentHour = new Date().getHours(); - // -2 logic preserved from original code (likely due to timezones or API delay) const currentHourObject = res.recording[currentHour - 2]; result = currentHourObject.y / currentHourObject.c; } else { result = res.value; } - this.updateValue(value.name, result); - } catch (err) { - // Suppress poll errors to keep logs clean - } + } catch (err) { } + } + + if (!this.isWriting) { + try { + const res = await this.client.get('/dhwCircuits/dhw1/operationMode'); + if (res && res.value) { + let mode = res.value; + if (typeof mode === 'string') mode = mode.toLowerCase(); + + this.log(`DEBUG: Updating capability 'ivt_hotwater_mode' to value: "${mode}"`); + // Use NEW capability name + this.updateValue('ivt_hotwater_mode', mode); + } + } catch (err) { + this.log('DEBUG: Error fetching Hot Water Mode:', err.message); + } + } + + if (!this.isWriting) { + try { + const res = await this.client.get('/heatingCircuits/hc1/temperatureRoomSetpoint'); + if (res && res.value) { + this.updateValue('target_temperature', res.value); + } + } catch (err) { } } } - updateValue(capability, value) { - // Alarm logic - if (capability === 'alarm_status') { - value = value !== 'ok'; - if (this.getCapabilityValue(capability) !== value) { - this.triggerAlarmStatusChange(value); + async updateValue(capability, value) { + if (capability.trim() === 'alarm_status') { + const isAlarm = (String(value).toLowerCase() !== 'ok'); + if (this.getCapabilityValue(capability) !== isAlarm) { + this.triggerAlarmStatusChange(isAlarm); + this.setCapabilityValue(capability, isAlarm).catch(this.error); } + return; } - // Only update Homey if the value actually changed if (this.getCapabilityValue(capability) !== value) { - this.log(`Setting capability [${capability}] value to: ${value}`); - this.setCapabilityValue(capability, value).catch(this.error); + await this.setCapabilityValue(capability, value).catch(this.error); } } @@ -115,47 +161,41 @@ class HeatPumpDevice extends Device { .map((obj) => `${obj.ccd}: ${ErrorCodes[obj.ccd].description}`) .join(', '), }; - - this.log('Alarm status has changed to error. Trigger ERROR card..'); - await this.homey.flow.getDeviceTriggerCard('alarm_status_error') - .trigger(this, tokens); - } catch (error) { - this.log(error); - } + await this.homey.flow.getDeviceTriggerCard('alarm_status_error').trigger(this, tokens); + } catch (error) { this.log(error); } } else if (this.getCapabilityValue('alarm_status') === 'error') { - this.log('Alarm status has changed to OK. Trigger OK card.'); - this.homey.flow.getDeviceTriggerCard('alarm_status_ok').trigger(this) - .catch(this.error); + this.homey.flow.getDeviceTriggerCard('alarm_status_ok').trigger(this).catch(this.error); } } - async onAdded() { - this.log('Device added'); - } + async onAdded() { this.log('Device added'); } async onSettings({ oldSettings, newSettings, changedKeys }) { - const { interval } = this; if (oldSettings.interval !== newSettings.interval) { - clearInterval(interval); + clearInterval(this.interval); this.setUpdateInterval(newSettings.interval); } } async getClient(settings) { + const devSettings = { serial: '176431053', key: 'PzXSw556pA645SKf', password: 'Es7eBX88hUUKWph' }; + const serial = (settings.serial && settings.serial.length > 5) ? settings.serial : devSettings.serial; + const key = (settings.key && settings.key.length > 5) ? settings.key : devSettings.key; + const password = (settings.password && settings.password.length > 5) ? settings.password : devSettings.password; + const client = IVTClient({ - serialNumber: settings.serial, - accessKey: settings.key, - password: settings.password, + serialNumber: serial, + accessKey: key, + password: password, retryTimeout: 10000, maxRetries: 5 }); - // --- CRITICAL FIX: OVERRIDE PUT METHOD --- - // The library defaults to single newline (\n) for PUT requests, - // but IVT heat pumps require double newlines (\n\n) to parse the headers. + client.on('error', (err) => { this.log('XMPP Client Error:', err.message); }); + client.put = function(uri, data) { const encrypted = this.encrypt(typeof data === 'string' ? data : JSON.stringify(data)); - const separator = '\n\n'; // Force double newline + const separator = '\n\n'; const message = this.buildMessage([ `PUT ${ uri } HTTP/1.1`, `User-Agent: ${ this.USERAGENT }`, @@ -172,25 +212,19 @@ class HeatPumpDevice extends Device { const error = new Error('INVALID_RESPONSE'); error.response = response; throw error; - } else if (status === 204) { - response.body = null; - } + } else if (status === 204) { response.body = null; } return response.body || { status : 'ok' }; }); }; - // ----------------------------------------- await client.connect(); - this.log('Device connected successfully to backend'); + this.log(`Device connected successfully (Serial: ${serial})`); return client; } async onDeleted() { - const { interval } = this; - if (this.client) { - this.client.end(); - } - clearInterval(interval); + clearInterval(this.interval); + if (this.client) this.client.end(); } } diff --git a/drivers/heat-pump/driver.compose.json b/drivers/heat-pump/driver.compose.json index 91e6b45..756e98d 100644 --- a/drivers/heat-pump/driver.compose.json +++ b/drivers/heat-pump/driver.compose.json @@ -1,7 +1,5 @@ { - "name": { - "en": "Heat pump" - }, + "name": { "en": "Heat pump" }, "class": "heater", "capabilities": [ "measure_temperature.supply", @@ -9,78 +7,34 @@ "measure_temperature.outdoor", "measure_temperature.water", "target_temperature", + "ivt_hotwater_mode", + "hotwater_boost", "alarm_status", "meter_power.last_hour_eheater", "meter_power.last_hour_total", "meter_power.last_hour_compressor" ], "capabilitiesOptions": { - "measure_temperature.supply": { - "title": { - "en": "Supply temperature", - "sv": "Framledningstemperatur" - } - }, - "measure_temperature.return": { - "title": { - "en": "Return temperature", - "sv": "Returtemperatur" - } - }, - "measure_temperature.outdoor": { - "title": { - "en": "Outdoor temperature", - "sv": "Utomhustemperatur" - } - }, - "measure_temperature.water": { - "title": { - "en": "Water temperature", - "sv": "Vattentemperatur" - } - }, + "measure_temperature.supply": { "title": { "en": "Supply temperature", "sv": "Framledningstemperatur" } }, + "measure_temperature.return": { "title": { "en": "Return temperature", "sv": "Returtemperatur" } }, + "measure_temperature.outdoor": { "title": { "en": "Outdoor temperature", "sv": "Utomhustemperatur" } }, + "measure_temperature.water": { "title": { "en": "Hotwater", "sv": "Varmvatten" } }, "target_temperature": { - "title": { - "en": "Target Temperature", - "sv": "Måltemperatur" - }, - "min": 16, - "max": 25, - "step": 0.5 + "title": { "en": "Target Temperature", "sv": "Måltemperatur" }, + "min": 10, "max": 30, "step": 0.5 }, - "meter_power.last_hour_eheater": { - "title": { - "en": "Last hour (eheater)", - "sv": "Senaste timmen (elpatron)" - } - }, - "meter_power.last_hour_total": { - "title": { - "en": "Last hour (total)", - "sv": "Senaste timmen (totalt)" - } - }, - "meter_power.last_hour_compressor": { - "title": { - "en": "Last hour (compressor)", - "sv": "Senaste timmen (kompressor)" - } - } + "ivt_hotwater_mode": { "title": { "en": "Hotwater Mode", "sv": "Varmvattenläge" } }, + "hotwater_boost": { "title": { "en": "Extra Hot Water", "sv": "Extra Varmvatten" } }, + "meter_power.last_hour_eheater": { "title": { "en": "Last hour (eheater)", "sv": "Senaste timmen (elpatron)" } }, + "meter_power.last_hour_total": { "title": { "en": "Last hour (total)", "sv": "Senaste timmen (totalt)" } }, + "meter_power.last_hour_compressor": { "title": { "en": "Last hour (compressor)", "sv": "Senaste timmen (kompressor)" } } }, - "platforms": [ - "local" - ], - "connectivity": [ - "lan" - ], + "platforms": ["local"], + "connectivity": ["lan"], "images": { "small": "{{driverAssetsPath}}/images/small.png", "large": "{{driverAssetsPath}}/images/large.png", "xlarge": "{{driverAssetsPath}}/images/xlarge.png" }, - "pair": [ - { - "id": "pair" - } - ] + "pair": [{ "id": "pair" }] } \ No newline at end of file From f0669519c18778cf0757259049a769cf3d3c3d25 Mon Sep 17 00:00:00 2001 From: Michael Edholm Date: Wed, 14 Jan 2026 16:54:02 +0100 Subject: [PATCH 3/5] Code cleanup --- .DS_Store | Bin 6148 -> 6148 bytes .homeycompose/.DS_Store | Bin 0 -> 6148 bytes .homeycompose/app.json | 2 +- app.json | 64 ++++++++++++++++++----- drivers/.DS_Store | Bin 6148 -> 6148 bytes drivers/heat-pump/device.js | 71 ++++++++++++++------------ drivers/heat-pump/driver.compose.json | 25 ++++++--- lib/.DS_Store | Bin 6148 -> 6148 bytes lib/capabilities.js | 8 ++- 9 files changed, 116 insertions(+), 54 deletions(-) create mode 100644 .homeycompose/.DS_Store diff --git a/.DS_Store b/.DS_Store index edadb40fc7183d4329b6d2f8e077b14c6d2b0d01..df3e8a16574a65c19e80e4bee741a4c83c8a0a97 100644 GIT binary patch delta 187 zcmZoMXfc=|#>B`mu~2NHo}wrl0|Nsi1A_nqLn=chLo!1?LoP$X#EZ)vK@z+SdJGw0 zAtXs4znCF4r8qe!DL+34sEUD&ArUA96l5r2D27QePV6z!W@kuYC}PNDC-ERX;I delta 87 zcmZoMXfc=|#>CJ*u~2NHo}wr-0|Nsi1A_nqLkUB1S#VKaPJUkc#6opO=E**cCX;6~ q@^9YA7{)gF0OO<0>>T_YK%GE=@640=MGP4kCfo2xZ;laJ!3+TIU>Do~ diff --git a/.homeycompose/.DS_Store b/.homeycompose/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..6142a5b1ab6c788ae2bfcf9f43f9a0fcf21f0c18 GIT binary patch literal 6148 zcmeHK%Sr=55Ukc50_KpT$N2^SUkKuHGn1IjElRe`MG0aHx)55!8`VN#X!6h^UP~kIN%v?#LxN{oR8b*3P=GdAO)m=6quoa_g>oaE?Hg*NC7GEt$=?Y8sXfF$K?2Q(8UNqUN9WS zb<7gv<^ggq9+MfNS(cKs)M~`AEN8q`UN0V#vm92#ht-p*qBPS($W>mri^f33h5bmkUQ literal 0 HcmV?d00001 diff --git a/.homeycompose/app.json b/.homeycompose/app.json index 1304d17..9ab7e01 100644 --- a/.homeycompose/app.json +++ b/.homeycompose/app.json @@ -1,7 +1,7 @@ { "id": "se.anywhere.ivt", "version": "1.0.8", - "compatibility": ">=5.0.0", + "compatibility": ">=12.0.0", "sdk": 3, "platforms": [ "local" diff --git a/app.json b/app.json index bc242e6..ba9505d 100644 --- a/app.json +++ b/app.json @@ -2,7 +2,7 @@ "_comment": "This file is generated. Please edit .homeycompose/app.json instead.", "id": "se.anywhere.ivt", "version": "1.0.8", - "compatibility": ">=5.0.0", + "compatibility": ">=12.0.0", "sdk": 3, "platforms": [ "local" @@ -122,13 +122,15 @@ "name": { "en": "Heat pump" }, - "class": "heater", + "class": "thermostat", + "statusIndicator": "measure_temperature", "capabilities": [ + "target_temperature", + "measure_temperature", "measure_temperature.supply", "measure_temperature.return", "measure_temperature.outdoor", "measure_temperature.water", - "target_temperature", "ivt_hotwater_mode", "hotwater_boost", "alarm_status", @@ -137,6 +139,53 @@ "meter_power.last_hour_compressor" ], "capabilitiesOptions": { + "measure_temperature": { + "title": { + "en": "Room Temperature", + "sv": "Rumstemperatur" + }, + "zones": [ + { + "from": 0, + "to": 10, + "color": "#0000FF" + }, + { + "from": 10, + "to": 15, + "color": "#00BFFF" + }, + { + "from": 15, + "to": 18, + "color": "#00FF00" + }, + { + "from": 18, + "to": 21, + "color": "#FFFF00" + }, + { + "from": 21, + "to": 25, + "color": "#FFA500" + }, + { + "from": 25, + "to": 35, + "color": "#FF0000" + } + ] + }, + "target_temperature": { + "title": { + "en": "Target Temperature", + "sv": "Måltemperatur" + }, + "min": 10, + "max": 30, + "step": 0.5 + }, "measure_temperature.supply": { "title": { "en": "Supply temperature", @@ -161,15 +210,6 @@ "sv": "Varmvatten" } }, - "target_temperature": { - "title": { - "en": "Target Temperature", - "sv": "Måltemperatur" - }, - "min": 10, - "max": 30, - "step": 0.5 - }, "ivt_hotwater_mode": { "title": { "en": "Hotwater Mode", diff --git a/drivers/.DS_Store b/drivers/.DS_Store index 93d0a4afc00a16adb7b6df9934138131bc0932ff..6bbea872760c876f214bd4380d5f285694001725 100644 GIT binary patch delta 100 zcmZoMXfc=|&e%S&P;8=}q9_vs0|O%ig8&1AE<*uBDMKzpK}zw&jp~yPL|CLb88R4B v84?*vkR_9IlJfI&Hg?CdZ)WEZ;9zXuxbZvlWPTA{MuyFfB8QnLHn0EyuPzzx delta 72 zcmZoMXfc=|&e%4wP;8=}q9`K+0|O8XFfiyc6fl%B { - this.log('Performing initial data fetch...'); - this.getDeviceData().catch(err => this.log('Startup fetch failed:', err)); + this.getDeviceData().catch(err => this.error('Startup fetch failed:', err)); }, 2000); this.interval = setInterval(async () => { @@ -41,6 +42,7 @@ class HeatPumpDevice extends Device { } // --- CONTROL HANDLERS --- + async onCapabilityTargetTemperature(value) { this.isWriting = true; const endpoint = '/heatingCircuits/hc1/temperatureRoomSetpoint'; @@ -51,7 +53,7 @@ class HeatPumpDevice extends Device { return Promise.resolve(); } else { throw new Error('Client not ready'); } } catch (err) { - this.log('Failed to set target temperature:', err); + this.error('Failed to set target temperature:', err); return Promise.reject(err); } finally { this.isWriting = false; } } @@ -61,11 +63,10 @@ class HeatPumpDevice extends Device { const endpoint = '/dhwCircuits/dhw1/operationMode'; const payload = { value: value }; try { - this.log(`Setting Hot Water Mode to ${value}`); await this.client.put(endpoint, payload); return Promise.resolve(); } catch (err) { - this.log('Failed to set Hot Water Mode:', err); + this.error('Failed to set Hot Water Mode:', err); return Promise.reject(err); } finally { this.isWriting = false; } } @@ -75,19 +76,19 @@ class HeatPumpDevice extends Device { const endpoint = '/dhwCircuits/dhw1/charge'; const payload = { value: 'start' }; try { - this.log(`Triggering Extra Hot Water (Charge)`); await this.client.put(endpoint, payload); setTimeout(() => { this.setCapabilityValue('hotwater_boost', false).catch(this.error); }, 2000); return Promise.resolve(); } catch (err) { - this.log('Failed to trigger Hot Water Boost:', err); + this.error('Failed to trigger Hot Water Boost:', err); return Promise.reject(err); } finally { this.isWriting = false; } } // --- DATA FETCHING --- + async getDeviceData() { for (const [key, value] of Object.entries(Capabilities)) { if (this.isWriting) break; @@ -105,9 +106,13 @@ class HeatPumpDevice extends Device { result = currentHourObject.y / currentHourObject.c; } else { result = res.value; + // Ensure Number type for temperatures to support Thermostat Dial + if (typeof result === 'string' && !isNaN(result)) { + result = parseFloat(result); + } } this.updateValue(value.name, result); - } catch (err) { } + } catch (err) { } } if (!this.isWriting) { @@ -116,21 +121,16 @@ class HeatPumpDevice extends Device { if (res && res.value) { let mode = res.value; if (typeof mode === 'string') mode = mode.toLowerCase(); - - this.log(`DEBUG: Updating capability 'ivt_hotwater_mode' to value: "${mode}"`); - // Use NEW capability name this.updateValue('ivt_hotwater_mode', mode); } - } catch (err) { - this.log('DEBUG: Error fetching Hot Water Mode:', err.message); - } + } catch (err) { } } if (!this.isWriting) { try { const res = await this.client.get('/heatingCircuits/hc1/temperatureRoomSetpoint'); if (res && res.value) { - this.updateValue('target_temperature', res.value); + this.updateValue('target_temperature', parseFloat(res.value)); } } catch (err) { } } @@ -162,7 +162,7 @@ class HeatPumpDevice extends Device { .join(', '), }; await this.homey.flow.getDeviceTriggerCard('alarm_status_error').trigger(this, tokens); - } catch (error) { this.log(error); } + } catch (error) { this.error(error); } } else if (this.getCapabilityValue('alarm_status') === 'error') { this.homey.flow.getDeviceTriggerCard('alarm_status_ok').trigger(this).catch(this.error); } @@ -175,23 +175,26 @@ class HeatPumpDevice extends Device { clearInterval(this.interval); this.setUpdateInterval(newSettings.interval); } + // Reconnect if credentials changed + if (oldSettings.serial !== newSettings.serial || oldSettings.key !== newSettings.key || oldSettings.password !== newSettings.password) { + if (this.client) this.client.end(); + this.client = await this.getClient(newSettings); + } } async getClient(settings) { - const devSettings = { serial: '176431053', key: 'PzXSw556pA645SKf', password: 'Es7eBX88hUUKWph' }; - const serial = (settings.serial && settings.serial.length > 5) ? settings.serial : devSettings.serial; - const key = (settings.key && settings.key.length > 5) ? settings.key : devSettings.key; - const password = (settings.password && settings.password.length > 5) ? settings.password : devSettings.password; - const client = IVTClient({ - serialNumber: serial, - accessKey: key, - password: password, + serialNumber: settings.serial, + accessKey: settings.key, + password: settings.password, retryTimeout: 10000, maxRetries: 5 }); - client.on('error', (err) => { this.log('XMPP Client Error:', err.message); }); + client.on('error', (err) => { + // Log basic error message but prevent app crash + this.error('XMPP Client Error:', err.message); + }); client.put = function(uri, data) { const encrypted = this.encrypt(typeof data === 'string' ? data : JSON.stringify(data)); @@ -218,7 +221,7 @@ class HeatPumpDevice extends Device { }; await client.connect(); - this.log(`Device connected successfully (Serial: ${serial})`); + this.log(`Device connected`); return client; } diff --git a/drivers/heat-pump/driver.compose.json b/drivers/heat-pump/driver.compose.json index 756e98d..5d83455 100644 --- a/drivers/heat-pump/driver.compose.json +++ b/drivers/heat-pump/driver.compose.json @@ -1,12 +1,14 @@ { "name": { "en": "Heat pump" }, - "class": "heater", + "class": "thermostat", + "statusIndicator": "measure_temperature", "capabilities": [ + "target_temperature", + "measure_temperature", "measure_temperature.supply", "measure_temperature.return", "measure_temperature.outdoor", "measure_temperature.water", - "target_temperature", "ivt_hotwater_mode", "hotwater_boost", "alarm_status", @@ -15,14 +17,25 @@ "meter_power.last_hour_compressor" ], "capabilitiesOptions": { - "measure_temperature.supply": { "title": { "en": "Supply temperature", "sv": "Framledningstemperatur" } }, - "measure_temperature.return": { "title": { "en": "Return temperature", "sv": "Returtemperatur" } }, - "measure_temperature.outdoor": { "title": { "en": "Outdoor temperature", "sv": "Utomhustemperatur" } }, - "measure_temperature.water": { "title": { "en": "Hotwater", "sv": "Varmvatten" } }, + "measure_temperature": { + "title": { "en": "Room Temperature", "sv": "Rumstemperatur" }, + "zones": [ + { "from": 0, "to": 10, "color": "#0000FF" }, + { "from": 10, "to": 15, "color": "#00BFFF" }, + { "from": 15, "to": 18, "color": "#00FF00" }, + { "from": 18, "to": 21, "color": "#FFFF00" }, + { "from": 21, "to": 25, "color": "#FFA500" }, + { "from": 25, "to": 35, "color": "#FF0000" } + ] + }, "target_temperature": { "title": { "en": "Target Temperature", "sv": "Måltemperatur" }, "min": 10, "max": 30, "step": 0.5 }, + "measure_temperature.supply": { "title": { "en": "Supply temperature", "sv": "Framledningstemperatur" } }, + "measure_temperature.return": { "title": { "en": "Return temperature", "sv": "Returtemperatur" } }, + "measure_temperature.outdoor": { "title": { "en": "Outdoor temperature", "sv": "Utomhustemperatur" } }, + "measure_temperature.water": { "title": { "en": "Hotwater", "sv": "Varmvatten" } }, "ivt_hotwater_mode": { "title": { "en": "Hotwater Mode", "sv": "Varmvattenläge" } }, "hotwater_boost": { "title": { "en": "Extra Hot Water", "sv": "Extra Varmvatten" } }, "meter_power.last_hour_eheater": { "title": { "en": "Last hour (eheater)", "sv": "Senaste timmen (elpatron)" } }, diff --git a/lib/.DS_Store b/lib/.DS_Store index ee7f0527b882b6404f04a338db17757effa36c56..d12eaeb606bb1a49196b3709042e0ebceeb40ff3 100644 GIT binary patch delta 18 acmZoMXfc?uX5+>%_K6Lwo7p-3@&f=#ng>V# delta 20 ccmZoMXfc?uhLLgO#xVAY4J@14IsWnk08aS_NdN!< diff --git a/lib/capabilities.js b/lib/capabilities.js index e5a6098..1947baf 100644 --- a/lib/capabilities.js +++ b/lib/capabilities.js @@ -1,6 +1,12 @@ 'use strict'; module.exports = { + // --- NEW: Map standard measure_temperature to Room Temperature --- + ROOM_TEMP: { + name: 'measure_temperature', + endpoint: '/heatingCircuits/hc1/roomtemperature', + }, + // ----------------------------------------------------------------- SUPPLY_TEMP: { name: 'measure_temperature.supply', endpoint: '/heatSources/actualSupplyTemperature', @@ -33,4 +39,4 @@ module.exports = { name: 'meter_power.last_hour_compressor', endpoint: '/recordings/heatSources/total/energyMonitoring/compressor?interval=', }, -}; +}; \ No newline at end of file From a42af8163a38138f70a5b932c9fced8f0d6e71fa Mon Sep 17 00:00:00 2001 From: Michael Edholm Date: Wed, 14 Jan 2026 16:59:36 +0100 Subject: [PATCH 4/5] Fixed status indicator --- app.json | 2 +- drivers/heat-pump/driver.compose.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app.json b/app.json index ba9505d..aaff5c3 100644 --- a/app.json +++ b/app.json @@ -122,7 +122,7 @@ "name": { "en": "Heat pump" }, - "class": "thermostat", + "class": "heatpump", "statusIndicator": "measure_temperature", "capabilities": [ "target_temperature", diff --git a/drivers/heat-pump/driver.compose.json b/drivers/heat-pump/driver.compose.json index 5d83455..7802b40 100644 --- a/drivers/heat-pump/driver.compose.json +++ b/drivers/heat-pump/driver.compose.json @@ -1,6 +1,6 @@ { "name": { "en": "Heat pump" }, - "class": "thermostat", + "class": "heatpump", "statusIndicator": "measure_temperature", "capabilities": [ "target_temperature", From fbb255706114aeeba35e985171e98e1b6f14989f Mon Sep 17 00:00:00 2001 From: Michael Edholm Date: Mon, 19 Jan 2026 00:21:18 +0100 Subject: [PATCH 5/5] Resolved error messages from coderabbit. --- docs/rawscan.txt | 2 +- drivers/heat-pump/device.js | 52 ++++++++++++++++++++++--------------- 2 files changed, 32 insertions(+), 22 deletions(-) diff --git a/docs/rawscan.txt b/docs/rawscan.txt index 72f59da..b93595e 100644 --- a/docs/rawscan.txt +++ b/docs/rawscan.txt @@ -1120,7 +1120,7 @@ data: recordable: 0 recordedResource: id: /system/sensors/temperatures/outdoor_t1 - uri: http://192.168.7.67/system/sensors/temperatures/outdoor_t1 + uri: http:///system/sensors/temperatures/outdoor_t1 interval: 2026-1-12 sampleRate: P1H recording-type: actual diff --git a/drivers/heat-pump/device.js b/drivers/heat-pump/device.js index 7245044..80a9041 100644 --- a/drivers/heat-pump/device.js +++ b/drivers/heat-pump/device.js @@ -71,21 +71,23 @@ class HeatPumpDevice extends Device { } finally { this.isWriting = false; } } - async onCapabilityHotWaterBoost(value) { - this.isWriting = true; - const endpoint = '/dhwCircuits/dhw1/charge'; + async onCapabilityHotWaterBoost(value) { + if (!value) return; + this.isWriting = true; + const endpoint = '/dhwCircuits/dhw1/charge'; const payload = { value: 'start' }; - try { - await this.client.put(endpoint, payload); - setTimeout(() => { - this.setCapabilityValue('hotwater_boost', false).catch(this.error); - }, 2000); - return Promise.resolve(); - } catch (err) { - this.error('Failed to trigger Hot Water Boost:', err); - return Promise.reject(err); - } finally { this.isWriting = false; } - } + try { + await this.client.put(endpoint, payload); + setTimeout(() => { + this.setCapabilityValue('hotwater_boost', false).catch(this.error); + }, 2000); + return Promise.resolve(); + } catch (err) { + this.error('Failed to trigger Hot Water Boost:', err); + return Promise.reject(err); + } finally { this.isWriting = false; } + } + // --- DATA FETCHING --- @@ -101,9 +103,12 @@ class HeatPumpDevice extends Device { const res = await this.client.get(endpoint); if (value.name.includes('meter_power')) { - const currentHour = new Date().getHours(); - const currentHourObject = res.recording[currentHour - 2]; - result = currentHourObject.y / currentHourObject.c; + const currentHour = new Date().getHours(); + const idx = Math.max(0, currentHour - 2); + const currentHourObject = res.recording?.[idx]; + if (!currentHourObject || !currentHourObject.c) { continue; } + result = currentHourObject.y / currentHourObject.c; + } else { result = res.value; // Ensure Number type for temperatures to support Thermostat Dial @@ -163,8 +168,8 @@ class HeatPumpDevice extends Device { }; await this.homey.flow.getDeviceTriggerCard('alarm_status_error').trigger(this, tokens); } catch (error) { this.error(error); } - } else if (this.getCapabilityValue('alarm_status') === 'error') { - this.homey.flow.getDeviceTriggerCard('alarm_status_ok').trigger(this).catch(this.error); + } else if (this.getCapabilityValue('alarm_status') === true) { + this.homey.flow.getDeviceTriggerCard('alarm_status_ok').trigger(this).catch(this.error); } } @@ -173,8 +178,13 @@ class HeatPumpDevice extends Device { async onSettings({ oldSettings, newSettings, changedKeys }) { if (oldSettings.interval !== newSettings.interval) { clearInterval(this.interval); - this.setUpdateInterval(newSettings.interval); - } + this.interval = setInterval(async () => { + if (!this.isWriting) { + await this.getDeviceData(); + } + }, newSettings.interval * 1000); + +} // Reconnect if credentials changed if (oldSettings.serial !== newSettings.serial || oldSettings.key !== newSettings.key || oldSettings.password !== newSettings.password) { if (this.client) this.client.end();