diff --git a/lib/extension/homeassistant.ts b/lib/extension/homeassistant.ts index 20892caeb..aa65a64b1 100644 --- a/lib/extension/homeassistant.ts +++ b/lib/extension/homeassistant.ts @@ -2177,8 +2177,13 @@ export class HomeAssistant extends Extension { payload.model = entity.definition.description; payload.model_id = entity.definition.model; payload.manufacturer = entity.definition.vendor; - payload.sw_version = entity.zh.softwareBuildID; - payload.hw_version = entity.zh.hardwareVersion; + if (entity.zh.softwareBuildID != null) { + payload.sw_version = entity.zh.softwareBuildID; + } + + if (entity.zh.hardwareVersion != null) { + payload.hw_version = String(entity.zh.hardwareVersion); + } payload.configuration_url = `${url}/#/device/${urlEntityPostfix}${entity.ieeeAddr}/info`; } else if (entity.isGroup()) { payload.model = "Group"; diff --git a/test/extensions/homeassistant.test.ts b/test/extensions/homeassistant.test.ts index f97456396..f5d2e2bde 100644 --- a/test/extensions/homeassistant.test.ts +++ b/test/extensions/homeassistant.test.ts @@ -471,6 +471,7 @@ describe("Extension: HomeAssistant", () => { model: "Element classic (A19)", model_id: "E11-G13", name: "bulb_enddevice", + sw_version: version, via_device: "zigbee2mqtt_bridge_0x00124b00120144ae", }, name: null, @@ -531,6 +532,7 @@ describe("Extension: HomeAssistant", () => { device: { identifiers: ["zigbee2mqtt_0x0017880104e45522"], name: "weather_sensor", + sw_version: version, model: "Temperature and humidity sensor", model_id: "WSDCGQ11LM", manufacturer: "Aqara", @@ -559,6 +561,7 @@ describe("Extension: HomeAssistant", () => { device: { identifiers: ["zigbee2mqtt_0x0017880104e45522"], name: "weather_sensor", + sw_version: version, model: "Temperature and humidity sensor", model_id: "WSDCGQ11LM", manufacturer: "Aqara", @@ -586,6 +589,7 @@ describe("Extension: HomeAssistant", () => { device: { identifiers: ["zigbee2mqtt_0x0017880104e45522"], name: "weather_sensor", + sw_version: version, model: "Temperature and humidity sensor", model_id: "WSDCGQ11LM", manufacturer: "Aqara", @@ -614,6 +618,7 @@ describe("Extension: HomeAssistant", () => { device: { identifiers: ["zigbee2mqtt_0x0017880104e45522"], name: "weather_sensor", + sw_version: version, model: "Temperature and humidity sensor", model_id: "WSDCGQ11LM", manufacturer: "Aqara", @@ -643,6 +648,7 @@ describe("Extension: HomeAssistant", () => { device: { identifiers: ["zigbee2mqtt_0x0017880104e45522"], name: "weather_sensor", + sw_version: version, model: "Temperature and humidity sensor", model_id: "WSDCGQ11LM", manufacturer: "Aqara", @@ -665,6 +671,7 @@ describe("Extension: HomeAssistant", () => { model: "Smart wall switch (no neutral, double rocker)", model_id: "QBKG03LM", name: "wall_switch_double", + sw_version: version, via_device: "zigbee2mqtt_bridge_0x00124b00120144ae", }, name: "Left", @@ -692,6 +699,7 @@ describe("Extension: HomeAssistant", () => { model: "Smart wall switch (no neutral, double rocker)", model_id: "QBKG03LM", name: "wall_switch_double", + sw_version: version, via_device: "zigbee2mqtt_bridge_0x00124b00120144ae", }, name: "Right", @@ -724,6 +732,7 @@ describe("Extension: HomeAssistant", () => { model: "TRADFRI bulb E26/E27, white spectrum, globe, opal, 980 lm", model_id: "LED1545G12", name: "bulb", + sw_version: version, via_device: "zigbee2mqtt_bridge_0x00124b00120144ae", }, effect: true, @@ -750,6 +759,7 @@ describe("Extension: HomeAssistant", () => { model: "Wireless mini switch", model_id: "WXKG11LM", name: "button", + sw_version: version, via_device: "zigbee2mqtt_bridge_0x00124b00120144ae", }, event_types: ["single", "double", "triple", "quadruple", "hold", "release"], @@ -825,6 +835,7 @@ describe("Extension: HomeAssistant", () => { device: { identifiers: ["zigbee2mqtt_0x0017880104e45522"], name: "weather_sensor", + sw_version: version, model: "Temperature and humidity sensor", model_id: "WSDCGQ11LM", manufacturer: "Aqara", @@ -843,6 +854,7 @@ describe("Extension: HomeAssistant", () => { device: { identifiers: ["zigbee2mqtt_0x0017880104e45522"], name: "weather_sensor_renamed", + sw_version: version, model: "Temperature and humidity sensor", model_id: "WSDCGQ11LM", manufacturer: "Aqara", @@ -896,6 +908,7 @@ describe("Extension: HomeAssistant", () => { device: { identifiers: ["zigbee2mqtt_0x0017880104e45522"], name: "weather_sensor", + sw_version: version, model: "Temperature and humidity sensor", model_id: "WSDCGQ11LM", manufacturer: "Aqara", @@ -923,6 +936,7 @@ describe("Extension: HomeAssistant", () => { device: { identifiers: ["zigbee2mqtt_0x0017880104e45522"], name: "weather_sensor", + sw_version: version, model: "Temperature and humidity sensor", model_id: "WSDCGQ11LM", manufacturer: "Aqara", @@ -950,6 +964,7 @@ describe("Extension: HomeAssistant", () => { device: { identifiers: ["zigbee2mqtt_0x0017880104e45522"], name: "weather_sensor", + sw_version: version, model: "Temperature and humidity sensor", model_id: "WSDCGQ11LM", manufacturer: "Aqara", @@ -1034,6 +1049,7 @@ describe("Extension: HomeAssistant", () => { device: { identifiers: ["zigbee2mqtt_0x0017880104e45522"], name: "weather_sensor", + sw_version: version, model: "custom model", model_id: "custom id", manufacturer: "Not from Aqara", @@ -1080,6 +1096,7 @@ describe("Extension: HomeAssistant", () => { device: { identifiers: ["zigbee2mqtt_0x0017880104e45522"], name: "Weather Sensor", + sw_version: version, model: "Temperature and humidity sensor", model_id: "WSDCGQ11LM", manufacturer: "Aqara", @@ -1108,6 +1125,7 @@ describe("Extension: HomeAssistant", () => { device: { identifiers: ["zigbee2mqtt_0x0017880104e45522"], name: "Weather Sensor", + sw_version: version, model: "Temperature and humidity sensor", model_id: "WSDCGQ11LM", manufacturer: "Aqara", @@ -1151,6 +1169,7 @@ describe("Extension: HomeAssistant", () => { model: "Smart wall switch (no neutral, single rocker)", model_id: "QBKG04LM", name: "my_switch", + sw_version: version, via_device: "zigbee2mqtt_bridge_0x00124b00120144ae", }, name: "my_light_name_override", @@ -1225,6 +1244,7 @@ describe("Extension: HomeAssistant", () => { device: { identifiers: ["zigbee2mqtt_0x0017880104e45548"], name: "fan", + sw_version: version, model: "Universal wink enabled white ceiling fan premier remote control", model_id: "99432", manufacturer: "Hampton Bay", @@ -1264,6 +1284,7 @@ describe("Extension: HomeAssistant", () => { device: { identifiers: ["zigbee2mqtt_0x0017880104e45549"], name: "siren", + sw_version: version, model: "Smart siren", model_id: "HS2WD-E", manufacturer: "Heiman", @@ -1297,6 +1318,7 @@ describe("Extension: HomeAssistant", () => { device: { identifiers: ["zigbee2mqtt_0x00124b00cfcf3298"], name: "fanbee", + sw_version: version, model: "Fan with valve", model_id: "FanBee", manufacturer: "Lorenz Brun", @@ -1334,6 +1356,7 @@ describe("Extension: HomeAssistant", () => { model: "Radiator valve with thermostat", model_id: "TS0601_thermostat", name: "TS0601_thermostat", + sw_version: version, via_device: "zigbee2mqtt_bridge_0x00124b00120144ae", }, preset_mode_command_topic: "zigbee2mqtt/TS0601_thermostat/set/preset", @@ -1379,6 +1402,7 @@ describe("Extension: HomeAssistant", () => { model: "Smart heating thermostat", model_id: "1TST-EU", name: "thermostat", + sw_version: version, via_device: "zigbee2mqtt_bridge_0x00124b00120144ae", }, entity_category: "diagnostic", @@ -1415,6 +1439,7 @@ describe("Extension: HomeAssistant", () => { model_id: "BTH-RA", name: "bosch_radiator", sw_version: "3.05.09", + hw_version: "1", via_device: "zigbee2mqtt_bridge_0x00124b00120144ae", }, icon: "mdi:radiator", @@ -1450,6 +1475,7 @@ describe("Extension: HomeAssistant", () => { model_id: "BTH-RA", name: "bosch_radiator", sw_version: "3.05.09", + hw_version: "1", via_device: "zigbee2mqtt_bridge_0x00124b00120144ae", }, max_temp: "30", @@ -1493,6 +1519,7 @@ describe("Extension: HomeAssistant", () => { model: "Automatically generated definition", model_id: "notSupportedModelID", name: "0x0017880104e45518", + sw_version: version, via_device: "zigbee2mqtt_bridge_0x00124b00120144ae", }, device_class: "temperature", @@ -1533,6 +1560,7 @@ describe("Extension: HomeAssistant", () => { model: "Automatically generated definition", model_id: "notSupportedModelID", name: "0x0017880104e45518", + sw_version: version, via_device: "zigbee2mqtt_bridge_0x00124b00120144ae", }, name: "my_number_name", @@ -1594,6 +1622,7 @@ describe("Extension: HomeAssistant", () => { model_id: "BTH-RA", name: "bosch_radiator", sw_version: "3.05.09", + hw_version: "1", via_device: "zigbee2mqtt_bridge_0x00124b00120144ae", }, max_temp: "30", @@ -1664,6 +1693,7 @@ describe("Extension: HomeAssistant", () => { model: "Room thermostat II 230V", model_id: "BTH-RM230Z", name: "bosch_rm230z", + sw_version: version, via_device: "zigbee2mqtt_bridge_0x00124b00120144ae", }, max_temp: "30", @@ -1707,6 +1737,7 @@ describe("Extension: HomeAssistant", () => { model: "Room thermostat II 230V", model_id: "BTH-RM230Z", name: "bosch_rm230z", + sw_version: version, via_device: "zigbee2mqtt_bridge_0x00124b00120144ae", }, device_class: "temperature", @@ -1807,6 +1838,7 @@ describe("Extension: HomeAssistant", () => { device: { identifiers: ["zigbee2mqtt_0x0017880104e45551"], name: "smart vent", + sw_version: version, model: "Smart vent", model_id: "SV01", manufacturer: "Keen Home", @@ -1829,6 +1861,7 @@ describe("Extension: HomeAssistant", () => { model: "zigfred plus smart in-wall switch", model_id: "ZFP-1A-CH", name: "zigfred_plus", + sw_version: version, via_device: "zigbee2mqtt_bridge_0x00124b00120144ae", }, name: "L6", @@ -1873,6 +1906,7 @@ describe("Extension: HomeAssistant", () => { model: "Dual smart curtain switch", model_id: "TS130F_GIRIER_DUAL", name: "0xa4c138018cf95021", + sw_version: version, via_device: "zigbee2mqtt_bridge_0x00124b00120144ae", }, name: "Left", @@ -1906,6 +1940,7 @@ describe("Extension: HomeAssistant", () => { model: "Dual smart curtain switch", model_id: "TS130F_GIRIER_DUAL", name: "0xa4c138018cf95021", + sw_version: version, via_device: "zigbee2mqtt_bridge_0x00124b00120144ae", }, name: "Right", @@ -2074,6 +2109,7 @@ describe("Extension: HomeAssistant", () => { device: { identifiers: ["zigbee2mqtt_0x0017880104e45522"], name: "weather_sensor", + sw_version: version, model: "Temperature and humidity sensor", model_id: "WSDCGQ11LM", manufacturer: "Aqara", @@ -2241,6 +2277,7 @@ describe("Extension: HomeAssistant", () => { device: { identifiers: ["zigbee2mqtt_0x0017880104e45522"], name: "weather_sensor", + sw_version: version, model: "Temperature and humidity sensor", model_id: "WSDCGQ11LM", manufacturer: "Aqara", @@ -2408,6 +2445,7 @@ describe("Extension: HomeAssistant", () => { device: { identifiers: ["zigbee2mqtt_0x0017880104e45522"], name: "weather_sensor", + sw_version: version, model: "Temperature and humidity sensor", model_id: "WSDCGQ11LM", manufacturer: "Aqara", @@ -2478,6 +2516,7 @@ describe("Extension: HomeAssistant", () => { device: { identifiers: ["zigbee2mqtt_0x0017880104e45522"], name: "weather_sensor_renamed", + sw_version: version, model: "Temperature and humidity sensor", model_id: "WSDCGQ11LM", manufacturer: "Aqara", @@ -2505,6 +2544,7 @@ describe("Extension: HomeAssistant", () => { device: { identifiers: ["zigbee2mqtt_0x0017880104e45522"], name: "weather_sensor_renamed", + sw_version: version, model: "Temperature and humidity sensor", model_id: "WSDCGQ11LM", manufacturer: "Aqara", @@ -2612,6 +2652,7 @@ describe("Extension: HomeAssistant", () => { device: { identifiers: ["zigbee2mqtt_0x0017880104e45522"], name: "weather_sensor_renamed", + sw_version: version, model: "Temperature and humidity sensor", model_id: "WSDCGQ11LM", manufacturer: "Aqara", @@ -2636,6 +2677,7 @@ describe("Extension: HomeAssistant", () => { model: "TRADFRI bulb E26/E27, white spectrum, globe, opal, 980 lm", model_id: "LED1545G12", name: "bulb", + sw_version: version, via_device: "zigbee2mqtt_bridge_0x00124b00120144ae", }, device_class: "firmware", @@ -2679,6 +2721,7 @@ describe("Extension: HomeAssistant", () => { device: { identifiers: ["zigbee2mqtt_0x0017880104e45520"], name: "button", + sw_version: version, model: "Wireless mini switch", model_id: "WXKG11LM", manufacturer: "Aqara", @@ -2790,6 +2833,7 @@ describe("Extension: HomeAssistant", () => { model: "Wireless mini switch", model_id: "WXKG11LM", name: "button", + sw_version: version, via_device: "zigbee2mqtt_bridge_0x00124b00120144ae", }, event_types: ["single", "double", "triple", "quadruple", "hold", "release"], @@ -3109,6 +3153,7 @@ describe("Extension: HomeAssistant", () => { model: "TRADFRI bulb E26/E27, white spectrum, globe, opal, 980 lm", model_id: "LED1545G12", name: "bulb", + sw_version: version, via_device: "zigbee2mqtt_bridge_0x00124b00120144ae", }, effect: true, @@ -3148,6 +3193,7 @@ describe("Extension: HomeAssistant", () => { model: "TRADFRI bulb E26/E27, white spectrum, globe, opal, 980 lm", model_id: "LED1545G12", name: "bulb", + sw_version: version, via_device: "zigbee2mqtt_bridge_0x00124b00120144ae", }, enabled_by_default: false, @@ -3194,6 +3240,7 @@ describe("Extension: HomeAssistant", () => { device: { identifiers: ["zigbee2mqtt_0x0017880104e45522"], name: "weather_sensor", + sw_version: version, model: "Temperature and humidity sensor", model_id: "WSDCGQ11LM", manufacturer: "Aqara", @@ -3558,6 +3605,7 @@ describe("Extension: HomeAssistant", () => { model: "Light/shutter control unit II", model_id: "BMCT-SLZ", name: "0x18fc26000000cafe", + sw_version: version, via_device: "zigbee2mqtt_bridge_0x00124b00120144ae", }, entity_category: "config", diff --git a/test/mocks/zigbeeHerdsman.ts b/test/mocks/zigbeeHerdsman.ts index e69c3a884..161ba2796 100644 --- a/test/mocks/zigbeeHerdsman.ts +++ b/test/mocks/zigbeeHerdsman.ts @@ -243,6 +243,7 @@ export class Device { endpoints: Endpoint[]; powerSource: string | undefined; softwareBuildID: string | undefined; + hardwareVersion: number | undefined; interviewState: InterviewState; modelID: string | undefined; interview: Mock; @@ -304,6 +305,7 @@ export class Device { dateCode: string | undefined = undefined, softwareBuildID: string | undefined = undefined, customClusters = {}, + hardwareVersion: number | undefined = undefined, ) { this.type = type; this.ieeeAddr = ieeeAddr; @@ -313,6 +315,7 @@ export class Device { this.endpoints = endpoints; this.powerSource = powerSource; this.softwareBuildID = softwareBuildID; + this.hardwareVersion = hardwareVersion; this.interviewState = interviewState; this.modelID = modelID; this.interview = vi.fn(); @@ -612,6 +615,7 @@ export const devices = { "20231122", "3.05.09", CUSTOM_CLUSTER_BTHRA, + 1, ), bulb_color: bulb_color, bulb_2: bulb_2,