From e045745aa7d688d86da30382595899c987fd2b0d Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Thu, 3 Jun 2021 11:08:29 +0200 Subject: [PATCH 1/4] Deprecate Home Assistant entity attributes --- lib/extension/homeassistant.js | 5 ++- lib/util/settings.schema.json | 6 ++++ test/homeassistant.test.js | 61 +++++++++++++++++++++------------- 3 files changed, 47 insertions(+), 25 deletions(-) diff --git a/lib/extension/homeassistant.js b/lib/extension/homeassistant.js index d19b032853..aeb297b196 100644 --- a/lib/extension/homeassistant.js +++ b/lib/extension/homeassistant.js @@ -42,6 +42,7 @@ class HomeAssistant extends Extension { this.discoveryTopic = settings.get().advanced.homeassistant_discovery_topic; this.statusTopic = settings.get().advanced.homeassistant_status_topic; + this.entityAttributes = settings.get().advanced.homeassistant_legacy_entity_attributes; this.eventBus.on('deviceRemoved', (data) => this.onDeviceRemoved(data.resolvedEntity), this.constructor.name); this.eventBus.on('publishEntityState', (data) => this.onPublishEntityState(data), this.constructor.name); @@ -630,7 +631,9 @@ class HomeAssistant extends Extension { payload.tilt_status_topic = stateTopic; } - payload.json_attributes_topic = stateTopic; + if (this.entityAttributes) { + payload.json_attributes_topic = stateTopic; + } // Set (unique) name, separate by space if friendlyName contains space. const nameSeparator = friendlyName.includes('_') ? '_' : ' '; diff --git a/lib/util/settings.schema.json b/lib/util/settings.schema.json index 391ff05d4e..bbcbc9b462 100644 --- a/lib/util/settings.schema.json +++ b/lib/util/settings.schema.json @@ -423,6 +423,12 @@ "requiresRestart": true, "examples": ["homeassistant"] }, + "homeassistant_legacy_entity_attributes": { + "type": "boolean", + "title": "Home Assistant legacy entity attributes", + "description": "Home Assistant legacy entity attributes, when enabled Zigbee2MQTT will state attributes to each entity additional to the separate entities and devices it already creates", + "default": false + }, "homeassistant_status_topic": { "type": "string", "title": "Home Assistant status topic", diff --git a/test/homeassistant.test.js b/test/homeassistant.test.js index 3db4d74ca6..91e780d375 100644 --- a/test/homeassistant.test.js +++ b/test/homeassistant.test.js @@ -57,7 +57,6 @@ describe('HomeAssistant extension', () => { 'state_class': 'measurement', 'value_template': '{{ value_json.temperature }}', 'state_topic': 'zigbee2mqtt/weather_sensor', - 'json_attributes_topic': 'zigbee2mqtt/weather_sensor', 'name': 'weather_sensor_temperature', 'unique_id': '0x0017880104e45522_temperature_zigbee2mqtt', 'device': { @@ -83,7 +82,6 @@ describe('HomeAssistant extension', () => { 'state_class': 'measurement', 'value_template': '{{ value_json.humidity }}', 'state_topic': 'zigbee2mqtt/weather_sensor', - 'json_attributes_topic': 'zigbee2mqtt/weather_sensor', 'name': 'weather_sensor_humidity', 'unique_id': '0x0017880104e45522_humidity_zigbee2mqtt', 'device': { @@ -109,7 +107,6 @@ describe('HomeAssistant extension', () => { 'state_class': 'measurement', 'value_template': '{{ value_json.pressure }}', 'state_topic': 'zigbee2mqtt/weather_sensor', - 'json_attributes_topic': 'zigbee2mqtt/weather_sensor', 'name': 'weather_sensor_pressure', 'unique_id': '0x0017880104e45522_pressure_zigbee2mqtt', 'device': { @@ -135,7 +132,6 @@ describe('HomeAssistant extension', () => { 'state_class': 'measurement', 'value_template': '{{ value_json.battery }}', 'state_topic': 'zigbee2mqtt/weather_sensor', - 'json_attributes_topic': 'zigbee2mqtt/weather_sensor', 'name': 'weather_sensor_battery', 'unique_id': '0x0017880104e45522_battery_zigbee2mqtt', 'device': { @@ -162,7 +158,6 @@ describe('HomeAssistant extension', () => { 'state_class': 'measurement', 'value_template': '{{ value_json.linkquality }}', 'state_topic': 'zigbee2mqtt/weather_sensor', - 'json_attributes_topic': 'zigbee2mqtt/weather_sensor', 'name': 'weather_sensor_linkquality', 'unique_id': '0x0017880104e45522_linkquality_zigbee2mqtt', 'device': { @@ -198,7 +193,6 @@ describe('HomeAssistant extension', () => { "name":"wall_switch_double", "sw_version":this.version }, - "json_attributes_topic":"zigbee2mqtt/wall_switch_double", "name":"wall_switch_double_left", "payload_off":"OFF", "payload_on":"ON", @@ -230,7 +224,6 @@ describe('HomeAssistant extension', () => { "name":"wall_switch_double", "sw_version":this.version }, - "json_attributes_topic":"zigbee2mqtt/wall_switch_double", "name":"wall_switch_double_right", "payload_off":"OFF", "payload_on":"ON", @@ -277,7 +270,6 @@ describe('HomeAssistant extension', () => { "finish_effect", "stop_effect" ], - "json_attributes_topic":"zigbee2mqtt/bulb", "name":"bulb", "schema":"json", "state_topic":"zigbee2mqtt/bulb", @@ -313,7 +305,6 @@ describe('HomeAssistant extension', () => { 'state_class': 'measurement', 'value_template': "{{ value_json.temperature }}", 'state_topic': 'zigbee2mqtt/weather_sensor', - 'json_attributes_topic': 'zigbee2mqtt/weather_sensor', 'name': 'weather_sensor_temperature', 'unique_id': '0x0017880104e45522_temperature_zigbee2mqtt', 'device': { @@ -339,7 +330,6 @@ describe('HomeAssistant extension', () => { 'state_class': 'measurement', 'value_template': '{{ value_json.humidity }}', 'state_topic': 'zigbee2mqtt/weather_sensor', - 'json_attributes_topic': 'zigbee2mqtt/weather_sensor', 'name': 'weather_sensor_humidity', 'unique_id': '0x0017880104e45522_humidity_zigbee2mqtt', 'device': { @@ -365,7 +355,6 @@ describe('HomeAssistant extension', () => { 'state_class': 'measurement', 'value_template': '{{ value_json.pressure }}', 'state_topic': 'zigbee2mqtt/weather_sensor', - 'json_attributes_topic': 'zigbee2mqtt/weather_sensor', 'name': 'weather_sensor_pressure', 'unique_id': '0x0017880104e45522_pressure_zigbee2mqtt', 'device': { @@ -422,7 +411,6 @@ describe('HomeAssistant extension', () => { 'state_class': 'measurement', 'value_template': '{{ value_json.temperature }}', 'state_topic': 'zigbee2mqtt/weather_sensor', - 'json_attributes_topic': 'zigbee2mqtt/weather_sensor', 'name': 'weather_sensor_temperature', 'unique_id': '0x0017880104e45522_temperature_zigbee2mqtt', 'device': { @@ -450,7 +438,6 @@ describe('HomeAssistant extension', () => { 'state_class': 'measurement', 'value_template': '{{ value_json.humidity }}', 'state_topic': 'zigbee2mqtt/weather_sensor', - 'json_attributes_topic': 'zigbee2mqtt/weather_sensor', 'name': 'weather_sensor_humidity', 'device': { 'identifiers': ['zigbee2mqtt_0x0017880104e45522'], @@ -506,7 +493,6 @@ describe('HomeAssistant extension', () => { "name": "my_switch", "sw_version": this.version }, - "json_attributes_topic": "zigbee2mqtt/my_switch", "name": "my_light_name_override", "payload_off": "OFF", "payload_on": "ON", @@ -580,7 +566,6 @@ describe('HomeAssistant extension', () => { "on", "smart" ], - "json_attributes_topic":"zigbee2mqtt/fan", "name":"fan", "unique_id":"0x0017880104e45548_fan_zigbee2mqtt", "device":{ @@ -637,7 +622,6 @@ describe('HomeAssistant extension', () => { ], "hold_state_template":"{{ value_json.preset }}", "hold_state_topic":"zigbee2mqtt/TS0601_thermostat", - "json_attributes_topic":"zigbee2mqtt/TS0601_thermostat", "max_temp":"35", "min_temp":"5", "mode_command_topic":"zigbee2mqtt/TS0601_thermostat/set/system_mode", @@ -676,7 +660,6 @@ describe('HomeAssistant extension', () => { set_position_topic: 'zigbee2mqtt/smart vent/set', set_position_template: '{ "position": {{ position }} }', position_template: '{{ value_json.position }}', - json_attributes_topic: 'zigbee2mqtt/smart vent', name: 'smart vent', unique_id: '0x0017880104e45551_cover_zigbee2mqtt', device: @@ -712,7 +695,6 @@ describe('HomeAssistant extension', () => { 'state_class': 'measurement', 'value_template': '{{ value_json.temperature }}', 'state_topic': 'zigbee2mqtt/weather_sensor', - 'json_attributes_topic': 'zigbee2mqtt/weather_sensor', 'name': 'weather_sensor_temperature', 'unique_id': '0x0017880104e45522_temperature_zigbee2mqtt', 'device': { @@ -855,7 +837,6 @@ describe('HomeAssistant extension', () => { 'state_class': 'measurement', 'value_template': '{{ value_json.temperature }}', 'state_topic': 'zigbee2mqtt/weather_sensor', - 'json_attributes_topic': 'zigbee2mqtt/weather_sensor', 'name': 'weather_sensor_temperature', 'unique_id': '0x0017880104e45522_temperature_zigbee2mqtt', 'device': { @@ -982,7 +963,6 @@ describe('HomeAssistant extension', () => { 'state_class': 'measurement', 'value_template': '{{ value_json.temperature }}', 'state_topic': 'zigbee2mqtt/weather_sensor', - 'json_attributes_topic': 'zigbee2mqtt/weather_sensor', 'name': 'weather_sensor_temperature', 'unique_id': '0x0017880104e45522_temperature_zigbee2mqtt', 'device': { @@ -1069,7 +1049,6 @@ describe('HomeAssistant extension', () => { 'state_class': 'measurement', 'value_template': '{{ value_json.temperature }}', 'state_topic': 'zigbee2mqtt/weather_sensor_renamed', - 'json_attributes_topic': 'zigbee2mqtt/weather_sensor_renamed', 'name': 'weather_sensor_renamed_temperature', 'unique_id': '0x0017880104e45522_temperature_zigbee2mqtt', 'device': { @@ -1140,7 +1119,6 @@ describe('HomeAssistant extension', () => { 'state_class': 'measurement', 'value_template': '{{ value_json.temperature }}', 'state_topic': 'zigbee2mqtt/weather_sensor_renamed', - 'json_attributes_topic': 'zigbee2mqtt/weather_sensor_renamed', 'name': 'weather_sensor_renamed_temperature', 'unique_id': '0x0017880104e45522_temperature_zigbee2mqtt', 'device': { @@ -1171,7 +1149,6 @@ describe('HomeAssistant extension', () => { "value_template":"{{ value_json.update_available}}", "enabled_by_default": false, "state_topic":"zigbee2mqtt/bulb", - "json_attributes_topic":"zigbee2mqtt/bulb", "name":"bulb update available", "unique_id":"0x000b57fffec6a5b2_update_available_zigbee2mqtt", "device":{ @@ -1347,7 +1324,7 @@ describe('HomeAssistant extension', () => { expect(MQTT.publish).toHaveBeenCalledWith('homeassistant/device_automation/0x0017880104e45520/action_double/config', expect.any(String), expect.any(Object), expect.any(Function)); }); - it('Should not discover device_automtation when disabled', async () => { + it('Should not discover device_automation when disabled', async () => { settings.set(['device_options'], { homeassistant: {device_automation: null}, }) @@ -1580,4 +1557,40 @@ describe('HomeAssistant extension', () => { await flushPromises(); expect(MQTT.publish).toHaveBeenCalledWith('homeassistant/device_automation/0x000b57fffec6a5b2/action_button_3_single/config', null, {qos: 0, retain: true}, expect.any(Function)); }); + + it('Should have Home Assistant legacy entity attributes when enabled', async () => { + settings.set(['advanced', 'homeassistant_legacy_entity_attributes'], true); + controller = new Controller(false); + await controller.start(); + + let payload; + await flushPromises(); + + payload = { + 'unit_of_measurement': '°C', + 'device_class': 'temperature', + 'value_template': '{{ value_json.temperature }}', + 'state_topic': 'zigbee2mqtt/weather_sensor', + 'json_attributes_topic': 'zigbee2mqtt/weather_sensor', + 'name': 'weather_sensor_temperature', + 'unique_id': '0x0017880104e45522_temperature_zigbee2mqtt', + 'device': { + 'identifiers': ['zigbee2mqtt_0x0017880104e45522'], + 'name': 'weather_sensor', + 'sw_version': this.version, + 'model': 'Aqara temperature, humidity and pressure sensor (WSDCGQ11LM)', + 'manufacturer': 'Xiaomi', + }, + 'availability': [{topic: 'zigbee2mqtt/bridge/state'}], + }; + + expect(MQTT.publish).toHaveBeenCalledWith( + 'homeassistant/sensor/0x0017880104e45522/temperature/config', + stringify(payload), + { retain: true, qos: 0 }, + expect.any(Function), + ); + + }); + }); From 3bd9f739eb958cddf04e19fa7dfc82cb3f98bd86 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Fri, 4 Jun 2021 13:30:33 +0200 Subject: [PATCH 2/4] Adjust test to match latest dev --- test/homeassistant.test.js | 1 + 1 file changed, 1 insertion(+) diff --git a/test/homeassistant.test.js b/test/homeassistant.test.js index 91e780d375..cfea4df051 100644 --- a/test/homeassistant.test.js +++ b/test/homeassistant.test.js @@ -1569,6 +1569,7 @@ describe('HomeAssistant extension', () => { payload = { 'unit_of_measurement': '°C', 'device_class': 'temperature', + 'state_class': 'measurement', 'value_template': '{{ value_json.temperature }}', 'state_topic': 'zigbee2mqtt/weather_sensor', 'json_attributes_topic': 'zigbee2mqtt/weather_sensor', From 4c316c0cffcbca0879977ac157ea0129b19340ec Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Mon, 7 Jun 2021 17:11:52 +0200 Subject: [PATCH 3/4] Set default only for new installations --- lib/controller.js | 1 + lib/util/settings.js | 9 +++++++++ lib/util/settings.schema.json | 4 ++-- test/controller.test.js | 2 ++ 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/lib/controller.js b/lib/controller.js index 98ffaecc4d..9508d5a7d2 100644 --- a/lib/controller.js +++ b/lib/controller.js @@ -117,6 +117,7 @@ class Controller { // Disable some legacy options on new network creation if (startResult === 'reset') { + settings.set(['advanced', 'homeassistant_legacy_entity_attributes'], false); settings.set(['advanced', 'legacy_api'], false); settings.set(['device_options', 'legacy'], false); this.enableDisableExtension(false, 'BridgeLegacy'); diff --git a/lib/util/settings.js b/lib/util/settings.js index 107863648d..3736dff940 100644 --- a/lib/util/settings.js +++ b/lib/util/settings.js @@ -125,6 +125,15 @@ const defaults = { */ homeassistant_status_topic: 'hass/status', + /** + * Home Assistant legacy entity attributes, when enabled: + * Zigbee2MQTT will send additional states as attributes with each entity. + * For example, A temperature & humidity sensor will have 2 entities for + * the temperature and humidity, with this setting enabled both entities + * will also have an temperature and humidity attribute. + */ + homeassistant_legacy_entity_attributes: true, + /** * Home Assistant legacy triggers, when enabled: * - Zigbee2mqt will send an empty 'action' or 'click' after one has been send diff --git a/lib/util/settings.schema.json b/lib/util/settings.schema.json index bbcbc9b462..ab7592dd86 100644 --- a/lib/util/settings.schema.json +++ b/lib/util/settings.schema.json @@ -426,8 +426,8 @@ "homeassistant_legacy_entity_attributes": { "type": "boolean", "title": "Home Assistant legacy entity attributes", - "description": "Home Assistant legacy entity attributes, when enabled Zigbee2MQTT will state attributes to each entity additional to the separate entities and devices it already creates", - "default": false + "description": "Home Assistant legacy entity attributes, when enabled Zigbee2MQTT will add state attributes to each entity, additional to the separate entities and devices it already creates", + "default": true }, "homeassistant_status_topic": { "type": "string", diff --git a/test/controller.test.js b/test/controller.test.js index ee771cfe27..9cd4fd57fc 100644 --- a/test/controller.test.js +++ b/test/controller.test.js @@ -625,9 +625,11 @@ describe('Controller', () => { }); it('Should disable legacy options on new network start', async () => { + expect(settings.get().advanced.homeassistant_legacy_entity_attributes).toBeTruthy(); expect(settings.get().advanced.legacy_api).toBeTruthy(); zigbeeHerdsman.start.mockReturnValueOnce('reset'); await controller.start(); + expect(settings.get().advanced.homeassistant_legacy_entity_attributes).toBeFalsy(); expect(settings.get().advanced.legacy_api).toBeFalsy(); }); }); From 5935dab2e87ce7286b08c59caeb680095a8b5919 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Mon, 7 Jun 2021 17:52:05 +0200 Subject: [PATCH 4/4] Fix tests --- test/bridge.test.js | 2 +- test/homeassistant.test.js | 30 +++++++++++++++++++++++++----- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/test/bridge.test.js b/test/bridge.test.js index a0074fa322..10765f2331 100644 --- a/test/bridge.test.js +++ b/test/bridge.test.js @@ -43,7 +43,7 @@ describe('Bridge', () => { const directory = settings.get().advanced.log_directory; expect(MQTT.publish).toHaveBeenCalledWith( 'zigbee2mqtt/bridge/info', - stringify({ "restart_required": false, "commit": version.commitHash, "config": { "advanced": { "adapter_concurrent": null, "adapter_delay": null, "availability_blacklist": [], "availability_blocklist": [], "availability_passlist": [], "availability_timeout": 0, "availability_whitelist": [], "cache_state": true, "cache_state_persistent": true, "cache_state_send_on_startup": true, "channel": 11, "elapsed": false, "ext_pan_id": [221, 221, 221, 221, 221, 221, 221, 221], "homeassistant_discovery_topic": "homeassistant", "homeassistant_legacy_triggers": true, "homeassistant_status_topic": "hass/status", "last_seen": "disable", "legacy_api": false, "log_directory": directory, "log_file": "log.txt", "log_level": "info", "log_output": ["console", "file"], "log_rotation": true, "log_symlink_current": false, "log_syslog": {}, "pan_id": 6754, "report": false, "soft_reset_timeout": 0, "timestamp_format": "YYYY-MM-DD HH:mm:ss" }, "ban": [], "blocklist": [], "device_options": {}, "devices": { "0x000b57fffec6a5b2": { "friendly_name": "bulb", "retain": true }, "0x000b57fffec6a5b3": { "friendly_name": "bulb_color", "retain": false }, "0x000b57fffec6a5b4": { "friendly_name": "bulb_color_2", "retain": false }, "0x000b57fffec6a5b7": { "friendly_name": "bulb_2", "retain": false }, "0x0017880104a44559": { "friendly_name": "J1_cover" }, "0x0017880104e43559": { "friendly_name": "U202DST600ZB" }, "0x0017880104e44559": { "friendly_name": "3157100_thermostat" }, "0x0017880104e45517": { "friendly_name": "remote", "retain": true }, "0x0017880104e45518": { "friendly_name": "0x0017880104e45518" }, "0x0017880104e45520": { "friendly_name": "button", "retain": false }, "0x0017880104e45521": { "friendly_name": "button_double_key", "retain": false }, "0x0017880104e45522": { "friendly_name": "weather_sensor", "qos": 1, "retain": false }, "0x0017880104e45523": { "friendly_name": "occupancy_sensor", "retain": false }, "0x0017880104e45524": { "friendly_name": "power_plug", "retain": false }, "0x0017880104e45526": { "friendly_name": "GL-S-007ZS" }, "0x0017880104e45529": { "friendly_name": "unsupported2", "retain": false }, "0x0017880104e45530": { "friendly_name": "button_double_key_interviewing", "retain": false }, "0x0017880104e45540": { "friendly_name": "ikea_onoff" }, "0x0017880104e45541": { "friendly_name": "wall_switch", "retain": false }, "0x0017880104e45542": { "friendly_name": "wall_switch_double", "retain": false }, "0x0017880104e45543": { "friendly_name": "led_controller_1", "retain": false }, "0x0017880104e45544": { "friendly_name": "led_controller_2", "retain": false }, "0x0017880104e45545": { "friendly_name": "dimmer_wall_switch", "retain": false }, "0x0017880104e45547": { "friendly_name": "curtain", "retain": false }, "0x0017880104e45548": { "friendly_name": "fan", "retain": false }, "0x0017880104e45549": { "friendly_name": "siren", "retain": false }, "0x0017880104e45550": { "friendly_name": "thermostat", "retain": false }, "0x0017880104e45551": { "friendly_name": "smart vent", "retain": false }, "0x0017880104e45552": { "friendly_name": "j1", "retain": false }, "0x0017880104e45553": { "friendly_name": "bulb_enddevice", "retain": false }, "0x0017880104e45559": { "friendly_name": "cc2530_router", "retain": false }, "0x0017880104e45560": { "friendly_name": "livolo", "retain": false }, "0x0017880104e45724":{"friendly_name":"GLEDOPTO_2ID"}, "0x0017882104a44559": { "friendly_name": "TS0601_thermostat" }, "0x0017882194e45543": { "friendly_name": "QS-Zigbee-D02-TRIAC-2C-LN" }, "0x90fd9ffffe4b64aa": { "friendly_name": "SP600_OLD" }, "0x90fd9ffffe4b64ab": { "friendly_name": "SP600_NEW" }, "0x90fd9ffffe4b64ac": { "friendly_name": "MKS-CM-W5" }, "0x90fd9ffffe4b64ae": { "friendly_name": "tradfri_remote", "retain": false }, "0x90fd9ffffe4b64af": { "friendly_name": "roller_shutter" }, "0x90fd9ffffe4b64ax": { "friendly_name": "ZNLDP12LM" }, "0x0017880104e45561": { "friendly_name": "temperature_sensor" }, "0x0017880104e45562": { "friendly_name": "heating_actuator" } }, "experimental": { "output": "json" }, "external_converters": [], "groups": { "1": { "friendly_name": "group_1", "retain": false }, "11": { "devices": ["bulb_2"], "friendly_name": "group_with_tradfri", "retain": false }, "14": { "devices": ["power_plug"], "friendly_name": "switch_group", "retain": false }, "12": { "devices": ["TS0601_thermostat"], "friendly_name": "thermostat_group", "retain": false }, "15071": { "devices": ["bulb_color_2", "bulb_2"], "friendly_name": "group_tradfri_remote", "retain": false }, "2": { "friendly_name": "group_2", "retain": false }, "21":{"devices":["GLEDOPTO_2ID/cct"],"friendly_name":"gledopto_group"} }, "homeassistant": false, "map_options": { "graphviz": { "colors": { "fill": { "coordinator": "#e04e5d", "enddevice": "#fff8ce", "router": "#4ea3e0" }, "font": { "coordinator": "#ffffff", "enddevice": "#000000", "router": "#ffffff" }, "line": { "active": "#009900", "inactive": "#994444" } } } }, "mqtt": { "base_topic": "zigbee2mqtt", "include_device_information": false, "server": "mqtt://localhost", "force_disable_retain": false, }, "ota":{"disable_automatic_update_check":false,"update_check_interval":1440}, "passlist": [], "permit_join": true, "serial": { "disable_led": false, "port": "/dev/dummy" }, "whitelist": [] }, "coordinator": { "meta": { "revision": 20190425, "version": 1 }, "type": "z-Stack" }, "log_level": "info", "network": { "channel": 15, "extended_pan_id": [0, 11, 22], "pan_id": 5674 }, "permit_join": false, "version": version.version, config_schema: settings.schema }), + stringify({ "restart_required": false, "commit": version.commitHash, "config": { "advanced": { "adapter_concurrent": null, "adapter_delay": null, "availability_blacklist": [], "availability_blocklist": [], "availability_passlist": [], "availability_timeout": 0, "availability_whitelist": [], "cache_state": true, "cache_state_persistent": true, "cache_state_send_on_startup": true, "channel": 11, "elapsed": false, "ext_pan_id": [221, 221, 221, 221, 221, 221, 221, 221], "homeassistant_discovery_topic": "homeassistant", "homeassistant_legacy_entity_attributes": true, "homeassistant_legacy_triggers": true, "homeassistant_status_topic": "hass/status", "last_seen": "disable", "legacy_api": false, "log_directory": directory, "log_file": "log.txt", "log_level": "info", "log_output": ["console", "file"], "log_rotation": true, "log_symlink_current": false, "log_syslog": {}, "pan_id": 6754, "report": false, "soft_reset_timeout": 0, "timestamp_format": "YYYY-MM-DD HH:mm:ss" }, "ban": [], "blocklist": [], "device_options": {}, "devices": { "0x000b57fffec6a5b2": { "friendly_name": "bulb", "retain": true }, "0x000b57fffec6a5b3": { "friendly_name": "bulb_color", "retain": false }, "0x000b57fffec6a5b4": { "friendly_name": "bulb_color_2", "retain": false }, "0x000b57fffec6a5b7": { "friendly_name": "bulb_2", "retain": false }, "0x0017880104a44559": { "friendly_name": "J1_cover" }, "0x0017880104e43559": { "friendly_name": "U202DST600ZB" }, "0x0017880104e44559": { "friendly_name": "3157100_thermostat" }, "0x0017880104e45517": { "friendly_name": "remote", "retain": true }, "0x0017880104e45518": { "friendly_name": "0x0017880104e45518" }, "0x0017880104e45520": { "friendly_name": "button", "retain": false }, "0x0017880104e45521": { "friendly_name": "button_double_key", "retain": false }, "0x0017880104e45522": { "friendly_name": "weather_sensor", "qos": 1, "retain": false }, "0x0017880104e45523": { "friendly_name": "occupancy_sensor", "retain": false }, "0x0017880104e45524": { "friendly_name": "power_plug", "retain": false }, "0x0017880104e45526": { "friendly_name": "GL-S-007ZS" }, "0x0017880104e45529": { "friendly_name": "unsupported2", "retain": false }, "0x0017880104e45530": { "friendly_name": "button_double_key_interviewing", "retain": false }, "0x0017880104e45540": { "friendly_name": "ikea_onoff" }, "0x0017880104e45541": { "friendly_name": "wall_switch", "retain": false }, "0x0017880104e45542": { "friendly_name": "wall_switch_double", "retain": false }, "0x0017880104e45543": { "friendly_name": "led_controller_1", "retain": false }, "0x0017880104e45544": { "friendly_name": "led_controller_2", "retain": false }, "0x0017880104e45545": { "friendly_name": "dimmer_wall_switch", "retain": false }, "0x0017880104e45547": { "friendly_name": "curtain", "retain": false }, "0x0017880104e45548": { "friendly_name": "fan", "retain": false }, "0x0017880104e45549": { "friendly_name": "siren", "retain": false }, "0x0017880104e45550": { "friendly_name": "thermostat", "retain": false }, "0x0017880104e45551": { "friendly_name": "smart vent", "retain": false }, "0x0017880104e45552": { "friendly_name": "j1", "retain": false }, "0x0017880104e45553": { "friendly_name": "bulb_enddevice", "retain": false }, "0x0017880104e45559": { "friendly_name": "cc2530_router", "retain": false }, "0x0017880104e45560": { "friendly_name": "livolo", "retain": false }, "0x0017880104e45724":{"friendly_name":"GLEDOPTO_2ID"}, "0x0017882104a44559": { "friendly_name": "TS0601_thermostat" }, "0x0017882194e45543": { "friendly_name": "QS-Zigbee-D02-TRIAC-2C-LN" }, "0x90fd9ffffe4b64aa": { "friendly_name": "SP600_OLD" }, "0x90fd9ffffe4b64ab": { "friendly_name": "SP600_NEW" }, "0x90fd9ffffe4b64ac": { "friendly_name": "MKS-CM-W5" }, "0x90fd9ffffe4b64ae": { "friendly_name": "tradfri_remote", "retain": false }, "0x90fd9ffffe4b64af": { "friendly_name": "roller_shutter" }, "0x90fd9ffffe4b64ax": { "friendly_name": "ZNLDP12LM" }, "0x0017880104e45561": { "friendly_name": "temperature_sensor" }, "0x0017880104e45562": { "friendly_name": "heating_actuator" } }, "experimental": { "output": "json" }, "external_converters": [], "groups": { "1": { "friendly_name": "group_1", "retain": false }, "11": { "devices": ["bulb_2"], "friendly_name": "group_with_tradfri", "retain": false }, "14": { "devices": ["power_plug"], "friendly_name": "switch_group", "retain": false }, "12": { "devices": ["TS0601_thermostat"], "friendly_name": "thermostat_group", "retain": false }, "15071": { "devices": ["bulb_color_2", "bulb_2"], "friendly_name": "group_tradfri_remote", "retain": false }, "2": { "friendly_name": "group_2", "retain": false }, "21":{"devices":["GLEDOPTO_2ID/cct"],"friendly_name":"gledopto_group"} }, "homeassistant": false, "map_options": { "graphviz": { "colors": { "fill": { "coordinator": "#e04e5d", "enddevice": "#fff8ce", "router": "#4ea3e0" }, "font": { "coordinator": "#ffffff", "enddevice": "#000000", "router": "#ffffff" }, "line": { "active": "#009900", "inactive": "#994444" } } } }, "mqtt": { "base_topic": "zigbee2mqtt", "include_device_information": false, "server": "mqtt://localhost", "force_disable_retain": false, }, "ota":{"disable_automatic_update_check":false,"update_check_interval":1440}, "passlist": [], "permit_join": true, "serial": { "disable_led": false, "port": "/dev/dummy" }, "whitelist": [] }, "coordinator": { "meta": { "revision": 20190425, "version": 1 }, "type": "z-Stack" }, "log_level": "info", "network": { "channel": 15, "extended_pan_id": [0, 11, 22], "pan_id": 5674 }, "permit_join": false, "version": version.version, config_schema: settings.schema }), { retain: true, qos: 0 }, expect.any(Function) ); diff --git a/test/homeassistant.test.js b/test/homeassistant.test.js index cfea4df051..b66e926ce6 100644 --- a/test/homeassistant.test.js +++ b/test/homeassistant.test.js @@ -57,6 +57,7 @@ describe('HomeAssistant extension', () => { 'state_class': 'measurement', 'value_template': '{{ value_json.temperature }}', 'state_topic': 'zigbee2mqtt/weather_sensor', + 'json_attributes_topic': 'zigbee2mqtt/weather_sensor', 'name': 'weather_sensor_temperature', 'unique_id': '0x0017880104e45522_temperature_zigbee2mqtt', 'device': { @@ -82,6 +83,7 @@ describe('HomeAssistant extension', () => { 'state_class': 'measurement', 'value_template': '{{ value_json.humidity }}', 'state_topic': 'zigbee2mqtt/weather_sensor', + 'json_attributes_topic': 'zigbee2mqtt/weather_sensor', 'name': 'weather_sensor_humidity', 'unique_id': '0x0017880104e45522_humidity_zigbee2mqtt', 'device': { @@ -107,6 +109,7 @@ describe('HomeAssistant extension', () => { 'state_class': 'measurement', 'value_template': '{{ value_json.pressure }}', 'state_topic': 'zigbee2mqtt/weather_sensor', + 'json_attributes_topic': 'zigbee2mqtt/weather_sensor', 'name': 'weather_sensor_pressure', 'unique_id': '0x0017880104e45522_pressure_zigbee2mqtt', 'device': { @@ -132,6 +135,7 @@ describe('HomeAssistant extension', () => { 'state_class': 'measurement', 'value_template': '{{ value_json.battery }}', 'state_topic': 'zigbee2mqtt/weather_sensor', + 'json_attributes_topic': 'zigbee2mqtt/weather_sensor', 'name': 'weather_sensor_battery', 'unique_id': '0x0017880104e45522_battery_zigbee2mqtt', 'device': { @@ -158,6 +162,7 @@ describe('HomeAssistant extension', () => { 'state_class': 'measurement', 'value_template': '{{ value_json.linkquality }}', 'state_topic': 'zigbee2mqtt/weather_sensor', + 'json_attributes_topic': 'zigbee2mqtt/weather_sensor', 'name': 'weather_sensor_linkquality', 'unique_id': '0x0017880104e45522_linkquality_zigbee2mqtt', 'device': { @@ -193,6 +198,7 @@ describe('HomeAssistant extension', () => { "name":"wall_switch_double", "sw_version":this.version }, + "json_attributes_topic":"zigbee2mqtt/wall_switch_double", "name":"wall_switch_double_left", "payload_off":"OFF", "payload_on":"ON", @@ -224,6 +230,7 @@ describe('HomeAssistant extension', () => { "name":"wall_switch_double", "sw_version":this.version }, + "json_attributes_topic":"zigbee2mqtt/wall_switch_double", "name":"wall_switch_double_right", "payload_off":"OFF", "payload_on":"ON", @@ -270,6 +277,7 @@ describe('HomeAssistant extension', () => { "finish_effect", "stop_effect" ], + "json_attributes_topic":"zigbee2mqtt/bulb", "name":"bulb", "schema":"json", "state_topic":"zigbee2mqtt/bulb", @@ -305,6 +313,7 @@ describe('HomeAssistant extension', () => { 'state_class': 'measurement', 'value_template': "{{ value_json.temperature }}", 'state_topic': 'zigbee2mqtt/weather_sensor', + 'json_attributes_topic': 'zigbee2mqtt/weather_sensor', 'name': 'weather_sensor_temperature', 'unique_id': '0x0017880104e45522_temperature_zigbee2mqtt', 'device': { @@ -330,6 +339,7 @@ describe('HomeAssistant extension', () => { 'state_class': 'measurement', 'value_template': '{{ value_json.humidity }}', 'state_topic': 'zigbee2mqtt/weather_sensor', + 'json_attributes_topic': 'zigbee2mqtt/weather_sensor', 'name': 'weather_sensor_humidity', 'unique_id': '0x0017880104e45522_humidity_zigbee2mqtt', 'device': { @@ -355,6 +365,7 @@ describe('HomeAssistant extension', () => { 'state_class': 'measurement', 'value_template': '{{ value_json.pressure }}', 'state_topic': 'zigbee2mqtt/weather_sensor', + 'json_attributes_topic': 'zigbee2mqtt/weather_sensor', 'name': 'weather_sensor_pressure', 'unique_id': '0x0017880104e45522_pressure_zigbee2mqtt', 'device': { @@ -411,6 +422,7 @@ describe('HomeAssistant extension', () => { 'state_class': 'measurement', 'value_template': '{{ value_json.temperature }}', 'state_topic': 'zigbee2mqtt/weather_sensor', + 'json_attributes_topic': 'zigbee2mqtt/weather_sensor', 'name': 'weather_sensor_temperature', 'unique_id': '0x0017880104e45522_temperature_zigbee2mqtt', 'device': { @@ -438,6 +450,7 @@ describe('HomeAssistant extension', () => { 'state_class': 'measurement', 'value_template': '{{ value_json.humidity }}', 'state_topic': 'zigbee2mqtt/weather_sensor', + 'json_attributes_topic': 'zigbee2mqtt/weather_sensor', 'name': 'weather_sensor_humidity', 'device': { 'identifiers': ['zigbee2mqtt_0x0017880104e45522'], @@ -493,6 +506,7 @@ describe('HomeAssistant extension', () => { "name": "my_switch", "sw_version": this.version }, + "json_attributes_topic": "zigbee2mqtt/my_switch", "name": "my_light_name_override", "payload_off": "OFF", "payload_on": "ON", @@ -566,6 +580,7 @@ describe('HomeAssistant extension', () => { "on", "smart" ], + "json_attributes_topic":"zigbee2mqtt/fan", "name":"fan", "unique_id":"0x0017880104e45548_fan_zigbee2mqtt", "device":{ @@ -622,6 +637,7 @@ describe('HomeAssistant extension', () => { ], "hold_state_template":"{{ value_json.preset }}", "hold_state_topic":"zigbee2mqtt/TS0601_thermostat", + "json_attributes_topic":"zigbee2mqtt/TS0601_thermostat", "max_temp":"35", "min_temp":"5", "mode_command_topic":"zigbee2mqtt/TS0601_thermostat/set/system_mode", @@ -660,6 +676,7 @@ describe('HomeAssistant extension', () => { set_position_topic: 'zigbee2mqtt/smart vent/set', set_position_template: '{ "position": {{ position }} }', position_template: '{{ value_json.position }}', + json_attributes_topic: 'zigbee2mqtt/smart vent', name: 'smart vent', unique_id: '0x0017880104e45551_cover_zigbee2mqtt', device: @@ -695,6 +712,7 @@ describe('HomeAssistant extension', () => { 'state_class': 'measurement', 'value_template': '{{ value_json.temperature }}', 'state_topic': 'zigbee2mqtt/weather_sensor', + 'json_attributes_topic': 'zigbee2mqtt/weather_sensor', 'name': 'weather_sensor_temperature', 'unique_id': '0x0017880104e45522_temperature_zigbee2mqtt', 'device': { @@ -837,6 +855,7 @@ describe('HomeAssistant extension', () => { 'state_class': 'measurement', 'value_template': '{{ value_json.temperature }}', 'state_topic': 'zigbee2mqtt/weather_sensor', + 'json_attributes_topic': 'zigbee2mqtt/weather_sensor', 'name': 'weather_sensor_temperature', 'unique_id': '0x0017880104e45522_temperature_zigbee2mqtt', 'device': { @@ -963,6 +982,7 @@ describe('HomeAssistant extension', () => { 'state_class': 'measurement', 'value_template': '{{ value_json.temperature }}', 'state_topic': 'zigbee2mqtt/weather_sensor', + 'json_attributes_topic': 'zigbee2mqtt/weather_sensor', 'name': 'weather_sensor_temperature', 'unique_id': '0x0017880104e45522_temperature_zigbee2mqtt', 'device': { @@ -1049,6 +1069,7 @@ describe('HomeAssistant extension', () => { 'state_class': 'measurement', 'value_template': '{{ value_json.temperature }}', 'state_topic': 'zigbee2mqtt/weather_sensor_renamed', + 'json_attributes_topic': 'zigbee2mqtt/weather_sensor_renamed', 'name': 'weather_sensor_renamed_temperature', 'unique_id': '0x0017880104e45522_temperature_zigbee2mqtt', 'device': { @@ -1119,6 +1140,7 @@ describe('HomeAssistant extension', () => { 'state_class': 'measurement', 'value_template': '{{ value_json.temperature }}', 'state_topic': 'zigbee2mqtt/weather_sensor_renamed', + 'json_attributes_topic': 'zigbee2mqtt/weather_sensor_renamed', 'name': 'weather_sensor_renamed_temperature', 'unique_id': '0x0017880104e45522_temperature_zigbee2mqtt', 'device': { @@ -1149,6 +1171,7 @@ describe('HomeAssistant extension', () => { "value_template":"{{ value_json.update_available}}", "enabled_by_default": false, "state_topic":"zigbee2mqtt/bulb", + "json_attributes_topic":"zigbee2mqtt/bulb", "name":"bulb update available", "unique_id":"0x000b57fffec6a5b2_update_available_zigbee2mqtt", "device":{ @@ -1558,8 +1581,8 @@ describe('HomeAssistant extension', () => { expect(MQTT.publish).toHaveBeenCalledWith('homeassistant/device_automation/0x000b57fffec6a5b2/action_button_3_single/config', null, {qos: 0, retain: true}, expect.any(Function)); }); - it('Should have Home Assistant legacy entity attributes when enabled', async () => { - settings.set(['advanced', 'homeassistant_legacy_entity_attributes'], true); + it('Should not have Home Assistant legacy entity attributes when disabled', async () => { + settings.set(['advanced', 'homeassistant_legacy_entity_attributes'], false); controller = new Controller(false); await controller.start(); @@ -1572,7 +1595,6 @@ describe('HomeAssistant extension', () => { 'state_class': 'measurement', 'value_template': '{{ value_json.temperature }}', 'state_topic': 'zigbee2mqtt/weather_sensor', - 'json_attributes_topic': 'zigbee2mqtt/weather_sensor', 'name': 'weather_sensor_temperature', 'unique_id': '0x0017880104e45522_temperature_zigbee2mqtt', 'device': { @@ -1591,7 +1613,5 @@ describe('HomeAssistant extension', () => { { retain: true, qos: 0 }, expect.any(Function), ); - }); - });