diff --git a/lib/extension/homeassistant.js b/lib/extension/homeassistant.js index 64c8d23b..9661604a 100644 --- a/lib/extension/homeassistant.js +++ b/lib/extension/homeassistant.js @@ -674,10 +674,10 @@ class HomeAssistant extends Extension { payload.device = this.getDevicePayload(resolvedEntity); // Availability payload - payload.availability = [ - {topic: `${settings.get().mqtt.base_topic}/bridge/state`}, - {topic: `${settings.get().mqtt.base_topic}/${friendlyName}/availability`}, - ]; + payload.availability = [{topic: `${settings.get().mqtt.base_topic}/bridge/state`}]; + if (settings.get().advanced.availability_timeout) { + payload.availability.push({topic: `${settings.get().mqtt.base_topic}/${friendlyName}/availability`}); + } if (payload.command_topic) { payload.command_topic = `${settings.get().mqtt.base_topic}/${friendlyName}/`; diff --git a/test/homeassistant.test.js b/test/homeassistant.test.js index 57b22168..f741e15b 100644 --- a/test/homeassistant.test.js +++ b/test/homeassistant.test.js @@ -64,7 +64,7 @@ describe('HomeAssistant extension', () => { 'model': 'Aqara temperature, humidity and pressure sensor (WSDCGQ11LM)', 'manufacturer': 'Xiaomi', }, - 'availability': [{topic: 'zigbee2mqtt/bridge/state'}, {topic: 'zigbee2mqtt/weather_sensor/availability'}], + 'availability': [{topic: 'zigbee2mqtt/bridge/state'}], }; expect(MQTT.publish).toHaveBeenCalledWith( @@ -89,7 +89,7 @@ describe('HomeAssistant extension', () => { 'model': 'Aqara temperature, humidity and pressure sensor (WSDCGQ11LM)', 'manufacturer': 'Xiaomi', }, - 'availability': [{topic: 'zigbee2mqtt/bridge/state'}, {topic: 'zigbee2mqtt/weather_sensor/availability'}], + 'availability': [{topic: 'zigbee2mqtt/bridge/state'}], }; expect(MQTT.publish).toHaveBeenCalledWith( @@ -114,7 +114,7 @@ describe('HomeAssistant extension', () => { 'model': 'Aqara temperature, humidity and pressure sensor (WSDCGQ11LM)', 'manufacturer': 'Xiaomi', }, - 'availability': [{topic: 'zigbee2mqtt/bridge/state'}, {topic: 'zigbee2mqtt/weather_sensor/availability'}], + 'availability': [{topic: 'zigbee2mqtt/bridge/state'}], }; expect(MQTT.publish).toHaveBeenCalledWith( @@ -139,7 +139,7 @@ describe('HomeAssistant extension', () => { 'model': 'Aqara temperature, humidity and pressure sensor (WSDCGQ11LM)', 'manufacturer': 'Xiaomi', }, - 'availability': [{topic: 'zigbee2mqtt/bridge/state'}, {topic: 'zigbee2mqtt/weather_sensor/availability'}], + 'availability': [{topic: 'zigbee2mqtt/bridge/state'}], }; expect(MQTT.publish).toHaveBeenCalledWith( @@ -164,7 +164,7 @@ describe('HomeAssistant extension', () => { 'model': 'Aqara temperature, humidity and pressure sensor (WSDCGQ11LM)', 'manufacturer': 'Xiaomi', }, - 'availability': [{topic: 'zigbee2mqtt/bridge/state'}, {topic: 'zigbee2mqtt/weather_sensor/availability'}], + 'availability': [{topic: 'zigbee2mqtt/bridge/state'}], }; expect(MQTT.publish).toHaveBeenCalledWith( @@ -205,7 +205,7 @@ describe('HomeAssistant extension', () => { 'model': 'Aqara temperature, humidity and pressure sensor (WSDCGQ11LM)', 'manufacturer': 'Xiaomi', }, - 'availability': [{topic: 'zigbee2mqtt/bridge/state'}, {topic: 'zigbee2mqtt/weather_sensor/availability'}], + 'availability': [{topic: 'zigbee2mqtt/bridge/state'}], }; expect(MQTT.publish).toHaveBeenCalledWith( @@ -230,7 +230,7 @@ describe('HomeAssistant extension', () => { 'model': 'Aqara temperature, humidity and pressure sensor (WSDCGQ11LM)', 'manufacturer': 'Xiaomi', }, - 'availability': [{topic: 'zigbee2mqtt/bridge/state'}, {topic: 'zigbee2mqtt/weather_sensor/availability'}], + 'availability': [{topic: 'zigbee2mqtt/bridge/state'}], }; expect(MQTT.publish).toHaveBeenCalledWith( @@ -255,7 +255,7 @@ describe('HomeAssistant extension', () => { 'model': 'Aqara temperature, humidity and pressure sensor (WSDCGQ11LM)', 'manufacturer': 'Xiaomi', }, - 'availability': [{topic: 'zigbee2mqtt/bridge/state'}, {topic: 'zigbee2mqtt/weather_sensor/availability'}], + 'availability': [{topic: 'zigbee2mqtt/bridge/state'}], }; expect(MQTT.publish).toHaveBeenCalledWith( @@ -311,7 +311,7 @@ describe('HomeAssistant extension', () => { 'model': 'custom model', 'manufacturer': 'From Xiaomi', }, - 'availability': [{topic: 'zigbee2mqtt/bridge/state'}, {topic: 'zigbee2mqtt/weather_sensor/availability'}], + 'availability': [{topic: 'zigbee2mqtt/bridge/state'}], 'expire_after': 90, 'icon': 'mdi:test', }; @@ -337,7 +337,7 @@ describe('HomeAssistant extension', () => { 'model': 'custom model', 'manufacturer': 'Not from Xiaomi', }, - 'availability': [{topic: 'zigbee2mqtt/bridge/state'}, {topic: 'zigbee2mqtt/weather_sensor/availability'}], + 'availability': [{topic: 'zigbee2mqtt/bridge/state'}], 'expire_after': 30, 'icon': 'mdi:test', }; @@ -373,7 +373,7 @@ describe('HomeAssistant extension', () => { await flushPromises(); payload = { - 'availability': [{topic: 'zigbee2mqtt/bridge/state'}, {topic: 'zigbee2mqtt/my_switch/availability'}], + 'availability': [{topic: 'zigbee2mqtt/bridge/state'}], "command_topic": "zigbee2mqtt/my_switch/set", "device": { "identifiers": [ @@ -454,7 +454,7 @@ describe('HomeAssistant extension', () => { "model":"Universal wink enabled white ceiling fan premier remote control (99432)", "manufacturer":"Hampton Bay" }, - 'availability': [{topic: 'zigbee2mqtt/bridge/state'}, {topic: 'zigbee2mqtt/fan/availability'}], + 'availability': [{topic: 'zigbee2mqtt/bridge/state'}], }; expect(MQTT.publish).toHaveBeenCalledWith( @@ -475,7 +475,7 @@ describe('HomeAssistant extension', () => { payload = { "action_template":"{% set values = {'idle':'off','heat':'heating','cool':'cooling','fan only':'fan'} %}{{ values[value_json.running_state] }}", "action_topic":"zigbee2mqtt/TS0601_thermostat", - 'availability': [{topic: 'zigbee2mqtt/bridge/state'}, {topic: 'zigbee2mqtt/TS0601_thermostat/availability'}], + 'availability': [{topic: 'zigbee2mqtt/bridge/state'}], "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", @@ -551,7 +551,7 @@ describe('HomeAssistant extension', () => { model: 'Smart vent (SV01)', manufacturer: 'Keen Home' }, - 'availability': [{topic: 'zigbee2mqtt/bridge/state'}, {topic: 'zigbee2mqtt/smart vent/availability'}], + 'availability': [{topic: 'zigbee2mqtt/bridge/state'}], }; expect(MQTT.publish).toHaveBeenCalledWith( @@ -585,7 +585,7 @@ describe('HomeAssistant extension', () => { 'model': 'Aqara temperature, humidity and pressure sensor (WSDCGQ11LM)', 'manufacturer': 'Xiaomi', }, - 'availability': [{topic: 'zigbee2mqtt/bridge/state'}, {topic: 'zigbee2mqtt/weather_sensor/availability'}], + 'availability': [{topic: 'zigbee2mqtt/bridge/state'}], }; expect(MQTT.publish).toHaveBeenCalledWith( @@ -650,7 +650,7 @@ describe('HomeAssistant extension', () => { 'model': 'Aqara temperature, humidity and pressure sensor (WSDCGQ11LM)', 'manufacturer': 'Xiaomi', }, - 'availability': [{topic: 'zigbee2mqtt/bridge/state'}, {topic: 'zigbee2mqtt/weather_sensor/availability'}], + 'availability': [{topic: 'zigbee2mqtt/bridge/state'}], }; expect(MQTT.publish).toHaveBeenCalledWith( @@ -865,7 +865,7 @@ describe('HomeAssistant extension', () => { 'model': 'Aqara temperature, humidity and pressure sensor (WSDCGQ11LM)', 'manufacturer': 'Xiaomi', }, - 'availability': [{topic: 'zigbee2mqtt/bridge/state'}, {topic: 'zigbee2mqtt/weather_sensor_renamed/availability'}], + 'availability': [{topic: 'zigbee2mqtt/bridge/state'}], }; expect(MQTT.publish).toHaveBeenCalledWith( @@ -936,7 +936,7 @@ describe('HomeAssistant extension', () => { 'model': 'Aqara temperature, humidity and pressure sensor (WSDCGQ11LM)', 'manufacturer': 'Xiaomi', }, - 'availability': [{topic: 'zigbee2mqtt/bridge/state'}, {topic: 'zigbee2mqtt/weather_sensor_renamed/availability'}], + 'availability': [{topic: 'zigbee2mqtt/bridge/state'}], }; expect(MQTT.publish).toHaveBeenCalledWith( @@ -968,7 +968,7 @@ describe('HomeAssistant extension', () => { "model":"TRADFRI LED bulb E26/E27 980 lumen, dimmable, white spectrum, opal white (LED1545G12)", "manufacturer":"IKEA" }, - 'availability': [{topic: 'zigbee2mqtt/bridge/state'}, {topic: 'zigbee2mqtt/bulb/availability'}], + 'availability': [{topic: 'zigbee2mqtt/bridge/state'}], }; expect(MQTT.publish).toHaveBeenCalledWith( @@ -1287,26 +1287,26 @@ describe('HomeAssistant extension', () => { // Non-existing device -> clear MQTT.publish.mockClear(); - await MQTT.events.message('homeassistant/sensor/0x123/temperature/config', stringify({availability: [{topic: 'zigbee2mqtt/bridge/state'}, {topic: 'zigbee2mqtt/0x123/availability'}]})); + await MQTT.events.message('homeassistant/sensor/0x123/temperature/config', stringify({availability: [{topic: 'zigbee2mqtt/bridge/state'}]})); await flushPromises(); expect(MQTT.publish).toHaveBeenCalledTimes(1); expect(MQTT.publish).toHaveBeenCalledWith('homeassistant/sensor/0x123/temperature/config', null, {qos: 0, retain: true}, expect.any(Function)); // Existing device -> don't clear MQTT.publish.mockClear(); - await MQTT.events.message('homeassistant/binary_sensor/0x000b57fffec6a5b2/update_available/config', stringify({availability: [{topic: 'zigbee2mqtt/bridge/state'}, {topic: 'zigbee2mqtt/0x000b57fffec6a5b2/availability'}]})); + await MQTT.events.message('homeassistant/binary_sensor/0x000b57fffec6a5b2/update_available/config', stringify({availability: [{topic: 'zigbee2mqtt/bridge/state'}]})); await flushPromises(); expect(MQTT.publish).toHaveBeenCalledTimes(0); // Non-existing device of different instance -> don't clear MQTT.publish.mockClear(); - await MQTT.events.message('homeassistant/sensor/0x123/temperature/config', stringify({availability: [{topic: 'zigbee2mqtt_different/bridge/state'}, {topic: 'zigbee2mqtt_different/0x123/availability'}]})); + await MQTT.events.message('homeassistant/sensor/0x123/temperature/config', stringify({availability: [{topic: 'zigbee2mqtt_different/bridge/state'}]})); await flushPromises(); expect(MQTT.publish).toHaveBeenCalledTimes(0); // Existing device but non-existing config -> don't clear MQTT.publish.mockClear(); - await MQTT.events.message('homeassistant/sensor/0x000b57fffec6a5b2/update_available/config', stringify({availability: [{topic: 'zigbee2mqtt/bridge/state'}, {topic: 'zigbee2mqtt/0x000b57fffec6a5b2/availability'}]})); + await MQTT.events.message('homeassistant/sensor/0x000b57fffec6a5b2/update_available/config', stringify({availability: [{topic: 'zigbee2mqtt/bridge/state'}]})); await flushPromises(); expect(MQTT.publish).toHaveBeenCalledTimes(1); expect(MQTT.publish).toHaveBeenCalledWith('homeassistant/sensor/0x000b57fffec6a5b2/update_available/config', null, {qos: 0, retain: true}, expect.any(Function));