homebridge-viessmann-vicare 2.0.44 → 2.0.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md
CHANGED
|
@@ -1033,7 +1033,7 @@ For issues and questions:
|
|
|
1033
1033
|
|
|
1034
1034
|
## 📈 Changelog
|
|
1035
1035
|
|
|
1036
|
-
### [2.0.
|
|
1036
|
+
### [2.0.45] - 2026-03-15
|
|
1037
1037
|
#### Fixed
|
|
1038
1038
|
- **Extended Heating state: HomeKit OFF while ViCare ON** — confirmed via live API: `forcedLastFromSchedule.active=True` is a schedule management artifact (always present), not an Extended Heating indicator. State now reads `comfort.active OR (programs.active === comfortFeatureSuffix)`. Deactivation uses `comfort.setTemperature` as fallback when `deactivate` is not executable (Vitodens).
|
|
1039
1039
|
- **Extended Heating / comfort program: API-driven feature discovery** — removed hardcoded candidate list `['comfort', 'comfortHeating']`. Plugin now discovers the comfort program by scanning actual device features for any enabled `programs.*` that has an `activate` command, excluding known non-comfort programs. Works for Vitodens (`programs.comfort`), Vitocal gen3 (`programs.comfortHeating`), and any future device model without code changes.
|
|
@@ -1042,6 +1042,9 @@ For issues and questions:
|
|
|
1042
1042
|
- **Device messages written at startup** — `setupDeviceAccessories` now calls `writeDeviceMessages` so the file exists immediately on startup, not only after the first update cycle.
|
|
1043
1043
|
- **Compressor setpoint path: dynamic** — `heating.compressors.0.speed.setpoint` was hardcoded. Now derived from resolved `hpPaths.compressorMod` by replacing `.current` with `.setpoint` — correct for any device/compressor index.
|
|
1044
1044
|
|
|
1045
|
+
### [2.0.44] - 2026-03-15
|
|
1046
|
+
*(published separately)*
|
|
1047
|
+
|
|
1045
1048
|
### [2.0.43] - 2026-03-15
|
|
1046
1049
|
*(published separately)*
|
|
1047
1050
|
|
package/SETUP-GUIDE.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
# Complete Setup Guide - v2.0.
|
|
1
|
+
# Complete Setup Guide - v2.0.45
|
|
2
2
|
|
|
3
3
|
## Overview
|
|
4
4
|
|
|
5
|
-
This guide will walk you through setting up the Viessmann ViCare plugin v2.0.
|
|
5
|
+
This guide will walk you through setting up the Viessmann ViCare plugin v2.0.45 for Homebridge, including all the advanced features like intelligent caching, rate limiting protection, comprehensive configuration options, **complete localization support with custom names**, **CSV history logging**, **HTML diagnostic reports**, **energy system monitoring** (PV, battery, wallbox), and **heating schedule awareness** with visual bands in the HTML report, and **heat pump (Wärmepumpe) support** with automatic device detection.
|
|
6
6
|
|
|
7
7
|
## Prerequisites
|
|
8
8
|
|
|
@@ -1157,7 +1157,7 @@ When reporting issues, include:
|
|
|
1157
1157
|
|
|
1158
1158
|
```json
|
|
1159
1159
|
{
|
|
1160
|
-
"plugin_version": "2.0.
|
|
1160
|
+
"plugin_version": "2.0.45",
|
|
1161
1161
|
"homebridge_version": "1.8.x",
|
|
1162
1162
|
"node_version": "18.x.x",
|
|
1163
1163
|
"heating_system": "Viessmann Model",
|
|
@@ -1228,7 +1228,7 @@ sudo systemctl restart homebridge
|
|
|
1228
1228
|
|
|
1229
1229
|
## Changelog
|
|
1230
1230
|
|
|
1231
|
-
### v2.0.
|
|
1231
|
+
### v2.0.45 (2026-03-15)
|
|
1232
1232
|
**Multi-device robustness + API-driven feature discovery:**
|
|
1233
1233
|
- **Comfort program discovery: API-driven** — scans actual device features instead of hardcoded name list. Supports Vitodens, Vitocal gen3, and future devices automatically.
|
|
1234
1234
|
- **HC program normalisation: pattern-based** — `comfort*`/`normal*`/`reduced*` prefix matching instead of fixed map.
|
|
@@ -1236,6 +1236,9 @@ sudo systemctl restart homebridge
|
|
|
1236
1236
|
- **Device messages written at startup** — available immediately, not only after first update cycle.
|
|
1237
1237
|
- **Compressor setpoint path: dynamic** — derived from resolved `hpPaths.compressorMod`, no hardcoded device index.
|
|
1238
1238
|
|
|
1239
|
+
### v2.0.44 (2026-03-15)
|
|
1240
|
+
*(published separately)*
|
|
1241
|
+
|
|
1239
1242
|
### v2.0.43 (2026-03-15)
|
|
1240
1243
|
*(published separately)*
|
|
1241
1244
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"heating-circuit-accessory.d.ts","sourceRoot":"","sources":["../../src/accessories/heating-circuit-accessory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAE7E,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,eAAe,EAA2B,MAAM,aAAa,CAAC;AAInI,qBAAa,gCAAgC;IAuEzC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,aAAa;IA3EhC,OAAO,CAAC,mBAAmB,CAAU;IACrC,OAAO,CAAC,kBAAkB,CAAU;IAGpC,OAAO,CAAC,cAAc,CAAC,CAAU;IACjC,OAAO,CAAC,oBAAoB,CAAC,CAAU;IACvC,OAAO,CAAC,sBAAsB,CAAC,CAAU;IAGzC,OAAO,CAAC,cAAc,CAAC,CAAU;IACjC,OAAO,CAAC,cAAc,CAAC,CAAU;IACjC,OAAO,CAAC,cAAc,CAAC,CAAU;IAEjC,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,iBAAiB,CAAgB;IACzC,OAAO,CAAC,wBAAwB,CAAgB;IAChD,OAAO,CAAC,0BAA0B,CAAS;IAC3C,OAAO,CAAC,sBAAsB,CAAuB;IACrD,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,cAAc,CAAY;IAElC,OAAO,CAAC,oBAAoB,CAAa;IAIzC,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,mBAAmB,CAAiC;IAC5D,OAAO,CAAC,mBAAmB,CAAiC;IAC5D,OAAO,CAAC,sBAAsB,CAAiC;IAC/D,OAAO,CAAC,sBAAsB,CAAiC;IAC/D,OAAO,CAAC,mBAAmB,CAAiC;IAC5D,OAAO,CAAC,mBAAmB,CAAiC;IAG5D,OAAO,CAAC,wBAAwB,CAAS;IAEzC,OAAO,CAAC,MAAM,CAeZ;IAGF,OAAO,CAAC,mBAAmB,CAIzB;IAEF,OAAO,CAAC,aAAa,CAAC,CAAyB;IAG/C,OAAO,CAAC,eAAe,CAAyE;IAChG,OAAO,CAAC,oBAAoB,CAA8C;gBAGvD,QAAQ,EAAE,iBAAiB,EAC3B,SAAS,EAAE,iBAAiB,EAC5B,YAAY,EAAE,qBAAqB,EACnC,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,eAAe,EACvB,aAAa,EAAE,MAAM;YA0B1B,sBAAsB;IAyBpC,OAAO,CAAC,mBAAmB;
|
|
1
|
+
{"version":3,"file":"heating-circuit-accessory.d.ts","sourceRoot":"","sources":["../../src/accessories/heating-circuit-accessory.ts"],"names":[],"mappings":"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"}
|
|
@@ -247,14 +247,15 @@ class ViessmannHeatingCircuitAccessory {
|
|
|
247
247
|
(hasForcedActivate && hasForcedDeactivate);
|
|
248
248
|
if (hasAnyMethod) {
|
|
249
249
|
this.availableQuickSelections.push('extendedHeating');
|
|
250
|
-
// Initial state:
|
|
251
|
-
// NOTE: forcedLastFromSchedule.active is NOT used — it is True during normal
|
|
252
|
-
// schedule transitions and does not indicate Extended Heating is active.
|
|
250
|
+
// Initial state: OR of all three signals (same logic as update cycle).
|
|
253
251
|
const comfortActive = comfortProgram.properties?.active?.value || false;
|
|
252
|
+
const forcedActive = forcedProgram?.properties?.active?.value || false;
|
|
254
253
|
const activeProg = features.find(f => f.feature === `${circuitPrefix}.operating.programs.active`);
|
|
255
254
|
const activeIsComfort = activeProg?.properties?.value?.value === this.comfortFeatureSuffix;
|
|
256
|
-
this.states.ExtendedHeatingActive = comfortActive || activeIsComfort;
|
|
257
|
-
this.platform.log.debug(`HC${this.circuitNumber} ExtendedHeating initial
|
|
255
|
+
this.states.ExtendedHeatingActive = comfortActive || forcedActive || activeIsComfort;
|
|
256
|
+
this.platform.log.debug(`HC${this.circuitNumber} ExtendedHeating initial:` +
|
|
257
|
+
` comfort=${comfortActive} forced=${forcedActive} active=${activeProg?.properties?.value?.value}` +
|
|
258
|
+
` → ${this.states.ExtendedHeatingActive}`);
|
|
258
259
|
const activateExecutable = hasActivate?.isExecutable || false;
|
|
259
260
|
const deactivateExecutable = hasDeactivate?.isExecutable || false;
|
|
260
261
|
const setTempExecutable = hasSetTemperature?.isExecutable || false;
|
|
@@ -823,40 +824,45 @@ class ViessmannHeatingCircuitAccessory {
|
|
|
823
824
|
}
|
|
824
825
|
else {
|
|
825
826
|
// DEACTIVATING Extended Heating
|
|
826
|
-
//
|
|
827
|
-
|
|
828
|
-
|
|
827
|
+
// Strategy: try all deactivation methods in order of likelihood to work.
|
|
828
|
+
// On Vitodens: forcedLastFromSchedule is the real mechanism → try it first.
|
|
829
|
+
// On other devices: comfort.deactivate may work directly.
|
|
830
|
+
const circuitPfx = `heating.circuits.${this.circuitNumber}`;
|
|
831
|
+
const forcedProgramNow = features.find(f => f.feature === `${circuitPfx}.operating.programs.forcedLastFromSchedule`);
|
|
832
|
+
let deactivated = false;
|
|
833
|
+
// Method 1: forcedLastFromSchedule.deactivate (Vitodens and others using this mechanism)
|
|
834
|
+
if (!deactivated && forcedProgramNow?.commands?.deactivate?.isExecutable) {
|
|
835
|
+
const success = await this.platform.viessmannAPI.executeCommand(this.installation.id, this.gateway.serial, this.device.id, `${circuitPfx}.operating.programs.forcedLastFromSchedule`, 'deactivate', {});
|
|
836
|
+
if (success) {
|
|
837
|
+
deactivated = true;
|
|
838
|
+
this.platform.log.info(`HC${this.circuitNumber} extended heating deactivated via forcedLastFromSchedule`);
|
|
839
|
+
}
|
|
840
|
+
}
|
|
841
|
+
// Method 2: comfort.deactivate (devices where comfort is the primary mechanism)
|
|
842
|
+
if (!deactivated && comfortProgram.commands?.deactivate?.isExecutable) {
|
|
829
843
|
const success = await this.executeComfortCommand('deactivate', comfortProgram, false);
|
|
830
844
|
if (success) {
|
|
831
|
-
|
|
832
|
-
this.platform.log.info(`
|
|
833
|
-
return;
|
|
845
|
+
deactivated = true;
|
|
846
|
+
this.platform.log.info(`HC${this.circuitNumber} extended heating deactivated via comfort.deactivate`);
|
|
834
847
|
}
|
|
835
848
|
}
|
|
836
|
-
//
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
const setTempCmd = comfortProgram.commands?.['setTemperature'];
|
|
840
|
-
if (setTempCmd?.isExecutable) {
|
|
841
|
-
const normalProgram = features.find(f => f.feature === `heating.circuits.${this.circuitNumber}.operating.programs.normal`);
|
|
849
|
+
// Method 3: comfort.setTemperature back to normal level
|
|
850
|
+
if (!deactivated && comfortProgram.commands?.setTemperature?.isExecutable) {
|
|
851
|
+
const normalProgram = features.find(f => f.feature === `${circuitPfx}.operating.programs.normal`);
|
|
842
852
|
const normalTemp = normalProgram?.properties?.temperature?.value
|
|
843
853
|
?? this.programTemperatures.normal
|
|
844
854
|
?? 20;
|
|
845
|
-
const success = await this.platform.viessmannAPI.executeCommand(this.installation.id, this.gateway.serial, this.device.id,
|
|
855
|
+
const success = await this.platform.viessmannAPI.executeCommand(this.installation.id, this.gateway.serial, this.device.id, `${circuitPfx}.operating.programs.${this.comfortFeatureSuffix}`, 'setTemperature', { targetTemperature: normalTemp });
|
|
846
856
|
if (success) {
|
|
847
|
-
|
|
848
|
-
this.platform.log.info(`
|
|
849
|
-
return;
|
|
857
|
+
deactivated = true;
|
|
858
|
+
this.platform.log.info(`HC${this.circuitNumber} extended heating cancelled via setTemperature → ${normalTemp}°C`);
|
|
850
859
|
}
|
|
851
860
|
}
|
|
852
|
-
|
|
853
|
-
const success = await this.tryAlternativeExtendedHeating(false, comfortProgram, features);
|
|
854
|
-
if (success) {
|
|
861
|
+
if (deactivated) {
|
|
855
862
|
this.states.ExtendedHeatingActive = false;
|
|
856
|
-
this.platform.log.info(`Heating circuit ${this.circuitNumber} extended heating deactivated using alternative method`);
|
|
857
863
|
}
|
|
858
864
|
else {
|
|
859
|
-
throw new Error('Failed to deactivate extended heating
|
|
865
|
+
throw new Error('Failed to deactivate extended heating — no executable command found');
|
|
860
866
|
}
|
|
861
867
|
}
|
|
862
868
|
}
|
|
@@ -1491,21 +1497,30 @@ class ViessmannHeatingCircuitAccessory {
|
|
|
1491
1497
|
}
|
|
1492
1498
|
}
|
|
1493
1499
|
}
|
|
1494
|
-
// Extended heating state
|
|
1495
|
-
//
|
|
1496
|
-
//
|
|
1497
|
-
//
|
|
1500
|
+
// Extended heating state — three signals in OR, all verified via live API:
|
|
1501
|
+
//
|
|
1502
|
+
// Vitodens (Ciriè, confirmed):
|
|
1503
|
+
// programs.active stays 'normal', comfort.active stays False
|
|
1504
|
+
// forcedLastFromSchedule.active = True when ON, False when OFF ← real indicator here
|
|
1505
|
+
//
|
|
1506
|
+
// Vitocal gen3 / other devices:
|
|
1507
|
+
// programs.active may change to comfortFeatureSuffix
|
|
1508
|
+
// comfort.active may become True
|
|
1509
|
+
//
|
|
1510
|
+
// Using OR of all three signals covers all known device behaviours without assumptions.
|
|
1498
1511
|
const comfortProgram = features.find(f => f.feature === `${circuitPrefix}.operating.programs.${this.comfortFeatureSuffix}`);
|
|
1512
|
+
const forcedProgram = features.find(f => f.feature === `${circuitPrefix}.operating.programs.forcedLastFromSchedule`);
|
|
1499
1513
|
const activeProg = features.find(f => f.feature === `${circuitPrefix}.operating.programs.active`);
|
|
1500
1514
|
const comfortActive = comfortProgram?.properties?.active?.value ?? false;
|
|
1515
|
+
const forcedActive = forcedProgram?.properties?.active?.value ?? false;
|
|
1501
1516
|
const activeIsComfort = activeProg?.properties?.value?.value === this.comfortFeatureSuffix;
|
|
1502
|
-
const extendedActive = comfortActive || activeIsComfort;
|
|
1517
|
+
const extendedActive = comfortActive || forcedActive || activeIsComfort;
|
|
1503
1518
|
if (extendedActive !== this.states.ExtendedHeatingActive) {
|
|
1504
1519
|
this.states.ExtendedHeatingActive = extendedActive;
|
|
1505
1520
|
anyProgramStateChanged = true;
|
|
1506
|
-
|
|
1507
|
-
|
|
1508
|
-
|
|
1521
|
+
this.platform.log.debug(`HC${this.circuitNumber} ExtendedHeating:` +
|
|
1522
|
+
` comfort=${comfortActive} forced=${forcedActive} active=${activeProg?.properties?.value?.value}` +
|
|
1523
|
+
` → ${extendedActive}`);
|
|
1509
1524
|
if (extendedActive) {
|
|
1510
1525
|
this.states.HolidayActive = false;
|
|
1511
1526
|
this.states.HolidayAtHomeActive = false;
|
package/dist/settings.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ export declare const PLUGIN_NAME = "homebridge-viessmann-vicare";
|
|
|
9
9
|
/**
|
|
10
10
|
* Plugin version for User-Agent and logging
|
|
11
11
|
*/
|
|
12
|
-
export declare const PLUGIN_VERSION = "2.0.
|
|
12
|
+
export declare const PLUGIN_VERSION = "2.0.45";
|
|
13
13
|
/**
|
|
14
14
|
* Default configuration values
|
|
15
15
|
*/
|
package/dist/settings.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "homebridge-viessmann-vicare",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.45",
|
|
4
4
|
"description": "Complete Homebridge plugin for Viessmann ViCare heating systems with full control capabilities, advanced rate limiting protection, and intelligent cache management",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"scripts": {
|