-
Notifications
You must be signed in to change notification settings - Fork 2.8k
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
BTH-RM230Z - Missing Cooling Mode #7357
Comments
@l3rdy 👋 |
I've seen your work. 😁 I also tried looking in as much as I can, but my knowledge is limited when it comes to the deep end of this. I will happily contribute with some Help. I would absolutely love to try to fix it. |
Honestly, easiest thing is just editing the Edit: You can try adding |
ahhh I see. Awesome. Will try :) |
Have fun! Also see my edit for some unseful hints. 😉 |
Ahh. I Should've looked at your comment earlier. (Would've known I'm on the right track then) I also looked at the converter after seeing your edits and added the mode there.. Tho, I'm not sure if that did anything yet. It exposes everything I need, I can control the Cooling Temperature on the Device I reset and put into cooling mode. After I toggle everything, the Device always returns to Heat System Mode in Z2MQTT and the running state also changes to Heat, but when refreshing the State changes back to cool. I suppose that might be the Issue? When I look in the Dev console, I get: |
Just a little Update with following in the Dev console, I can actually change between Heating & Cooling
It successfully switches on the Device So it actually isn't a opMode
actually is more like
and you switch with the ctrlSeqeOfOper |
@l3rdy Just did my first bit of research on the device.
As you can see, Regarding
And
|
Enabling manufacturer-specific clusters is the worst mistake the Zigbee Alliance has ever made, it's effectively hurting the entire Zigbee ecosystem. 99% of use-cases and device types are already covered by ZCL, there's no reason to reinvent the wheel, except turning your devices into e-waste in case you have the wrong bridge. Edit: @l3rdy Obviously, this little rant wasn't directed at you. I'm just amazed by the amount of work that gets done, simply to ensure products aren't interoperable. 🙃 |
Sorry for leaving you in the dark for a bit. I have the following configs that kinda work rn bosch_thermostat: {
cluster: 'hvacThermostat',
type: ['attributeReport', 'readResponse'],
convert: (model, msg, publish, options, meta) => {
const result = {};
const data = msg.data;
if (data.hasOwnProperty(0x4040)) {
result.remote_temperature = utils.precisionRound(data[0x4040] / 100, 1);
}
if (data.hasOwnProperty(0x4042)) {
result.window_detection = (Object.keys(stateOffOn)[data[0x4042]]);
}
if (data.hasOwnProperty(0x4043)) {
result.boost = (Object.keys(stateOffOn)[data[0x4043]]);
}
//if (data.hasOwnProperty(0x4007)) {
// const opModes = { 0: 'auto', 1: 'heat', 2: 'unknown_2', 3: 'unknown_3', 4: 'unknown_4', 5: 'off' };
// result.system_mode = opModes[data[0x4007]];
//}
//if (data.hasOwnProperty(0x4020)) {
// const demand = data[0x4020];
// result.pi_heating_demand = demand;
// result.running_state = demand > 0 ? 'heat' : 'idle';
//}
if (data.hasOwnProperty(0x4022)) {
result.valve_adapt_status = utils.getFromLookupByValue(data[0x4022], adaptationStatus);
if (data[0x4022] === adaptationStatus.calibration_in_progress) {
result.valve_adapt_process = true;
}
else {
result.valve_adapt_process = false;
}
}
return result;
} {
zigbeeModel: ['RBSH-RTH0-ZB-EU'],
model: 'BTH-RM230Z',
vendor: 'Bosch',
description: 'Room thermostat II 230V',
fromZigbee: [
fromZigbee_1.default.humidity,
fromZigbee_1.default.thermostat,
fzLocal.bosch_thermostat,
fzLocal.bosch_userInterface,
],
toZigbee: [
toZigbee_1.default.thermostat_occupied_heating_setpoint,
toZigbee_1.default.thermostat_control_sequence_of_operation,
toZigbee_1.default.thermostat_occupied_cooling_setpoint,
toZigbee_1.default.thermostat_local_temperature_calibration,
toZigbee_1.default.thermostat_local_temperature,
toZigbee_1.default.thermostat_keypad_lockout,
toZigbee_1.default.thermostat_running_state,
tzLocal.bosch_thermostat,
tzLocal.bosch_userInterface,
],
exposes: [
e.climate()
.withLocalTemperature()
.withSetpoint('occupied_heating_setpoint', 5, 30, 0.5)
.withSetpoint('occupied_cooling_setpoint', 5, 30, 0.5)
.withLocalTemperatureCalibration(-12, 12, 0.5)
.withSystemMode(['off', 'heat', 'cool', 'auto'])
.withRunningState(['idle', 'heat', 'cool'], ea.STATE_GET)
.withControlSequenceOfOperation(['cooling_only', 'heating_only'], ea.ALL),
e.humidity(),
e.binary('boost', ea.ALL, 'ON', 'OFF').withDescription('Activate Boost heating'),
e.binary('window_detection', ea.ALL, 'ON', 'OFF').withDescription('Window open'),
e.child_lock().setAccess('state', ea.ALL),
e.numeric('display_ontime', ea.ALL).withValueMin(5).withValueMax(30).withDescription('Specifies the display On-time'),
e.numeric('display_brightness', ea.ALL).withValueMin(0).withValueMax(10).withDescription('Specifies the brightness value of the display'),
e.enum('setpoint_change_source', ea.STATE, Object.keys(setpointSource))
.withDescription('States where the current setpoint originated'),
//e.enum('valve_adapt_status', ea.STATE, Object.keys(adaptationStatus))
// .withLabel('Adaptation status')
// .withDescription('Specifies the current status of the valve adaptation')
// .withCategory('diagnostic'),
//e.binary('valve_adapt_process', ea.ALL, true, false)
// .withLabel('Trigger adaptation process')
// .withDescription('Trigger the valve adaptation process. Only possible when adaptation status ' +
// 'is "ready_to_calibrate" or "error".')
// .withCategory('config'),
],
configure: async (device, coordinatorEndpoint, logger) => {
const endpoint = device.getEndpoint(1);
await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'hvacThermostat', 'hvacUserInterfaceCfg', 'msRelativeHumidity']);
await reporting.thermostatOccupiedHeatingSetpoint(endpoint);
//await reporting.thermostatOccupiedCoolingSetpoint(endpoint); //maybe not neeeded
await reporting.thermostatTemperature(endpoint);
await reporting.thermostatKeypadLockMode(endpoint);
await reporting.humidity(endpoint);
// Report setpoint_change_source
await endpoint.configureReporting('hvacThermostat', [{
attribute: 'setpointChangeSource',
minimumReportInterval: 0,
maximumReportInterval: constants.repInterval.HOUR * 12,
reportableChange: null,
}]);
// report operating_mode (system_mode)
await endpoint.configureReporting('hvacThermostat', [{
attribute: { ID: 0x4007, type: zigbee_herdsman_1.Zcl.DataType.enum8 },
minimumReportInterval: 0,
maximumReportInterval: constants.repInterval.HOUR,
reportableChange: 1,
}], manufacturerOptions);
// report pi_heating_demand (valve opening)
await endpoint.configureReporting('hvacThermostat', [{
attribute: { ID: 0x4020, type: zigbee_herdsman_1.Zcl.DataType.enum8 },
minimumReportInterval: 0,
maximumReportInterval: constants.repInterval.HOUR,
reportableChange: 1,
}], manufacturerOptions);
// report window_detection
await endpoint.configureReporting('hvacThermostat', [{
attribute: { ID: 0x4042, type: zigbee_herdsman_1.Zcl.DataType.enum8 },
minimumReportInterval: 0,
maximumReportInterval: constants.repInterval.HOUR,
reportableChange: 1,
}], manufacturerOptions);
//// Report valve_adapt_status (adaptation status)
//await endpoint.configureReporting('hvacThermostat', [{
// attribute: { ID: 0x4022, type: zigbee_herdsman_1.Zcl.DataType.enum8 },
// minimumReportInterval: 0,
// maximumReportInterval: constants.repInterval.HOUR * 12,
// reportableChange: null,
// }], manufacturerOptions);
// report boost as it's disabled by thermostat after 5 minutes
await endpoint.configureReporting('hvacThermostat', [{
attribute: { ID: 0x4043, type: zigbee_herdsman_1.Zcl.DataType.enum8 },
minimumReportInterval: 0,
maximumReportInterval: constants.repInterval.HOUR,
reportableChange: 1,
}], manufacturerOptions);
await endpoint.read('hvacThermostat', ['localTemperatureCalibration', 'setpointChangeSource']);
await endpoint.read('hvacThermostat', [0x4007, 0x4020, 0x4042, 0x4043], manufacturerOptions);
//await endpoint.read('hvacThermostat', [0x4007, 0x4020, 0x4022, 0x4042, 0x4043], manufacturerOptions);
await endpoint.read('hvacUserInterfaceCfg', ['keypadLockout']);
await endpoint.read('hvacUserInterfaceCfg', [0x403a, 0x403b], manufacturerOptions);
},
}, With this, going into the DEV Console and writing the System Mode 0 turns it off/pauses it One thing that's now not working anymore is the |
@l3rdy No worries! Looks promising. |
@l3rdy There you go, fresh from the packet dump. Sniffed values for
Sniffed values for
Also, |
All in all, the current I'll probably write a dedicated converter, we'll see. 😉 |
ahh yeah.. I feared and figured it would be quite some work and probably not really possible without sniffing and going deep haha Thanks for your Work @burmistrzak !! |
I'll have something for you to try, in just a bit. |
@l3rdy Give this a shot: master...burmistrzak:zigbee-herdsman-converters:improve-bth-rm230z |
Just added the missing |
Already on It :) |
I really hope, selectively overriding default clusters by specifying a |
yeah, it seems like it doesn't work. The container Always crashes and pulls a new Image. I used your config and kept those now and now it works. 🤔
|
Can you try removing the line with Edit: Make sure to copy the parts from |
I uncommented the |
Great! Would be great to have some screenshots or similar to verify the behavior in the UI. |
Okay so operating modes don't properly work yet. I can do them on the device and I can see in the State Tab it reports following manual works and highlights the exposed button (I can't change it to manual in the UI only on the device)
And the Auto Mode in general doesn't work.
EDIT: To make it clear, the Running State works and exposes the right stuff. But when trying to refresh the running_state I occasionally get the error for some reason I also just tried Window detection and Boost and both give me errors but tbh I never used it nor did it probably ever work
I hope I just didnt fuck up something 🤔😅 |
It's TypeScript, so you'll have to fix the imports manually. |
Oh my.. Im too tired I think. Very sorry for that.
These are all the errors I'm getting. I hope I didn't mess anything up again. I'll leave them here and will look at it late again again |
@l3rdy Just finished my PR utilizing |
Lovely, I'll take a look :) |
I seem to missing something here. I just can't get it to run 😅
|
Hmm, I'd recommend pulling the PR commit, compile TypeScript to JS, and build a custom container image. Alternatively, just compile to JavaScript and replace the |
Yeah, not really sure what happened there. Few things (you probably already know, looking at your PR) Operating mode works when changing on the Device, exposed buttons light up etc.
The same goes for Child Lock.
Then for the following there's no Button on the Device, and they cannot be set (used to work before, including Child Lock)Boost option is missing entirely. Display Ontime
Display Brightness
Window Detection
Everything else is working. Especially the |
Yea, likely because
Woops. 😅
In theory, but I'm not really comfortable with falsely exposing |
Regarding Boost Mode, this doesn't seem to do anything for underfloor heating. Yes, it lights up red for a moment, but that's it. 👀 |
Well there you go. They fooled me 😅 So what is their Auto Mode actually doing? I guess just for their App where you can set schedules.. but we are not able to do that here right? Regarding Boost. Also, interesting.. I already wondered how that would even Work haha |
Yep,
Yeah, doesn't make much sense for this specific model. 😊 |
🥳
I'll investigate. 🔬 |
Hmm.. Does it make sense or is it possible to not expose |
Ohh.. that would be quite nice.. tho I think its not as useful as it sounds and looks quite complex haha |
You mean
Certainly possible. What do you think about |
Honestly, I'm not sure what I actually meant or found confusing at that moment. I think I just got something twisted in my mind haha However,
Yeah, I'm just thinking (especially since I also use Home Assistant) I would only use the |
Well, both commands work equally good, AFAIK. ✌️ Can you elaborate a bit? What problems exactly? |
Well just when you turn it to Or when going from When doing everything over But the only way to have the Device do what you want it to do and have everything report correctly in Z2MQTT is to go
EDIT: I've just seen you updated your PR. now it called Pause. |
Have you tried manually refreshing 🔄 the reported |
@l3rdy Updated PR is ready. 😊 |
Oh I just uploaded a Video showcasing it haha Ill take a look |
So nothing changed besides the renames When trying to reconfigure, I get following
A (new and longer Video) to showcase what's going on. The Editor.54.mp4 |
@l3rdy Thanks for all the details! I'm on it. 🤝 Don't worry though, you and I will continue bug hunting. 🐛 |
When a new dev build is available, just update Z2M, and give it a try. |
Thank you so much @burmistrzak ! If I encounter some stuff, I'll guess I'd make a new Issue since Cooling Mode (Most likely) is done!? :) |
We're all just doing our part to keep homes smart & open. 🫡😊
Please do! 👌 |
The same goes for the BTH-RM - Room thermostat II (Battery model). I don't have one but looking at the Manual it also should have a Cooling Mode.
I got the Bosch Room Thermostat II (230V) and I noticed there's no option for switching to cooling mode currently.
When factory resetting the Device and setting it up without a connection, I can choose between Cooling or Heating on the Device, but it doesn't expose the Mode nor does it let me switch it in Z2MQTT.
I can see the correct running state & cooling setpoint when changing it on the Device (since I can't change it in Z2MQTT)
EDIT: To give a bit more context (if needed)
There are a few Different Operation Modes and how you can run it.
A short excerpt from the Manual
"In the event that an initial start-up is required without
a Smart Home system (e.g. new build), basic settings
can be made on the device via an installer mode.
To this end, press and hold the rotary knob for
at least 3 seconds until the display shows “INS”. By
turning the knob you can make a selection and
confirm the selection by pressing it."
Once you manually set it, you're locked in and can only change the temperature (Basically). With the Bosch Smart Home Controller, you can change between the Operation Modes (not necessarily relevant here) and between Cooling/Heating, which unfortunately is not possible on the device itself. (Only has Status LEDs)
The text was updated successfully, but these errors were encountered: