@@ -5,6 +5,12 @@ import * as mockSleep from '../mocks/sleep';
55import { flushPromises , getZhcBaseDefinitions } from '../mocks/utils' ;
66import { devices , groups , events as mockZHEvents } from '../mocks/zigbeeHerdsman' ;
77
8+ import type { MockInstance } from 'vitest' ;
9+
10+ import type Device from '../../lib/model/device' ;
11+ import type Group from '../../lib/model/group' ;
12+ import type { Device as ZhDevice } from '../mocks/zigbeeHerdsman' ;
13+
814import assert from 'node:assert' ;
915
1016import stringify from 'json-stable-stringify-without-jsonify' ;
@@ -47,6 +53,11 @@ describe('Extension: HomeAssistant', () => {
4753 extension . discovered [ id ] . triggers = new Set ( ) ;
4854 } ;
4955
56+ const getZ2MEntity = ( zhDeviceOrGroup : string | number | ZhDevice ) : Device | Group => {
57+ // @ts -expect-error private
58+ return controller . zigbee . resolveEntity ( zhDeviceOrGroup ) ! ;
59+ } ;
60+
5061 beforeAll ( async ( ) => {
5162 const { getZigbee2MQTTVersion} = await import ( '../../lib/util/utils.js' ) ;
5263 z2m_version = ( await getZigbee2MQTTVersion ( ) ) . version ;
@@ -1032,6 +1043,61 @@ describe('Extension: HomeAssistant', () => {
10321043 } ) ;
10331044 } ) ;
10341045
1046+ it ( 'does not throw when discovery payload override throws' , async ( ) => {
1047+ const bosch = getZ2MEntity ( devices [ 'RBSH-TRV0-ZB-EU' ] ) as Device ;
1048+ assert ( typeof bosch . definition ?. meta ?. overrideHaDiscoveryPayload === 'function' ) ;
1049+ const overrideSpy = vi . spyOn ( bosch . definition . meta , 'overrideHaDiscoveryPayload' ) as MockInstance ;
1050+
1051+ overrideSpy . mockImplementation ( ( payload ) => {
1052+ if ( payload . mode_command_topic ?. endsWith ( '/system_mode' ) ) {
1053+ throw new Error ( 'Failed' ) ;
1054+ }
1055+ } ) ;
1056+
1057+ await resetExtension ( ) ;
1058+
1059+ const payload = {
1060+ action_template :
1061+ "{% set values = {None:None,'idle':'idle','heat':'heating','cool':'cooling','fan_only':'fan'} %}{{ values[value_json.running_state] }}" ,
1062+ action_topic : 'zigbee2mqtt/bosch_radiator' ,
1063+ availability : [ { topic : 'zigbee2mqtt/bridge/state' , value_template : '{{ value_json.state }}' } ] ,
1064+ current_temperature_template : '{{ value_json.local_temperature }}' ,
1065+ current_temperature_topic : 'zigbee2mqtt/bosch_radiator' ,
1066+ device : {
1067+ identifiers : [ 'zigbee2mqtt_0x18fc2600000d7ae2' ] ,
1068+ manufacturer : 'Bosch' ,
1069+ model : 'Radiator thermostat II' ,
1070+ model_id : 'BTH-RA' ,
1071+ name : 'bosch_radiator' ,
1072+ sw_version : '3.05.09' ,
1073+ via_device : 'zigbee2mqtt_bridge_0x00124b00120144ae' ,
1074+ } ,
1075+ max_temp : '30' ,
1076+ min_temp : '5' ,
1077+ mode_command_topic : 'zigbee2mqtt/bosch_radiator/set/system_mode' ,
1078+ mode_state_template : '{{ value_json.system_mode }}' ,
1079+ mode_state_topic : 'zigbee2mqtt/bosch_radiator' ,
1080+ modes : [ 'heat' ] ,
1081+ name : null ,
1082+ object_id : 'bosch_radiator' ,
1083+ origin : origin ,
1084+ temp_step : 0.5 ,
1085+ temperature_command_topic : 'zigbee2mqtt/bosch_radiator/set/occupied_heating_setpoint' ,
1086+ temperature_state_template : '{{ value_json.occupied_heating_setpoint }}' ,
1087+ temperature_state_topic : 'zigbee2mqtt/bosch_radiator' ,
1088+ temperature_unit : 'C' ,
1089+ unique_id : '0x18fc2600000d7ae2_climate_zigbee2mqtt' ,
1090+ } ;
1091+
1092+ expect ( mockMQTTPublishAsync ) . toHaveBeenCalledWith ( 'homeassistant/climate/0x18fc2600000d7ae2/climate/config' , stringify ( payload ) , {
1093+ qos : 1 ,
1094+ retain : true ,
1095+ } ) ;
1096+ expect ( mockLogger . error ) . toHaveBeenCalledWith ( expect . stringContaining ( 'Failed to override HA discovery payload' ) ) ;
1097+
1098+ overrideSpy . mockRestore ( ) ;
1099+ } ) ;
1100+
10351101 it ( 'Should discover devices with cover_position' , async ( ) => {
10361102 let payload ;
10371103
@@ -1393,8 +1459,7 @@ describe('Extension: HomeAssistant', () => {
13931459 } ) ;
13941460
13951461 it ( 'Should discover when options change' , async ( ) => {
1396- // @ts -expect-error private
1397- const device = controller . zigbee . resolveEntity ( devices . bulb ) ! ;
1462+ const device = getZ2MEntity ( devices . bulb ) ! as Device ;
13981463 assert ( 'ieeeAddr' in device ) ;
13991464 resetDiscoveryPayloads ( device . ieeeAddr ) ;
14001465 mockMQTTPublishAsync . mockClear ( ) ;
@@ -2314,8 +2379,7 @@ describe('Extension: HomeAssistant', () => {
23142379
23152380 it ( 'Should rediscover scenes when a scene is changed' , async ( ) => {
23162381 // Device/endpoint scenes.
2317- // @ts -expect-error private
2318- const device = controller . zigbee . resolveEntity ( devices . bulb_color_2 ) ! ;
2382+ const device = getZ2MEntity ( devices . bulb_color_2 ) ! as Device ;
23192383 assert ( 'ieeeAddr' in device ) ;
23202384 resetDiscoveryPayloads ( device . ieeeAddr ) ;
23212385
@@ -2353,8 +2417,7 @@ describe('Extension: HomeAssistant', () => {
23532417 } ) ;
23542418
23552419 // Group scenes.
2356- // @ts -expect-error private
2357- const group = controller . zigbee . resolveEntity ( 'ha_discovery_group' ) ;
2420+ const group = getZ2MEntity ( 'ha_discovery_group' ) as Group ;
23582421 resetDiscoveryPayloads ( '9' ) ;
23592422
23602423 mockMQTTPublishAsync . mockClear ( ) ;
0 commit comments