diff --git a/lib/extension/homeassistant.js b/lib/extension/homeassistant.js index fcccbb0a..91cac7fd 100644 --- a/lib/extension/homeassistant.js +++ b/lib/extension/homeassistant.js @@ -855,10 +855,14 @@ class HomeAssistant extends Extension { // Availability payload payload.availability = [{topic: `${settings.get().mqtt.base_topic}/bridge/state`}]; - payload.availability_mode = 'all'; + /* istanbul ignore next */ - const availabilityEnabled = settings.get().experimental.availability_new ? - utils.isAvailabilityEnabledForDevice(resolvedEntity, settings.get()) : + if (utils.isAvailabilityEnabledForDevice(resolvedEntity, settings.get())) { + payload.availability_mode = 'all'; + } + + /* istanbul ignore next */ + const availabilityEnabled = utils.isAvailabilityEnabledForDevice(resolvedEntity, settings.get()) || settings.get().advanced.availability_timeout; if (resolvedEntity.type === 'device' && availabilityEnabled) { payload.availability.push({topic: `${settings.get().mqtt.base_topic}/${friendlyName}/availability`}); diff --git a/lib/types/types.ts b/lib/types/types.ts index 288614c7..0434853a 100644 --- a/lib/types/types.ts +++ b/lib/types/types.ts @@ -63,6 +63,7 @@ declare global { }, experimental: { output: 'json' | 'attribute' | 'attribute_and_json', + availability_new?: boolean, }, advanced: { legacy_api: boolean, diff --git a/lib/util/utils.ts b/lib/util/utils.ts index c9f72846..a3ff8b19 100644 --- a/lib/util/utils.ts +++ b/lib/util/utils.ts @@ -255,6 +255,8 @@ export function sanitizeImageParameter(parameter: string): string { } export function isAvailabilityEnabledForDevice(rd: ResolvedDevice, settings: Settings): boolean { + if (!settings.experimental.availability_new) return false; + if (rd.settings.hasOwnProperty('availability')) { return !!rd.settings.availability; } diff --git a/test/homeassistant.test.js b/test/homeassistant.test.js index 8132cbca..31f05afd 100644 --- a/test/homeassistant.test.js +++ b/test/homeassistant.test.js @@ -62,7 +62,6 @@ describe('HomeAssistant extension', () => { payload = { "availability":[{"topic":"zigbee2mqtt/bridge/state"}], - "availability_mode": "all", "brightness":true, "brightness_scale":254, "color_mode":true, @@ -94,7 +93,6 @@ describe('HomeAssistant extension', () => { payload = { "availability":[{"topic":"zigbee2mqtt/bridge/state"}], - "availability_mode": "all", "command_topic":"zigbee2mqtt/ha_discovery_group/set", "device":{ "identifiers":["zigbee2mqtt_1221051039810110150109113116116_9"], @@ -134,7 +132,6 @@ describe('HomeAssistant extension', () => { 'manufacturer': 'Xiaomi', }, 'availability': [{topic: 'zigbee2mqtt/bridge/state'}], - 'availability_mode': 'all', }; expect(MQTT.publish).toHaveBeenCalledWith( @@ -161,7 +158,6 @@ describe('HomeAssistant extension', () => { 'manufacturer': 'Xiaomi', }, 'availability': [{topic: 'zigbee2mqtt/bridge/state'}], - 'availability_mode': 'all', }; expect(MQTT.publish).toHaveBeenCalledWith( @@ -188,7 +184,6 @@ describe('HomeAssistant extension', () => { 'manufacturer': 'Xiaomi', }, 'availability': [{topic: 'zigbee2mqtt/bridge/state'}], - 'availability_mode': 'all', }; expect(MQTT.publish).toHaveBeenCalledWith( @@ -215,7 +210,6 @@ describe('HomeAssistant extension', () => { 'manufacturer': 'Xiaomi', }, 'availability': [{topic: 'zigbee2mqtt/bridge/state'}], - 'availability_mode': 'all', }; expect(MQTT.publish).toHaveBeenCalledWith( @@ -243,7 +237,6 @@ describe('HomeAssistant extension', () => { 'manufacturer': 'Xiaomi', }, 'availability': [{topic: 'zigbee2mqtt/bridge/state'}], - 'availability_mode': 'all', }; expect(MQTT.publish).toHaveBeenCalledWith( @@ -255,7 +248,6 @@ describe('HomeAssistant extension', () => { payload = { "availability":[{"topic":"zigbee2mqtt/bridge/state"}], - "availability_mode": "all", "command_topic":"zigbee2mqtt/wall_switch_double/left/set", "device":{ "identifiers":[ @@ -284,7 +276,6 @@ describe('HomeAssistant extension', () => { payload = { "availability":[{"topic":"zigbee2mqtt/bridge/state"}], - "availability_mode": "all", "command_topic":"zigbee2mqtt/wall_switch_double/right/set", "device":{ "identifiers":[ @@ -313,7 +304,6 @@ describe('HomeAssistant extension', () => { payload = { "availability":[{"topic":"zigbee2mqtt/bridge/state"}], - "availability_mode": "all", "brightness":true, "brightness_scale":254, "color_mode": true, @@ -386,7 +376,6 @@ describe('HomeAssistant extension', () => { 'manufacturer': 'Xiaomi', }, 'availability': [{topic: 'zigbee2mqtt/bridge/state'}], - 'availability_mode': 'all', }; expect(MQTT.publish).toHaveBeenCalledWith( @@ -413,7 +402,6 @@ describe('HomeAssistant extension', () => { 'manufacturer': 'Xiaomi', }, 'availability': [{topic: 'zigbee2mqtt/bridge/state'}], - 'availability_mode': 'all', }; expect(MQTT.publish).toHaveBeenCalledWith( @@ -440,7 +428,6 @@ describe('HomeAssistant extension', () => { 'manufacturer': 'Xiaomi', }, 'availability': [{topic: 'zigbee2mqtt/bridge/state'}], - 'availability_mode': 'all', }; expect(MQTT.publish).toHaveBeenCalledWith( @@ -498,7 +485,6 @@ describe('HomeAssistant extension', () => { 'manufacturer': 'From Xiaomi', }, 'availability': [{topic: 'zigbee2mqtt/bridge/state'}], - 'availability_mode': 'all', 'expire_after': 90, 'icon': 'mdi:test', }; @@ -526,7 +512,6 @@ describe('HomeAssistant extension', () => { 'manufacturer': 'Not from Xiaomi', }, 'availability': [{topic: 'zigbee2mqtt/bridge/state'}], - 'availability_mode': 'all', 'expire_after': 30, 'icon': 'mdi:test', }; @@ -563,7 +548,6 @@ describe('HomeAssistant extension', () => { payload = { 'availability': [{topic: 'zigbee2mqtt/bridge/state'}], - 'availability_mode': 'all', "command_topic": "zigbee2mqtt/my_switch/set", "device": { "identifiers": [ @@ -663,7 +647,6 @@ describe('HomeAssistant extension', () => { "manufacturer":"Hampton Bay" }, 'availability': [{topic: 'zigbee2mqtt/bridge/state'}], - 'availability_mode': 'all', }; expect(MQTT.publish).toHaveBeenCalledWith( @@ -683,7 +666,6 @@ describe('HomeAssistant extension', () => { payload = { 'availability': [{topic: 'zigbee2mqtt/bridge/state'}], - 'availability_mode': 'all', "away_mode_command_topic":"zigbee2mqtt/TS0601_thermostat/set/away_mode", "away_mode_state_template":"{{ value_json.away_mode }}", "away_mode_state_topic":"zigbee2mqtt/TS0601_thermostat", @@ -760,7 +742,6 @@ describe('HomeAssistant extension', () => { manufacturer: 'Keen Home' }, 'availability': [{topic: 'zigbee2mqtt/bridge/state'}], - 'availability_mode': 'all', }; expect(MQTT.publish).toHaveBeenCalledWith( @@ -796,7 +777,6 @@ describe('HomeAssistant extension', () => { 'manufacturer': 'Xiaomi', }, 'availability': [{topic: 'zigbee2mqtt/bridge/state'}], - 'availability_mode': 'all', }; expect(MQTT.publish).toHaveBeenCalledWith( @@ -940,7 +920,6 @@ describe('HomeAssistant extension', () => { 'manufacturer': 'Xiaomi', }, 'availability': [{topic: 'zigbee2mqtt/bridge/state'}], - 'availability_mode': 'all', }; expect(MQTT.publish).toHaveBeenCalledWith( @@ -1064,7 +1043,6 @@ describe('HomeAssistant extension', () => { 'manufacturer': 'Xiaomi', }, 'availability': [{topic: 'zigbee2mqtt/bridge/state'}, {topic: 'zigbee2mqtt/weather_sensor/availability'}], - 'availability_mode': 'all', }; expect(MQTT.publish).toHaveBeenCalledWith( @@ -1152,7 +1130,6 @@ describe('HomeAssistant extension', () => { 'manufacturer': 'Xiaomi', }, 'availability': [{topic: 'zigbee2mqtt/bridge/state'}], - 'availability_mode': 'all', }; expect(MQTT.publish).toHaveBeenCalledWith( @@ -1224,7 +1201,6 @@ describe('HomeAssistant extension', () => { 'manufacturer': 'Xiaomi', }, 'availability': [{topic: 'zigbee2mqtt/bridge/state'}], - 'availability_mode': 'all', }; expect(MQTT.publish).toHaveBeenCalledWith( @@ -1258,7 +1234,6 @@ describe('HomeAssistant extension', () => { "manufacturer":"IKEA" }, 'availability': [{topic: 'zigbee2mqtt/bridge/state'}], - 'availability_mode': 'all', }; expect(MQTT.publish).toHaveBeenCalledWith( @@ -1707,7 +1682,6 @@ describe('HomeAssistant extension', () => { 'manufacturer': 'Xiaomi', }, 'availability': [{topic: 'zigbee2mqtt/bridge/state'}], - 'availability_mode': 'all', }; expect(MQTT.publish).toHaveBeenCalledWith( @@ -1728,7 +1702,6 @@ describe('HomeAssistant extension', () => { const payload = { "availability":[{"topic":"zigbee2mqtt/bridge/state"}], - "availability_mode": "all", "brightness":true, "brightness_scale":254, "color_mode":true,