Bosch BSIR-EZ (Outdoor siren): Re-implement the device from scratch#9987
Merged
Koenkk merged 3 commits intoKoenkk:masterfrom Sep 12, 2025
Merged
Conversation
Owner
|
Thanks! |
This was referenced Sep 15, 2025
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This pull request re-implements the support for the Bosch Outdoor siren (also known as
BSIR-EZ) from scratch. The old implementation wasn't complete, in my opinion (e.g., noconvert/fromZigbeemethod for a lot of attributes which is pretty confusing, using attribute IDs instead of proper naming, exposing a lot of unsupported options, ...) and didn't follow the usage patterns the native Bosch solution does (e.g., exposingstartWarningfrom thessIasWdcluster, which is only used by Bosch for demoing the siren volume during first setup and ignores some of the device settings).I also experienced that the new implementation solves a lot of the issues people experience when adding the device to Z2M (for example: Koenkk/zigbee2mqtt#28525, Koenkk/zigbee2mqtt#28088, Koenkk/zigbee2mqtt#27544 and Koenkk/zigbee2mqtt#27029). It looks like the device doesn't like the unbinding of the
genPollCtrlcluster in the interview stage, as I needed multiple adding/interviewing attempts before removing that code as well. I honestly have no idea why it's there in the first place, the same with them.quirkCheckinInterval(0)call. To me, both of these seem to do more harm than they solve, which is why I don't bother investigating the reason behind them any further.This is a changelog for affected users
solar_panelactivated theac_power_supplymode in the device, selectingac_power_supplyactivated thedc_power_supplymode in the device and selectingdc_power_supplyresulted in an error as it send an invalid value to the device. Please check the selected power source after the update and correct it (if needed).alarm_statethat shows if the device has really turned on the siren and/or light. Warning: This is different from the previous attribute with the same name, which was used to start and stop the alarm! This functionality can now be found in thetrigger_alarmandstop_alarmattributes, as there is no way to tell if the alarm is already being triggered or not, which makes an off/on slider the wrong UI element for in my opinion (alarm_statewill showno_active_alarmwhen the device waits for the delay time of the siren/light to expire).current_power_sourcethat shows where the siren currently draws their power from.power_outageattribute that will show if the primary power source experiences an outage. This only works when usingac_power_supplyordc_power_supplyas the primary power source.solar_panel_voltagethat shows how much voltage the device currently receives from the solar panel.genPowerCfgcluster only to support the native battery handling by Z2M / HA. Some notes regarding this change:1.) The remaining battery percentage is now pulled from the device instead of being calculated locally based on the voltage. In my testing, the
genPowerCfgpercentage takes a lot more into consideration than just the voltage (I experienced a drop in battery percentage, although the voltage didn't change).2.) The
battery_lowwarning is more sensitive than before (being true when the remaining battery is <= 60%, which is reasonable in my opinion, keeping the huge power draw during an alarm in mind).3.) The battery voltage is removed, as Bosch don't use them internally, and I don't want to kill the battery by reporting more attributes than needed.
tamperalarm by default. It has to be reset over a Bosch-specific command in thessIasZonecluster to deactivate the alarm. As this wasn't provided by the old implementation, there was no clear way to handle the situation except to "deal with it". In the native Bosch implementation, each change message from thessIasZoneis acknowledged with the Bosch-specific command (iftamperis true oralarm_2, which is thepower_outageattribute in my implementation). If the problem is resolved, the device sends a second change message afterward with the alarm being deactivated. I mimic that behavior, which means that alarms regarding thetamperandpower_outageattributes resolve automatically when the tamper-switch is being pressed again, respectively the power from the network comes back. Please take that into consideration when updating your automations/scripts.ac_statusandtestattributes, as these are just dead and provide no functionality.stopandburglarmodes (which is just a few of the provided options) anyway.Screenshot from the expose tab before and after the change
Before
After