@homebridge-plugins/homebridge-tado 9.3.1 → 9.3.2

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/CHANGELOG.md CHANGED
@@ -1,5 +1,8 @@
1
1
  # Changelog
2
2
 
3
+ # v9.3.2 - 2026-06-21
4
+ - Fix: Add a defensive `CurrentTemperature` fallback for `HOT_WATER` HeaterCooler accessories when tado does not provide `sensorDataPoints.insideTemperature` (#169)
5
+
3
6
  # v9.3.1 - 2026-06-19
4
7
  - Fix: Preserve previous update buffer behaviour for default `preferSiriTemperature` handling while keeping the `HOT_WATER` range safeguards (#169)
5
8
  - Fix: Improve HeaterCooler threshold value correction during startup
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@homebridge-plugins/homebridge-tado",
3
- "version": "9.3.1",
3
+ "version": "9.3.2",
4
4
  "description": "Homebridge plugin for controlling tado° devices.",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -129,6 +129,14 @@ export default (api, accessories, config, tado, telegram) => {
129
129
  return { min, max };
130
130
  }
131
131
 
132
+ function _getTemperatureValue(temperature) {
133
+ if (!temperature) return undefined;
134
+
135
+ return config.temperatureUnit === 'FAHRENHEIT'
136
+ ? temperature.fahrenheit
137
+ : temperature.celsius;
138
+ }
139
+
132
140
  function _normalizeTemperatureForAccessory(accessory, temp) {
133
141
  if (temp === null || temp === undefined) return temp;
134
142
 
@@ -1091,16 +1099,10 @@ export default (api, accessories, config, tado, telegram) => {
1091
1099
 
1092
1100
  //HEATING
1093
1101
  if (zoneState.sensorDataPoints.insideTemperature) {
1094
- currentTemp =
1095
- config.temperatureUnit === 'FAHRENHEIT'
1096
- ? zoneState.sensorDataPoints.insideTemperature.fahrenheit
1097
- : zoneState.sensorDataPoints.insideTemperature.celsius;
1102
+ currentTemp = _getTemperatureValue(zoneState.sensorDataPoints.insideTemperature);
1098
1103
 
1099
1104
  if (zoneState.setting.power === 'ON') {
1100
- targetTemp =
1101
- config.temperatureUnit === 'FAHRENHEIT'
1102
- ? zoneState.setting.temperature.fahrenheit
1103
- : zoneState.setting.temperature.celsius;
1105
+ targetTemp = _getTemperatureValue(zoneState.setting.temperature);
1104
1106
 
1105
1107
  tempEqual = Math.round(currentTemp) === Math.round(targetTemp);
1106
1108
 
@@ -1230,28 +1232,22 @@ export default (api, accessories, config, tado, telegram) => {
1230
1232
  // Non-HEATING zones (AIR_CONDITIONING, HOT_WATER, etc.)
1231
1233
  battery = zone.battery === 'NORMAL' ? 100 : 10;
1232
1234
 
1233
- if (zoneState.sensorDataPoints.humidity) {
1235
+ if (zoneState.sensorDataPoints && zoneState.sensorDataPoints.humidity) {
1234
1236
  humidity = zoneState.sensorDataPoints.humidity.percentage;
1235
1237
  }
1236
1238
 
1237
- // Get current temperature from sensor data (same as HEATING zones)
1238
- if (zoneState.sensorDataPoints.insideTemperature) {
1239
- currentTemp =
1240
- config.temperatureUnit === 'FAHRENHEIT'
1241
- ? zoneState.sensorDataPoints.insideTemperature.fahrenheit
1242
- : zoneState.sensorDataPoints.insideTemperature.celsius;
1239
+ // Get current temperature from sensor data if tado provides it.
1240
+ // HOT_WATER zones often do not expose sensorDataPoints.insideTemperature;
1241
+ // the HeaterCooler service applies a fallback below when needed.
1242
+ if (zoneState.sensorDataPoints && zoneState.sensorDataPoints.insideTemperature) {
1243
+ currentTemp = _getTemperatureValue(zoneState.sensorDataPoints.insideTemperature);
1243
1244
  }
1244
1245
 
1245
1246
  if (zoneState.setting.power === 'ON') {
1246
1247
  active = 1;
1247
1248
 
1248
1249
  // Get target temperature from setting
1249
- targetTemp =
1250
- zoneState.setting.temperature !== null && zoneState.setting.temperature
1251
- ? config.temperatureUnit === 'FAHRENHEIT'
1252
- ? zoneState.setting.temperature.fahrenheit
1253
- : zoneState.setting.temperature.celsius
1254
- : undefined;
1250
+ targetTemp = _getTemperatureValue(zoneState.setting.temperature);
1255
1251
 
1256
1252
  // Enhanced AC state handling
1257
1253
  if (zone.type === 'AIR_CONDITIONING') {
@@ -1309,11 +1305,30 @@ export default (api, accessories, config, tado, telegram) => {
1309
1305
 
1310
1306
  service.getCharacteristic(characteristicTargetState).updateValue(targetState);
1311
1307
 
1312
- // Set current temperature from sensor data
1313
- if (!isNaN(currentTemp) || acc.context.currentTemp) {
1314
- if (!isNaN(currentTemp)) acc.context.currentTemp = currentTemp; //store current temp in config
1308
+ // Set current temperature from sensor data when available.
1309
+ // HOT_WATER zones can have no sensorDataPoints.insideTemperature in the tado API.
1310
+ // In that case, keep the last known value; if none exists, fall back to the
1311
+ // configured hot-water target temperature and finally the configured minimum.
1312
+ let homeKitCurrentTemp = currentTemp;
1313
+ const isValidTemperature = (value) => value !== undefined && value !== null && !isNaN(value);
1314
+
1315
+ if (zone.type === 'HOT_WATER' && !isValidTemperature(homeKitCurrentTemp)) {
1316
+ if (isValidTemperature(acc.context.currentTemp)) {
1317
+ homeKitCurrentTemp = acc.context.currentTemp;
1318
+ } else if (isValidTemperature(targetTemp)) {
1319
+ homeKitCurrentTemp = targetTemp;
1320
+ } else if (isValidTemperature(zone.minValue)) {
1321
+ homeKitCurrentTemp = zone.minValue;
1322
+ } else if (acc.context.config && isValidTemperature(acc.context.config.minValue)) {
1323
+ homeKitCurrentTemp = acc.context.config.minValue;
1324
+ } else {
1325
+ homeKitCurrentTemp = 30;
1326
+ }
1327
+ }
1315
1328
 
1316
- service.getCharacteristic(characteristicCurrentTemp).updateValue(acc.context.currentTemp);
1329
+ if (!isNaN(homeKitCurrentTemp)) {
1330
+ acc.context.currentTemp = homeKitCurrentTemp; //store current temp in config
1331
+ service.getCharacteristic(characteristicCurrentTemp).updateValue(homeKitCurrentTemp);
1317
1332
  }
1318
1333
 
1319
1334
  // Set target temperature for both heating and cooling
@@ -1569,12 +1584,10 @@ export default (api, accessories, config, tado, telegram) => {
1569
1584
  const weather = await tado.getWeather(config.homeId);
1570
1585
 
1571
1586
  if (weatherTemperatureAccessory.length && weather.outsideTemperature) {
1572
- let tempUnit = config.temperatureUnit;
1573
1587
  let service = weatherTemperatureAccessory[0].getService(api.hap.Service.TemperatureSensor);
1574
1588
  let characteristic = api.hap.Characteristic.CurrentTemperature;
1575
1589
 
1576
- let temp =
1577
- tempUnit === 'FAHRENHEIT' ? weather.outsideTemperature.fahrenheit : weather.outsideTemperature.celsius;
1590
+ let temp = _getTemperatureValue(weather.outsideTemperature);
1578
1591
 
1579
1592
  service.getCharacteristic(characteristic).updateValue(temp);
1580
1593
  }