Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve support for Bosch BTH-RM230Z #7484

Merged
merged 15 commits into from
May 5, 2024

Conversation

burmistrzak
Copy link
Contributor

@burmistrzak burmistrzak commented May 4, 2024

Improve support for the Bosch thermostat by utilizing more default clusters and attributes.

Includes:

  • Introduce operating_mode [ schedule | manual | pause ] (manufacturer-specific)
  • Properly expose system_mode
  • Add cool mode
  • Remove auto from system_mode (not supported by device)
  • Convert to modernExtend

There's currently some duplicated code in bosch.ts, but until I get to the Bosch TRV, we'll unfortunately have to live with that fact. 😅

Fixes #7357
Relevant #6995

@burmistrzak burmistrzak changed the title Improve support for Bosch BTH-RM230Z rm230z Improve support for Bosch BTH-RM230Z May 4, 2024
src/devices/bosch.ts Outdated Show resolved Hide resolved
@burmistrzak burmistrzak requested a review from Koenkk May 4, 2024 19:53
@burmistrzak

This comment was marked as resolved.

@Koenkk Koenkk merged commit 2101914 into Koenkk:master May 5, 2024
2 checks passed
@Koenkk
Copy link
Owner

Koenkk commented May 5, 2024

Thanks!

@burmistrzak
Copy link
Contributor Author

@Koenkk Hmm, looks like endpoint.read() here doesn't use our custom cluster?

await endpoint.read('hvacUserInterfaceCfg', ['displayOntime', 'displayBrightness'], manufacturerOptions);

Seems the specified manufacturerCode is actually missing from the issued ZCL command? 😬

zigbee2mqtt-1  | [2024-05-05 23:26:41] debug:   zhc:setupattribute: Configure reporting: false, read: true for 0x0--------------4/1 hvacUserInterfaceCfg [{"attribute":"displayOntime","min":-1,"max":-1,"change":-1}]
zigbee2mqtt-1  | [2024-05-05 23:26:41] debug:   zh:controller:endpoint: ZCL command 0x0--------------4/1 hvacUserInterfaceCfg.read(["displayOntime"], {"timeout":10000,"disableResponse":false,"disableRecovery":false,"disableDefaultResponse":true,"direction":0,"srcEndpoint":null,"reservedBits":0,"manufacturerCode":null,"transactionSequenceNumber":null,"writeUndiv":false})
zigbee2mqtt-1  | [2024-05-05 23:26:41] debug:   z2m: Received Zigbee message from '0x0--------------4', type 'readResponse', cluster 'hvacUserInterfaceCfg', data '{}' from endpoint 1 with groupID 0
zigbee2mqtt-1  | [2024-05-05 23:26:41] error:   z2m: Exception while calling fromZigbee converter: Value is not a number, got undefined (undefined)}
zigbee2mqtt-1  | [2024-05-05 23:26:41] debug:   z2m: Error: Value is not a number, got undefined (undefined)
zigbee2mqtt-1  |     at assertNumber (/app/node_modules/zigbee-herdsman-converters/src/lib/utils.ts:548:65)
zigbee2mqtt-1  |     at Object.convert (/app/node_modules/zigbee-herdsman-converters/src/lib/modernExtend.ts:1601:29)
zigbee2mqtt-1  |     at Receive.onDeviceMessage (/app/lib/extension/receive.ts:153:51)
zigbee2mqtt-1  |     at EventEmitter.wrappedCallback (/app/lib/eventBus.ts:174:17)
zigbee2mqtt-1  | [2024-05-05 23:26:41] debug:   zh:controller:endpoint: ZCL command 0x0--------------4/1 hvacUserInterfaceCfg.read(["displayOntime"], {"timeout":10000,"disableResponse":false,"disableRecovery":false,"disableDefaultResponse":true,"direction":0,"srcEndpoint":null,"reservedBits":0,"manufacturerCode":null,"transactionSequenceNumber":null,"writeUndiv":false}) failed (Status 'UNSUPPORTED_ATTRIBUTE')
zigbee2mqtt-1  | [2024-05-05 23:26:41] debug:   zhc:setupattribute: Reading attribute failed: Error: ZCL command 0x0--------------4/1 hvacUserInterfaceCfg.read(["displayOntime"], {"timeout":10000,"disableResponse":false,"disableRecovery":false,"disableDefaultResponse":true,"direction":0,"srcEndpoint":null,"reservedBits":0,"manufacturerCode":null,"transactionSequenceNumber":null,"writeUndiv":false}) failed (Status 'UNSUPPORTED_ATTRIBUTE')

@Koenkk
Copy link
Owner

Koenkk commented May 6, 2024

Could you do a console.log(device.customClusters) and see if the clusters are there? Could be that there is a race condition

@burmistrzak
Copy link
Contributor Author

Could you do a console.log(device.customClusters) and see if the clusters are there? Could be that there is a race condition

@Koenkk Here you go! 😊
I inserted console.log(device.customClusters) before reading the attributes in question.

zigbee2mqtt-1  | {
zigbee2mqtt-1  |   hvacThermostat: {
zigbee2mqtt-1  |     ID: 513,
zigbee2mqtt-1  |     manufacturerCode: undefined,
zigbee2mqtt-1  |     attributes: {
zigbee2mqtt-1  |       localTemp: [Object],
zigbee2mqtt-1  |       outdoorTemp: [Object],
zigbee2mqtt-1  |       occupancy: [Object],
zigbee2mqtt-1  |       absMinHeatSetpointLimit: [Object],
zigbee2mqtt-1  |       absMaxHeatSetpointLimit: [Object],
zigbee2mqtt-1  |       absMinCoolSetpointLimit: [Object],
zigbee2mqtt-1  |       absMaxCoolSetpointLimit: [Object],
zigbee2mqtt-1  |       pICoolingDemand: [Object],
zigbee2mqtt-1  |       pIHeatingDemand: [Object],
zigbee2mqtt-1  |       systemTypeConfig: [Object],
zigbee2mqtt-1  |       localTemperatureCalibration: [Object],
zigbee2mqtt-1  |       occupiedCoolingSetpoint: [Object],
zigbee2mqtt-1  |       occupiedHeatingSetpoint: [Object],
zigbee2mqtt-1  |       unoccupiedCoolingSetpoint: [Object],
zigbee2mqtt-1  |       unoccupiedHeatingSetpoint: [Object],
zigbee2mqtt-1  |       minHeatSetpointLimit: [Object],
zigbee2mqtt-1  |       maxHeatSetpointLimit: [Object],
zigbee2mqtt-1  |       minCoolSetpointLimit: [Object],
zigbee2mqtt-1  |       maxCoolSetpointLimit: [Object],
zigbee2mqtt-1  |       minSetpointDeadBand: [Object],
zigbee2mqtt-1  |       remoteSensing: [Object],
zigbee2mqtt-1  |       ctrlSeqeOfOper: [Object],
zigbee2mqtt-1  |       systemMode: [Object],
zigbee2mqtt-1  |       alarmMask: [Object],
zigbee2mqtt-1  |       runningMode: [Object],
zigbee2mqtt-1  |       startOfWeek: [Object],
zigbee2mqtt-1  |       numberOfWeeklyTrans: [Object],
zigbee2mqtt-1  |       numberOfDailyTrans: [Object],
zigbee2mqtt-1  |       tempSetpointHold: [Object],
zigbee2mqtt-1  |       tempSetpointHoldDuration: [Object],
zigbee2mqtt-1  |       programingOperMode: [Object],
zigbee2mqtt-1  |       runningState: [Object],
zigbee2mqtt-1  |       setpointChangeSource: [Object],
zigbee2mqtt-1  |       setpointChangeAmount: [Object],
zigbee2mqtt-1  |       setpointChangeSourceTimeStamp: [Object],
zigbee2mqtt-1  |       acType: [Object],
zigbee2mqtt-1  |       acCapacity: [Object],
zigbee2mqtt-1  |       acRefrigerantType: [Object],
zigbee2mqtt-1  |       acConpressorType: [Object],
zigbee2mqtt-1  |       acErrorCode: [Object],
zigbee2mqtt-1  |       acLouverPosition: [Object],
zigbee2mqtt-1  |       acCollTemp: [Object],
zigbee2mqtt-1  |       acCapacityFormat: [Object],
zigbee2mqtt-1  |       SinopeOccupancy: [Object],
zigbee2mqtt-1  |       SinopeMainCycleOutput: [Object],
zigbee2mqtt-1  |       SinopeBacklight: [Object],
zigbee2mqtt-1  |       SinopeAuxCycleOutput: [Object],
zigbee2mqtt-1  |       StelproSystemMode: [Object],
zigbee2mqtt-1  |       StelproOutdoorTemp: [Object],
zigbee2mqtt-1  |       viessmannWindowOpenInternal: [Object],
zigbee2mqtt-1  |       viessmannWindowOpenForce: [Object],
zigbee2mqtt-1  |       viessmannAssemblyMode: [Object],
zigbee2mqtt-1  |       schneiderWiserSpecific: [Object],
zigbee2mqtt-1  |       danfossWindowOpenInternal: [Object],
zigbee2mqtt-1  |       danfossWindowOpenExternal: [Object],
zigbee2mqtt-1  |       danfossDayOfWeek: [Object],
zigbee2mqtt-1  |       danfossTriggerTime: [Object],
zigbee2mqtt-1  |       danfossMountedModeActive: [Object],
zigbee2mqtt-1  |       danfossMountedModeControl: [Object],
zigbee2mqtt-1  |       danfossThermostatOrientation: [Object],
zigbee2mqtt-1  |       danfossExternalMeasuredRoomSensor: [Object],
zigbee2mqtt-1  |       danfossRadiatorCovered: [Object],
zigbee2mqtt-1  |       danfossAlgorithmScaleFactor: [Object],
zigbee2mqtt-1  |       danfossHeatAvailable: [Object],
zigbee2mqtt-1  |       danfossHeatRequired: [Object],
zigbee2mqtt-1  |       danfossLoadBalancingEnable: [Object],
zigbee2mqtt-1  |       danfossLoadRoomMean: [Object],
zigbee2mqtt-1  |       danfossLoadEstimate: [Object],
zigbee2mqtt-1  |       danfossRegulationSetpointOffset: [Object],
zigbee2mqtt-1  |       danfossAdaptionRunControl: [Object],
zigbee2mqtt-1  |       danfossAdaptionRunStatus: [Object],
zigbee2mqtt-1  |       danfossAdaptionRunSettings: [Object],
zigbee2mqtt-1  |       danfossPreheatStatus: [Object],
zigbee2mqtt-1  |       danfossPreheatTime: [Object],
zigbee2mqtt-1  |       danfossWindowOpenFeatureEnable: [Object],
zigbee2mqtt-1  |       danfossRoomStatusCode: [Object],
zigbee2mqtt-1  |       danfossOutputStatus: [Object],
zigbee2mqtt-1  |       danfossRoomFloorSensorMode: [Object],
zigbee2mqtt-1  |       danfossFloorMinSetpoint: [Object],
zigbee2mqtt-1  |       danfossFloorMaxSetpoint: [Object],
zigbee2mqtt-1  |       elkoLoad: [Object],
zigbee2mqtt-1  |       elkoDisplayText: [Object],
zigbee2mqtt-1  |       elkoSensor: [Object],
zigbee2mqtt-1  |       elkoRegulatorTime: [Object],
zigbee2mqtt-1  |       elkoRegulatorMode: [Object],
zigbee2mqtt-1  |       elkoPowerStatus: [Object],
zigbee2mqtt-1  |       elkoDateTime: [Object],
zigbee2mqtt-1  |       elkoMeanPower: [Object],
zigbee2mqtt-1  |       elkoExternalTemp: [Object],
zigbee2mqtt-1  |       elkoNightSwitching: [Object],
zigbee2mqtt-1  |       elkoFrostGuard: [Object],
zigbee2mqtt-1  |       elkoChildLock: [Object],
zigbee2mqtt-1  |       elkoMaxFloorTemp: [Object],
zigbee2mqtt-1  |       elkoRelayState: [Object],
zigbee2mqtt-1  |       elkoVersion: [Object],
zigbee2mqtt-1  |       elkoCalibration: [Object],
zigbee2mqtt-1  |       elkoLastMessageId: [Object],
zigbee2mqtt-1  |       elkoLastMessageStatus: [Object],
zigbee2mqtt-1  |       fourNoksHysteresisHigh: [Object],
zigbee2mqtt-1  |       fourNoksHysteresisLow: [Object],
zigbee2mqtt-1  |       operatingMode: [Object],
zigbee2mqtt-1  |       windowDetection: [Object],
zigbee2mqtt-1  |       boostMode: [Object]
zigbee2mqtt-1  |     },
zigbee2mqtt-1  |     commands: {
zigbee2mqtt-1  |       setpointRaiseLower: [Object],
zigbee2mqtt-1  |       setWeeklySchedule: [Object],
zigbee2mqtt-1  |       getWeeklySchedule: [Object],
zigbee2mqtt-1  |       clearWeeklySchedule: [Object],
zigbee2mqtt-1  |       getRelayStatusLog: [Object],
zigbee2mqtt-1  |       danfossSetpointCommand: [Object],
zigbee2mqtt-1  |       schneiderWiserThermostatBoost: [Object],
zigbee2mqtt-1  |       wiserSmartSetSetpoint: [Object],
zigbee2mqtt-1  |       wiserSmartSetFipMode: [Object],
zigbee2mqtt-1  |       wiserSmartCalibrateValve: [Object],
zigbee2mqtt-1  |       plugwiseCalibrateValve: [Object],
zigbee2mqtt-1  |       boschCalibrateValve: [Object]
zigbee2mqtt-1  |     },
zigbee2mqtt-1  |     commandsResponse: { getWeeklyScheduleRsp: [Object], getRelayStatusLogRsp: [Object] }
zigbee2mqtt-1  |   },
zigbee2mqtt-1  |   hvacUserInterfaceCfg: {
zigbee2mqtt-1  |     ID: 516,
zigbee2mqtt-1  |     manufacturerCode: undefined,
zigbee2mqtt-1  |     attributes: {
zigbee2mqtt-1  |       tempDisplayMode: [Object],
zigbee2mqtt-1  |       keypadLockout: [Object],
zigbee2mqtt-1  |       programmingVisibility: [Object],
zigbee2mqtt-1  |       danfossViewingDirection: [Object],
zigbee2mqtt-1  |       childLock: [Object],
zigbee2mqtt-1  |       displayOntime: [Object],
zigbee2mqtt-1  |       displayBrightness: [Object]
zigbee2mqtt-1  |     },
zigbee2mqtt-1  |     commands: {},
zigbee2mqtt-1  |     commandsResponse: {}
zigbee2mqtt-1  |   }
zigbee2mqtt-1  | }
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	zh:controller:endpoint: ZCL command 0x0______________4/1 hvacUserInterfaceCfg.read(["displayOntime","displayBrightness"], {"timeout":10000,"disableResponse":false,"disableRecovery":false,"disableDefaultResponse":true,"direction":0,"srcEndpoint":null,"reservedBits":0,"manufacturerCode":4617,"transactionSequenceNumber":null,"writeUndiv":false})
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	zh:controller: Received payload: clusterID=516, address=15168, groupID=0, endpoint=1, destinationEndpoint=1, wasBroadcast=false, linkQuality=94, frame={"header":{"frameControl":{"frameType":0,"manufacturerSpecific":true,"direction":1,"disableDefaultResponse":true,"reservedBits":0},"manufacturerCode":4617,"transactionSequenceNumber":17,"commandIdentifier":1},"payload":[{"attrId":16442,"status":0,"dataType":48,"attrData":5},{"attrId":16443,"status":0,"dataType":48,"attrData":5}],"command":{"ID":1,"name":"readRsp","parameters":[{"name":"attrId","type":33},{"name":"status","type":32},{"name":"dataType","type":32,"conditions":[{"type":"statusEquals","value":0}]},{"name":"attrData","type":1000,"conditions":[{"type":"statusEquals","value":0}]}]}}
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	z2m: Received Zigbee message from '0x0______________4', type 'readResponse', cluster 'hvacUserInterfaceCfg', data '{"displayBrightness":5,"displayOntime":5}' from endpoint 1 with groupID 0
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	z2m: MQTT publish: topic 'zigbee2mqtt/0x0______________4', payload '{"child_lock":"UNLOCK","display_brightness":5,"display_ontime":5,"humidity":53.09,"keypad_lockout":"unlock","last_seen":"2024-05-06T21:10:19+02:00","linkquality":94,"local_temperature":21.9,"local_temperature_calibration":0,"occupied_cooling_setpoint":20,"occupied_heating_setpoint":5,"operating_mode":"manual","running_state":"idle","setpoint_change_source":"manual","system_mode":"heat","window_detection":"OFF"}'
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	zhc:setupattribute: Configure reporting: false, read: true for 0x0______________4/1 hvacThermostat [{"attribute":"operatingMode","min":-1,"max":-1,"change":-1}]
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	zh:controller:endpoint: ZCL command 0x0______________4/1 hvacThermostat.read(["operatingMode"], {"timeout":10000,"disableResponse":false,"disableRecovery":false,"disableDefaultResponse":true,"direction":0,"srcEndpoint":null,"reservedBits":0,"manufacturerCode":null,"transactionSequenceNumber":null,"writeUndiv":false})
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	zh:controller: Received payload: clusterID=513, address=15168, groupID=0, endpoint=1, destinationEndpoint=1, wasBroadcast=false, linkQuality=94, frame={"header":{"frameControl":{"frameType":0,"manufacturerSpecific":false,"direction":1,"disableDefaultResponse":true,"reservedBits":0},"manufacturerCode":null,"transactionSequenceNumber":18,"commandIdentifier":1},"payload":[{"attrId":16391,"status":134}],"command":{"ID":1,"name":"readRsp","parameters":[{"name":"attrId","type":33},{"name":"status","type":32},{"name":"dataType","type":32,"conditions":[{"type":"statusEquals","value":0}]},{"name":"attrData","type":1000,"conditions":[{"type":"statusEquals","value":0}]}]}}
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	zh:zstack:unpi:parser: --- parseNext []
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	z2m: Received Zigbee message from '0x0______________4', type 'readResponse', cluster 'hvacThermostat', data '{}' from endpoint 1 with groupID 0
zigbee2mqtt-1  | [2024-05-06 21:10:19] error: 	z2m: Exception while calling fromZigbee converter: Expected one of: 0, 1, 5, got: 'undefined'}
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	z2m: Error: Expected one of: 0, 1, 5, got: 'undefined'
zigbee2mqtt-1  |     at getFromLookupByValue (/app/node_modules/zigbee-herdsman-converters/src/lib/utils.ts:593:15)
zigbee2mqtt-1  |     at Object.convert (/app/node_modules/zigbee-herdsman-converters/src/lib/modernExtend.ts:1524:64)
zigbee2mqtt-1  |     at Receive.onDeviceMessage (/app/lib/extension/receive.ts:153:51)
zigbee2mqtt-1  |     at EventEmitter.wrappedCallback (/app/lib/eventBus.ts:174:17)
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	z2m: MQTT publish: topic 'zigbee2mqtt/0x0______________4', payload '{"child_lock":"UNLOCK","display_brightness":5,"display_ontime":5,"humidity":53.09,"keypad_lockout":"unlock","last_seen":"2024-05-06T21:10:19+02:00","linkquality":94,"local_temperature":21.9,"local_temperature_calibration":0,"occupied_cooling_setpoint":20,"occupied_heating_setpoint":5,"operating_mode":"manual","running_state":"idle","setpoint_change_source":"manual","system_mode":"heat","window_detection":"OFF"}'
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	zh:controller:endpoint: ZCL command 0x0______________4/1 hvacThermostat.read(["operatingMode"], {"timeout":10000,"disableResponse":false,"disableRecovery":false,"disableDefaultResponse":true,"direction":0,"srcEndpoint":null,"reservedBits":0,"manufacturerCode":null,"transactionSequenceNumber":null,"writeUndiv":false}) failed (Status 'UNSUPPORTED_ATTRIBUTE')
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	zhc:setupattribute: Reading attribute failed: Error: ZCL command 0x0______________4/1 hvacThermostat.read(["operatingMode"], {"timeout":10000,"disableResponse":false,"disableRecovery":false,"disableDefaultResponse":true,"direction":0,"srcEndpoint":null,"reservedBits":0,"manufacturerCode":null,"transactionSequenceNumber":null,"writeUndiv":false}) failed (Status 'UNSUPPORTED_ATTRIBUTE')
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	zhc:setupattribute: Configure reporting: false, read: true for 0x0______________4/1 hvacThermostat [{"attribute":"windowDetection","min":-1,"max":-1,"change":-1}]
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	zh:controller:endpoint: ZCL command 0x0______________4/1 hvacThermostat.read(["windowDetection"], {"timeout":10000,"disableResponse":false,"disableRecovery":false,"disableDefaultResponse":true,"direction":0,"srcEndpoint":null,"reservedBits":0,"manufacturerCode":null,"transactionSequenceNumber":null,"writeUndiv":false})
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	zh:controller: Received payload: clusterID=513, address=15168, groupID=0, endpoint=1, destinationEndpoint=1, wasBroadcast=false, linkQuality=98, frame={"header":{"frameControl":{"frameType":0,"manufacturerSpecific":false,"direction":1,"disableDefaultResponse":true,"reservedBits":0},"manufacturerCode":null,"transactionSequenceNumber":19,"commandIdentifier":1},"payload":[{"attrId":16450,"status":134}],"command":{"ID":1,"name":"readRsp","parameters":[{"name":"attrId","type":33},{"name":"status","type":32},{"name":"dataType","type":32,"conditions":[{"type":"statusEquals","value":0}]},{"name":"attrData","type":1000,"conditions":[{"type":"statusEquals","value":0}]}]}}
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	zh:zstack:unpi:parser: --- parseNext []
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	z2m: Received Zigbee message from '0x0______________4', type 'readResponse', cluster 'hvacThermostat', data '{}' from endpoint 1 with groupID 0
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	z2m: MQTT publish: topic 'zigbee2mqtt/0x0______________4', payload '{"child_lock":"UNLOCK","display_brightness":5,"display_ontime":5,"humidity":53.09,"keypad_lockout":"unlock","last_seen":"2024-05-06T21:10:19+02:00","linkquality":98,"local_temperature":21.9,"local_temperature_calibration":0,"occupied_cooling_setpoint":20,"occupied_heating_setpoint":5,"operating_mode":"manual","running_state":"idle","setpoint_change_source":"manual","system_mode":"heat","window_detection":"OFF"}'
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	zh:controller:endpoint: ZCL command 0x0______________4/1 hvacThermostat.read(["windowDetection"], {"timeout":10000,"disableResponse":false,"disableRecovery":false,"disableDefaultResponse":true,"direction":0,"srcEndpoint":null,"reservedBits":0,"manufacturerCode":null,"transactionSequenceNumber":null,"writeUndiv":false}) failed (Status 'UNSUPPORTED_ATTRIBUTE')
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	zhc:setupattribute: Reading attribute failed: Error: ZCL command 0x0______________4/1 hvacThermostat.read(["windowDetection"], {"timeout":10000,"disableResponse":false,"disableRecovery":false,"disableDefaultResponse":true,"direction":0,"srcEndpoint":null,"reservedBits":0,"manufacturerCode":null,"transactionSequenceNumber":null,"writeUndiv":false}) failed (Status 'UNSUPPORTED_ATTRIBUTE')
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	zhc:setupattribute: Configure reporting: false, read: true for 0x0______________4/1 hvacUserInterfaceCfg [{"attribute":"childLock","min":-1,"max":-1,"change":-1}]
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	zh:controller:endpoint: ZCL command 0x0______________4/1 hvacUserInterfaceCfg.read(["childLock"], {"timeout":10000,"disableResponse":false,"disableRecovery":false,"disableDefaultResponse":true,"direction":0,"srcEndpoint":null,"reservedBits":0,"manufacturerCode":null,"transactionSequenceNumber":null,"writeUndiv":false})
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	zh:controller: Received payload: clusterID=516, address=15168, groupID=0, endpoint=1, destinationEndpoint=1, wasBroadcast=false, linkQuality=94, frame={"header":{"frameControl":{"frameType":0,"manufacturerSpecific":false,"direction":1,"disableDefaultResponse":true,"reservedBits":0},"manufacturerCode":null,"transactionSequenceNumber":20,"commandIdentifier":1},"payload":[{"attrId":1,"status":0,"dataType":48,"attrData":0}],"command":{"ID":1,"name":"readRsp","parameters":[{"name":"attrId","type":33},{"name":"status","type":32},{"name":"dataType","type":32,"conditions":[{"type":"statusEquals","value":0}]},{"name":"attrData","type":1000,"conditions":[{"type":"statusEquals","value":0}]}]}}
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	zh:zstack:unpi:parser: --- parseNext []
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	z2m: Received Zigbee message from '0x0______________4', type 'readResponse', cluster 'hvacUserInterfaceCfg', data '{"keypadLockout":0}' from endpoint 1 with groupID 0
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	z2m: MQTT publish: topic 'zigbee2mqtt/0x0______________4', payload '{"child_lock":"UNLOCK","display_brightness":5,"display_ontime":5,"humidity":53.09,"keypad_lockout":"unlock","last_seen":"2024-05-06T21:10:19+02:00","linkquality":94,"local_temperature":21.9,"local_temperature_calibration":0,"occupied_cooling_setpoint":20,"occupied_heating_setpoint":5,"operating_mode":"manual","running_state":"idle","setpoint_change_source":"manual","system_mode":"heat","window_detection":"OFF"}'
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	zhc:setupattribute: Configure reporting: false, read: true for 0x0______________4/1 hvacUserInterfaceCfg [{"attribute":"displayOntime","min":-1,"max":-1,"change":-1}]
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	zh:controller:endpoint: ZCL command 0x0______________4/1 hvacUserInterfaceCfg.read(["displayOntime"], {"timeout":10000,"disableResponse":false,"disableRecovery":false,"disableDefaultResponse":true,"direction":0,"srcEndpoint":null,"reservedBits":0,"manufacturerCode":null,"transactionSequenceNumber":null,"writeUndiv":false})
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	zh:controller: Received payload: clusterID=516, address=15168, groupID=0, endpoint=1, destinationEndpoint=1, wasBroadcast=false, linkQuality=94, frame={"header":{"frameControl":{"frameType":0,"manufacturerSpecific":false,"direction":1,"disableDefaultResponse":true,"reservedBits":0},"manufacturerCode":null,"transactionSequenceNumber":21,"commandIdentifier":1},"payload":[{"attrId":16442,"status":134}],"command":{"ID":1,"name":"readRsp","parameters":[{"name":"attrId","type":33},{"name":"status","type":32},{"name":"dataType","type":32,"conditions":[{"type":"statusEquals","value":0}]},{"name":"attrData","type":1000,"conditions":[{"type":"statusEquals","value":0}]}]}}
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	zh:zstack:unpi:parser: --- parseNext []
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	z2m: Received Zigbee message from '0x0______________4', type 'readResponse', cluster 'hvacUserInterfaceCfg', data '{}' from endpoint 1 with groupID 0
zigbee2mqtt-1  | [2024-05-06 21:10:19] error: 	z2m: Exception while calling fromZigbee converter: Value is not a number, got undefined (undefined)}
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	z2m: Error: Value is not a number, got undefined (undefined)
zigbee2mqtt-1  |     at assertNumber (/app/node_modules/zigbee-herdsman-converters/src/lib/utils.ts:548:65)
zigbee2mqtt-1  |     at Object.convert (/app/node_modules/zigbee-herdsman-converters/src/lib/modernExtend.ts:1601:29)
zigbee2mqtt-1  |     at Receive.onDeviceMessage (/app/lib/extension/receive.ts:153:51)
zigbee2mqtt-1  |     at EventEmitter.wrappedCallback (/app/lib/eventBus.ts:174:17)
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	z2m: MQTT publish: topic 'zigbee2mqtt/0x0______________4', payload '{"child_lock":"UNLOCK","display_brightness":5,"display_ontime":5,"humidity":53.09,"keypad_lockout":"unlock","last_seen":"2024-05-06T21:10:19+02:00","linkquality":94,"local_temperature":21.9,"local_temperature_calibration":0,"occupied_cooling_setpoint":20,"occupied_heating_setpoint":5,"operating_mode":"manual","running_state":"idle","setpoint_change_source":"manual","system_mode":"heat","window_detection":"OFF"}'
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	zh:controller:endpoint: ZCL command 0x0______________4/1 hvacUserInterfaceCfg.read(["displayOntime"], {"timeout":10000,"disableResponse":false,"disableRecovery":false,"disableDefaultResponse":true,"direction":0,"srcEndpoint":null,"reservedBits":0,"manufacturerCode":null,"transactionSequenceNumber":null,"writeUndiv":false}) failed (Status 'UNSUPPORTED_ATTRIBUTE')
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	zhc:setupattribute: Reading attribute failed: Error: ZCL command 0x0______________4/1 hvacUserInterfaceCfg.read(["displayOntime"], {"timeout":10000,"disableResponse":false,"disableRecovery":false,"disableDefaultResponse":true,"direction":0,"srcEndpoint":null,"reservedBits":0,"manufacturerCode":null,"transactionSequenceNumber":null,"writeUndiv":false}) failed (Status 'UNSUPPORTED_ATTRIBUTE')
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	zhc:setupattribute: Configure reporting: false, read: true for 0x0______________4/1 hvacUserInterfaceCfg [{"attribute":"displayBrightness","min":-1,"max":-1,"change":-1}]
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	zh:controller:endpoint: ZCL command 0x0______________4/1 hvacUserInterfaceCfg.read(["displayBrightness"], {"timeout":10000,"disableResponse":false,"disableRecovery":false,"disableDefaultResponse":true,"direction":0,"srcEndpoint":null,"reservedBits":0,"manufacturerCode":null,"transactionSequenceNumber":null,"writeUndiv":false})
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	zh:controller: Received payload: clusterID=516, address=15168, groupID=0, endpoint=1, destinationEndpoint=1, wasBroadcast=false, linkQuality=94, frame={"header":{"frameControl":{"frameType":0,"manufacturerSpecific":false,"direction":1,"disableDefaultResponse":true,"reservedBits":0},"manufacturerCode":null,"transactionSequenceNumber":22,"commandIdentifier":1},"payload":[{"attrId":16443,"status":134}],"command":{"ID":1,"name":"readRsp","parameters":[{"name":"attrId","type":33},{"name":"status","type":32},{"name":"dataType","type":32,"conditions":[{"type":"statusEquals","value":0}]},{"name":"attrData","type":1000,"conditions":[{"type":"statusEquals","value":0}]}]}}
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	zh:zstack:unpi:parser: --- parseNext []
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	z2m: Received Zigbee message from '0x0______________4', type 'readResponse', cluster 'hvacUserInterfaceCfg', data '{}' from endpoint 1 with groupID 0
zigbee2mqtt-1  | [2024-05-06 21:10:19] error: 	z2m: Exception while calling fromZigbee converter: Value is not a number, got undefined (undefined)}
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	z2m: Error: Value is not a number, got undefined (undefined)
zigbee2mqtt-1  |     at assertNumber (/app/node_modules/zigbee-herdsman-converters/src/lib/utils.ts:548:65)
zigbee2mqtt-1  |     at Object.convert (/app/node_modules/zigbee-herdsman-converters/src/lib/modernExtend.ts:1601:29)
zigbee2mqtt-1  |     at Receive.onDeviceMessage (/app/lib/extension/receive.ts:153:51)
zigbee2mqtt-1  |     at EventEmitter.wrappedCallback (/app/lib/eventBus.ts:174:17)
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	z2m: MQTT publish: topic 'zigbee2mqtt/0x0______________4', payload '{"child_lock":"UNLOCK","display_brightness":5,"display_ontime":5,"humidity":53.09,"keypad_lockout":"unlock","last_seen":"2024-05-06T21:10:19+02:00","linkquality":94,"local_temperature":21.9,"local_temperature_calibration":0,"occupied_cooling_setpoint":20,"occupied_heating_setpoint":5,"operating_mode":"manual","running_state":"idle","setpoint_change_source":"manual","system_mode":"heat","window_detection":"OFF"}'
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	zh:controller:endpoint: ZCL command 0x0______________4/1 hvacUserInterfaceCfg.read(["displayBrightness"], {"timeout":10000,"disableResponse":false,"disableRecovery":false,"disableDefaultResponse":true,"direction":0,"srcEndpoint":null,"reservedBits":0,"manufacturerCode":null,"transactionSequenceNumber":null,"writeUndiv":false}) failed (Status 'UNSUPPORTED_ATTRIBUTE')
zigbee2mqtt-1  | [2024-05-06 21:10:19] debug: 	zhc:setupattribute: Reading attribute failed: Error: ZCL command 0x0______________4/1 hvacUserInterfaceCfg.read(["displayBrightness"], {"timeout":10000,"disableResponse":false,"disableRecovery":false,"disableDefaultResponse":true,"direction":0,"srcEndpoint":null,"reservedBits":0,"manufacturerCode":null,"transactionSequenceNumber":null,"writeUndiv":false}) failed (Status 'UNSUPPORTED_ATTRIBUTE')
zigbee2mqtt-1  | [2024-05-06 21:10:19] info: 	z2m: Successfully configured '0x0______________4'

@Koenkk
Copy link
Owner

Koenkk commented May 6, 2024

The manufacturer code is missing from the custom cluster definition, try with: displayOntime: {ID: 0x403a, type: Zcl.DataType.ENUM8, manufacturerCode: Zcl.ManufacturerCode.ROBERT_BOSCH_GMBH},

@burmistrzak
Copy link
Contributor Author

The manufacturer code is missing from the custom cluster definition, try with: displayOntime: {ID: 0x403a, type: Zcl.DataType.ENUM8, manufacturerCode: Zcl.ManufacturerCode.ROBERT_BOSCH_GMBH},

@Koenkk That was it! 🙌
Do I still need to specify manufacturerOptions when e.g. reading a custom cluster attribute, that already has manufacturerCode set?

@Koenkk
Copy link
Owner

Koenkk commented May 7, 2024

No, zigbee-herdsman should use it automatically

@burmistrzak
Copy link
Contributor Author

No, zigbee-herdsman should use it automatically

Thx, good to know! ✌️

What do you think about consolidating custom clusters, shared among different devices from the same manufacturer, into a single constant? Would that work/make sense?

@Koenkk
Copy link
Owner

Koenkk commented May 7, 2024

Yes, you can take Ubisys as an example:

export const ubisysModernExtend = {

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

BTH-RM230Z - Missing Cooling Mode
2 participants