Koenkk / zigbee2mqtt

Zigbee 🐝 to MQTT bridge 🌉, get rid of your proprietary Zigbee bridges 🔨
https://www.zigbee2mqtt.io
GNU General Public License v3.0
11.56k stars 1.63k forks source link

[New device support]: Bosch Outdoor Siren #13520

Closed safakaltun closed 1 year ago

safakaltun commented 1 year ago

Link

https://www.bosch-smarthome.com/uk/en/products/devices/outdoor-siren/

Database entry

{"id":66,"type":"Unknown","ieeeAddr":"0x003c84fffeeda00b","nwkAddr":29598,"epList":[],"endpoints":{},"interviewCompleted":false,"meta":{},"lastSeen":1660330204622,"defaultSendRequestWhen":"immediate"}

Comments

I would like to add support for this device, but I got stuck in the pairing phase. Although the device starts pairing, it cannot complete the interview. Pairing with the original hub was done using the QR code on the back of the siren, which contains the IEEE link key. I am not sure if it has anything to do with it or not.

I factory reset the device numerous times with no help. I also tried pairing it in both legacy and "smart home controller" modes which is set by the PIN 8 behind the siren.

Attaching the herdsman logs as well. I am not sure if the length of the log is enough, but the device more or less runs in a loop where z2m tries interviewing, interview fails and starts over again.

herdsman.log

External converter

No response

Supported color modes

No response

Color temperature range

No response

danieledwardgeorgehitchcock commented 1 year ago

Just to confirm, I have recently purchased this siren to try and integrate into Z2M and am experiencing the same as you. It begins to pair, then seems to fail interview.

I have purchased a used Bosch Smart Home Controller to see if I can sniff what is going on with the interview - I am wondering if a key is exchanged given that you have to scan a QR code during adding

danieledwardgeorgehitchcock commented 1 year ago

So, I received the Smart Home Controller today and bound the siren to it. Points to note:

The app recommends that you switch off the siren and then switch it on before pairing

The light on the bottom of the siren turns Amber during interview, then green on success

The switches on the device have no effect in 'Smart Mode' apart from the actual Smart Mode switch 8

The app requires that you scan a QR code however, the device MAC address (labelled as Zigbee EUI-64) and an install code is also printed on the device - Could this be what is being searched for and exchanged during device pairing? Image below:

https://drive.google.com/file/d/1ax1r_NGis5ZkcVardm4UyZ-yIIDE22Tu/view?usp=sharing

I will sort out my sniffing setup and begin capturing device communication during adding to the controllers network

danieledwardgeorgehitchcock commented 1 year ago

Ok, this is a weird one.

I have captured the join but cannot find a single communication within it that exchanges any sort of Network Encryption Key (only thing close is the APS: Command) yet the traffic is definitely encrypted between the devices..?

Here is the capture:

Outdoor Siren Join

@Koenkk - any ideas how I can start picking this one apart?

Pairing behaviour may be related to #13069

Koenkk commented 1 year ago

@danieledwardgeorgehitchcock the Transport Key is probably packet 23 in the sniff. It seems their gateway uses a custom link key (different the standard one). Can you provide a sniff when pairing to z2m?

danieledwardgeorgehitchcock commented 1 year ago

Here is the sniff of the device joining Z2M. Not much to report here really, it joins the network, fails the interview, then drops off of the network and the process repeats again:

Outdoor Siren Join Z2M

safakaltun commented 1 year ago

@danieledwardgeorgehitchcock I don’t have access to my device at the moment, but have you tried sniffing with PIN8 ON and OFF? I wonder if it changes how the device communicates. I remember that when PIN8 was ON, the device would continuously connect, try interviewing, fail and remove itself from z2m in an infinite loop. When the PIN8 was OFF, the device would connect, start interviewing, fail and stay in z2m database as a device that failed interview.

danieledwardgeorgehitchcock commented 1 year ago

Interesting concept! I thought pin 8 may have been for switching it between smart I.e. wireless mode, and dumb I.e. wired and controlled with switches mode. I'll also try and do another sniff with the switch flipped this morning

safakaltun commented 1 year ago

I don’t know if it would help, but below is the content of the QR code of the device

RB01SG0D83101826480040000000000000000000003C84FFFEEDA00BDLKCE5D5C1E3D59D1440ABFE85251205C36ADE4

safakaltun commented 1 year ago

Interesting concept! I thought pin 8 may have been for switching it between smart I.e. wireless mode, and dumb I.e. wired and controlled with switches mode. I'll also try and do another sniff with the switch flipped this morning

It says so in the manual, but it still attempts connecting when you start the device up or factory reset it.

danieledwardgeorgehitchcock commented 1 year ago

The first 6 digits are the manufacturer code, the next 16 are the product code, after that you have 20 padding digits, then the 16 digit EUI-64 MAC address and finally, the last 36 digits are the install code. The first 42 digits should be the same for all Bosch Outdoor Sirens.

danieledwardgeorgehitchcock commented 1 year ago

Here is the sniff of the device joining Z2M in 'Legacy' mode:

Outdoor Siren Join Z2M Legacy

Koenkk commented 1 year ago

@danieledwardgeorgehitchcock seems the device keeps rejoining, is it possible to pair it to the bosch gateway in legacy mode?

danieledwardgeorgehitchcock commented 1 year ago

No - it will only pair to the bosch controller in 'smart' mode. Having the device in 'legacy' mode while attempting to pair causes discovery to fail

Koenkk commented 1 year ago

@danieledwardgeorgehitchcock that is a bummer, I'm not sure if Bosch would be open to helping on this but other that that I see no other way to solve this.

danieledwardgeorgehitchcock commented 1 year ago

@Koenkk - I have just found this snippet of information:

"The ZigBee implementation of Bosch uses an advanced encryption technology with device specific link keys, which are being used for initial connection to the Controller, where individual encryption keys are being shared. Whilst other manufacturers use publicly available keys for the initial setup, the method of using device-specific encryption keys makes ZigBee a very secure wireless transmission protocol. Presumably, similar technologies are also used for the proprietary 868Mhz-protocol – these devices also have the individual device key printed on it."

Found here

Does this help with any guesses on how the device is added to the controller?

safakaltun commented 1 year ago

I am not sure if it would be helpful in any way, but found some documentation related to the bosch smart controller. Although this requires an existing controller, it might still be helpful.

Here is the Python library for the Rest API.

I have to say though, it is odd that the siren is neither mentioned in the documentation nor the python library they have for the Rest API.

Koenkk commented 1 year ago

@danieledwardgeorgehitchcock so maybe the devices pairs and expect the transport key message to be encrypted with this custom key. This is something we do not support yet and will require some changes in the coordinator fw. I'm not sure if you were able to figure out the specific encryption key of your device already? If yes, then you should also be able to decrypt your sniff with the original gateway.

danieledwardgeorgehitchcock commented 1 year ago

Thanks, I'll look into it. I'm guessing that it may be something to do with the install code. Hopefully, Bosch don't do anything too clever with it. Any ideas how I would go about decrypting the traffic using the 36 digit key as opposed to the standard 16? Is it as easy as plumbing it into Wireshark in the same fashion as the network key?

Koenkk commented 1 year ago

Any ideas how I would go about decrypting the traffic using the 36 digit key as opposed to the standard 16? Is it as easy as plumbing it into Wireshark in the same fashion as the network key?

I have no experience with that but I would expect that you can just paste it in.

danieledwardgeorgehitchcock commented 1 year ago

That didn't work unfortunately however, I have found the documentation from the Zigbee chip manufacturer on how they implement install codes in their SDK.

I am going to do some further reading on this:

Silicone Labs Zigbee Install Codes

danieledwardgeorgehitchcock commented 1 year ago

This looks promising:

To derive a link key from the installation code and store that into the key table on the Z3 Gateway, which acts as the Trust Center for the centralized network, enter: option install-code <link key table index> {<Joining Node’s EUI64>} {<installation code + 2-byte CRC>} For example: option install-code 0 {00 0B 57 FF FE 07 A9 E3} {88 77 66 55 44 33 22 11 11 22 33 44 55 66 77 88 D4 90}

I may be able to pick what I have apart using the chip manufacturers SDK

danieledwardgeorgehitchcock commented 1 year ago

So,

I feel that I am dangerously close to this, but I cannot quite figure out what I am doing wrong.

Based on the documentation, the install code is a device specific little endian code where the first 16 bits (32 digits) are the network key, and the last 2 bits (4 digits) are a CRC value.

The Silicone Labs co-ordinator stores the device MAC address (labelled as EUI-64) in an ascending array from 0-254.

The MAC address is used as a lookup key for the device network key.

So, I have done the following:

Decoded my QR code which contains all of the information required:

RB01SG0D831018264800400000000000000000009035EAFFFE424783DLKAE3B287281CF16F550733A0CEC38AA31E802

Applying the logic above,

The last 4 digits are the CRC: E802

The next 32 digits are the Network Key: AE3B287281CF16F550733A0CEC38AA31

Then the next 4 digits are unknown (could this be of significance??): DLKA

Then the next 16 digits are the device MAC address: 9035EAFFFE424783

After that, the next 34 digits are a 0 padded model identifier: 0D83101826480040000000000000000000

Then the remaining 6 digits are the manufacturer identifier: RB01SG

So, all that I should need from the above to decrypt the traffic is the 32 digit network key - the MAC address is only required for storage of the network key in the lookup table, and the remaining fields are the fingerprint to tell the controller and application what the device is that you are pairing.

I am guessing the byte order should be flipped too as it is little endian but, nothing I try seems to work!

Koenkk commented 1 year ago

It seems the TI firmware has support for install codes. I need to check how it works, what coordinator are you using?

danieledwardgeorgehitchcock commented 1 year ago

I have the Sonoff ZBDongle-P running Z-Stack 3

Koenkk commented 1 year ago

Thanks, I will check it

Koenkk commented 1 year ago

I've added the install code command; can you:

const constants = require('zigbee-herdsman/dist/adapter/z-stack/unpi/constants');
const {Buffer} = require('buffer');
console.log(Buffer);
const Subsystem = constants.Subsystem;

class MyExampleExtension {
    constructor(zigbee, mqtt, state, publishEntityState, eventBus, settings, logger) {
        this.zigbee = zigbee;
        this.mqtt = mqtt;
        this.state = state;
        this.publishEntityState = publishEntityState;
        this.eventBus = eventBus;
        this.settings = settings;
        this.logger = logger;
    }

    /**
     * This method is called by the controller once Zigbee2MQTT has been started.
     */
    async start() {
        console.log('Adding install code!');
        const payload = {
            installCodeFormat: 1,
            ieeeaddr: '0x9035EAFFFE424783',
            installCode: Buffer.from([0xAE, 0x3B, 0x28, 0x72, 0x81, 0xCF, 0x16, 0xF5, 0x50, 0x73, 0x3A, 0x0C, 0xEC, 0x38, 0xAA, 0x31, 0xE8, 0x02]),
        };
        const k = await this.zigbee.herdsman.adapter.znp.request(Subsystem.APP_CNF, 'bdbAddInstallCode', payload);
        console.log(k);
        console.log('Added install code');
    }
}

module.exports = MyExampleExtension;

For reference, this is the docs of the install code command:

Screenshot 2022-08-29 at 20 02 40
danieledwardgeorgehitchcock commented 1 year ago

I already run the Dev branch (latest-dev) in Docker. Tried updating it just now via docker-compose but it said that it was up-to-date..?

I proceeded to add the extension and I got the following:

Zigbee2MQTT:debug 2022-08-30 04:55:57: Received MQTT message on 'zigbee2mqtt/bridge/extensions' with data '[]'
[Function: Buffer] {
  poolSize: 8192,
  from: [Function: from],
  of: [Function: of],
  alloc: [Function: alloc],
  allocUnsafe: [Function: allocUnsafe],
  isBuffer: [Function: isBuffer],
  allocUnsafeSlow: [Function: allocUnsafeSlow],
  compare: [Function: compare],
  isEncoding: [Function: isEncoding],
  concat: [Function: concat],
  byteLength: [Function: byteLength],
  [Symbol(kIsEncodingSymbol)]: [Function: isEncoding]
}
Adding install code!
Zigbee2MQTT:error 2022-08-30 04:55:57: Failed to call 'MyExampleExtension' 'start' (Error: Command 'bdbAddInstallCode' from subsystem '15' not found
    at Function.createRequest (/app/node_modules/zigbee-herdsman/src/adapter/z-stack/znp/zpiObject.ts:45:19)
    at Znp.request (/app/node_modules/zigbee-herdsman/src/adapter/z-stack/znp/znp.ts:299:34)
    at MyExampleExtension.start (/app/dist/util/externally-loaded.js:27:58)
    at Controller.callExtensions (/app/lib/controller.ts:315:40)
    at Controller.addExtension (/app/lib/controller.ts:187:20)
    at ExternalExtension.loadExtension (/app/lib/extension/externalExtension.ts:91:20)
    at processTicksAndRejections (node:internal/process/task_queues:96:5))
Zigbee2MQTT:info  2022-08-30 04:55:57: Started frontend on port 0.0.0.0:8881

I am guessing that if you made changes to the Z2M codebase, they haven't been merged yet, or am I missing something?

I will remove my container and re-add just to make sure it isn't something on my side

danieledwardgeorgehitchcock commented 1 year ago

So, the above was me being an idiot. I dropped the container and re-created it. The function loaded successfully and....

WE HAVE A SUCCESSFUL JOIN!!!!

[Function: Buffer] {
Zigbee2MQTT:debug 2022-08-30 05:04:02: Received MQTT message on 'zigbee2mqtt/bridge/info' with data '{"commit":"8af3ad5","config":{"advanced":{"adapter_concurrent":null,"adapter_delay":null,"availability_blacklist":[],"availability_blocklist":[],"availability_passlist":[],"availability_whitelist":[],"cache_state":true,"cache_state_persistent":true,"cache_state_send_on_startup":true,"channel":21,"elapsed":false,"ext_pan_id":[221,221,221,221,221,221,221,221],"homeassistant_legacy_entity_attributes":false,"last_seen":"disable","legacy_api":false,"legacy_availability_payload":false,"log_directory":"/app/data/log/%TIMESTAMP%","log_file":"log.txt","log_level":"debug","log_output":["console","file"],"log_rotation":true,"log_symlink_current":true,"log_syslog":{"app_name":"Zigbee2MQTT","eol":"/n","host":"localhost","localhost":"localhost","path":"/dev/log","pid":"process.pid","port":123,"protocol":"tcp4","type":"5424"},"output":"json","pan_id":6754,"report":false,"soft_reset_timeout":0,"timestamp_format":"YYYY-MM-DD HH:mm:ss"},"blocklist":[],"device_options":{"legacy":false},"devices":{"0x680ae2fffe6faf49":{"friendly_name":"0x680ae2fffe6faf49"},"0xa4c1381538445fab":{"friendly_name":"0xa4c1381538445fab"}},"external_converters":["./external_converters/vimar_iot_thermostat.js","./external_converters/tuya_4ch_relay.js"],"frontend":{"host":"0.0.0.0","port":8881},"groups":{},"homeassistant":false,"map_options":{"graphviz":{"colors":{"fill":{"coordinator":"#e04e5d","enddevice":"#fff8ce","router":"#4ea3e0"},"font":{"coordinator":"#ffffff","enddevice":"#000000","router":"#ffffff"},"line":{"active":"#009900","inactive":"#994444"}}}},"mqtt":{"base_topic":"zigbee2mqtt","force_disable_retain":false,"include_device_information":false,"server":"mqtt://mosquitto:8883"},"ota":{"disable_automatic_update_check":false,"update_check_interval":1440},"passlist":[],"permit_join":false,"serial":{"disable_led":false,"port":"/dev/ttyUSB0"}},"config_schema":{"definitions":{"device":{"properties":{"debounce":{"description":"Debounces messages of this device","title":"Debounce","type":"number"},"debounce_ignore":{"description":"Protects unique payload values of specified payload properties from overriding within debounce time","examples":["action"],"items":{"type":"string"},"title":"Ignore debounce","type":"array"},"filtered_attributes":{"description":"Filter attributes with regex from published payload.","examples":["^temperature$","^battery$","^action$"],"items":{"type":"string"},"title":"Filtered publish attributes","type":"array"},"filtered_cache":{"description":"Filter attributes with regex from being added to the cache, this prevents the attribute from being in the published payload when the value didn't change.","examples":["^input_actions$"],"items":{"type":"string"},"title":"Filtered attributes from cache","type":"array"},"filtered_optimistic":{"description":"Filter attributes with regex from optimistic publish payload when calling /set. (This has no effect if optimistic is set to false).","examples":["^color_(mode|temp)$","color"],"items":{"type":"string"},"title":"Filtered optimistic attributes","type":"array"},"friendly_name":{"description":"Used in the MQTT topic of a device. By default this is the device ID","readOnly":true,"title":"Friendly name","type":"string"},"homeassistant":{"properties":{"name":{"description":"Name of the device in Home Assistant","title":"Home Assistant name","type":"string"}},"title":"Home Assistant","type":["object","null"]},"icon":{"description":"The user-defined device icon for the frontend. It can be a link to an image (not a path to a file) or base64 encoded data URL like: image/svg+xml;base64,PHN2ZyB3aW....R0aD","title":"Icon","type":"string"},"optimistic":{"default":true,"description":"Publish optimistic state after set","title":"Optimistic","type":"boolean"},"qos":{"description":"QoS level for MQTT messages of this device","title":"QoS","type":"number"},"retain":{"description":"Retain MQTT messages of this device","title":"Retain","type":"boolean"},"retention":{"description":"Sets the MQTT Message Expiry in seconds, Make sure to set mqtt.version to 5","title":"Retention","type":"number"}},"required":["friendly_name"],"type":"object"},"group":{"properties":{"devices":{"items":{"type":"string"},"type":"array"},"filtered_attributes":{"items":{"type":"string"},"type":"array"},"friendly_name":{"type":"string"},"off_state":{"default":"auto","description":"Control when to publish state OFF for a group. 'all_members_off': only publish state OFF when all group memebers are in state OFF, 'last_member_state': publish state OFF whenever one of its members changes to OFF","enum":["all_members_off","last_member_state"],"requiresRestart":true,"title":"Group off state","type":["string"]},"optimistic":{"type":"boolean"},"qos":{"type":"number"},"retain":{"type":"boolean"}},"required":["friendly_name"],"type":"object"}},"properties":{"advanced":{"properties":{"adapter_concurrent":{"description":"Adapter concurrency (e.g. 2 for CC2531 or 16 for CC26X2R1) (default: null, uses recommended value)","requiresRestart":true,"title":"Adapter concurrency","type":["number","null"]},"adapter_delay":{"description":"Adapter delay","requiresRestart":true,"title":"Adapter delay","type":["number","null"]},"cache_state":{"default":true,"description":"MQTT message payload will contain all attributes, not only changed ones. Has to be true when integrating via Home Assistant","title":"Cache state","type":"boolean"},"cache_state_persistent":{"default":true,"description":"Persist cached state, only used when cache_state: true","title":"Persist cache state","type":"boolean"},"cache_state_send_on_startup":{"default":true,"description":"Send cached state on startup, only used when cache_state: true","title":"Send cached state on startup","type":"boolean"},"channel":{"default":11,"description":"Zigbee channel, changing requires repairing all devices! (Note: use a ZLL channel: 11, 15, 20, or 25 to avoid Problems)","examples":[15,20,25],"maximum":26,"minimum":11,"requiresRestart":true,"title":"ZigBee channel","type":"number"},"elapsed":{"default":false,"description":"Add an elapsed attribute to MQTT messages, contains milliseconds since the previous msg","title":"Elapsed","type":"boolean"},"ext_pan_id":{"description":"Zigbee extended pan ID, changing requires repairing all devices!","items":{"type":"number"},"requiresRestart":true,"title":"Ext Pan ID","type":"array"},"last_seen":{"default":"disable","description":"Add a last_seen attribute to MQTT messages, contains date/time of last Zigbee message","enum":["disable","ISO_8601","ISO_8601_local","epoch"],"title":"Last seen","type":"string"},"legacy_api":{"default":true,"description":"Disables the legacy api (false = disable)","requiresRestart":true,"title":"Legacy API","type":"boolean"},"legacy_availability_payload":{"default":true,"description":"Payload to be used for device availabilty and bridge/state topics. true = text, false = JSON","requiresRestart":true,"title":"Legacy availability payload","type":"boolean"},"log_directory":{"description":"Location of log directory","examples":["data/log/%TIMESTAMP%"],"requiresRestart":true,"title":"Log directory","type":"string"},"log_file":{"default":"log.txt","description":"Log file name, can also contain timestamp","examples":["zigbee2mqtt_%TIMESTAMP%.log"],"requiresRestart":true,"title":"Log file","type":"string"},"log_level":{"default":"info","description":"Logging level","enum":["info","warn","error","debug"],"title":"Log level","type":"string"},"log_output":{"description":"Output location of the log, leave empty to suppress logging","items":{"enum":["console","file","syslog"],"type":"string"},"requiresRestart":true,"title":"Log output","type":"array"},"log_rotation":{"default":true,"description":"Log rotation","requiresRestart":true,"title":"Log rotation","type":"boolean"},"log_symlink_current":{"default":false,"description":"Create symlink to current logs in the log directory","requiresRestart":true,"title":"Log symlink current","type":"boolean"},"log_syslog":{"properties":{"app_name":{"default":"Zigbee2MQTT","description":"The name of the application (Default: Zigbee2MQTT).","title":"Localhost","type":"string"},"eol":{"default":"/n","description":"The end of line character to be added to the end of the message (Default: Message without modifications).","title":"eol","type":"string"},"host":{"default":"localhost","description":"The host running syslogd, defaults to localhost.","title":"Host","type":"string"},"localhost":{"default":"localhost","description":"Host to indicate that log messages are coming from (Default: localhost).","title":"Localhost","type":"string"},"path":{"default":"/dev/log","description":"The path to the syslog dgram socket (i.e. /dev/log or /var/run/syslog for OS X).","examples":["/var/run/syslog"],"title":"Path","type":"string"},"pid":{"default":"process.pid","description":"PID of the process that log messages are coming from (Default process.pid).","title":"PID","type":"string"},"port":{"default":123,"description":"The port on the host that syslog is running on, defaults to syslogd's default port.","title":"Port","type":"number"},"protocol":{"default":"tcp4","description":"The network protocol to log over (e.g. tcp4, udp4, tls4, unix, unix-connect, etc).","examples":["udp4","tls4","unix","unix-connect"],"title":"Protocol","type":"string"},"type":{"default":"5424","description":"The type of the syslog protocol to use (Default: BSD, also valid: 5424).","title":"Type","type":"string"}},"title":"syslog","type":"object"},"network_key":{"description":"Network encryption key, changing requires repairing all devices!","oneOf":[{"title":"Network key(string)","type":"string"},{"items":{"type":"number"},"title":"Network key(array)","type":"array"}],"requiresRestart":true,"title":"Network key"},"output":{"description":"Examples when 'state' of a device is published json: topic: 'zigbee2mqtt/my_bulb' payload '{\"state\": \"ON\"}' attribute: topic 'zigbee2mqtt/my_bulb/state' payload 'ON' attribute_and_json: both json and attribute (see above)","enum":["attribute_and_json","attribute","json"],"title":"MQTT output type","type":"string"},"pan_id":{"description":"ZigBee pan ID, changing requires repairing all devices!","oneOf":[{"title":"Pan ID (string)","type":"string"},{"title":"Pan ID (number)","type":"number"}],"requiresRestart":true,"title":"Pan ID"},"timestamp_format":{"description":"Log timestamp format","examples":["YYYY-MM-DD HH:mm:ss"],"requiresRestart":true,"title":"Timestamp format","type":"string"},"transmit_power":{"description":"Transmit power of adapter, only available for Z-Stack (CC253*/CC2652/CC1352) adapters, CC2652 = 5dbm, CC1352 max is = 20dbm (5dbm default)","requiresRestart":true,"title":"Transmit power","type":["number","null"]}},"title":"Advanced","type":"object"},"availability":{"description":"Checks whether devices are online/offline","oneOf":[{"title":"Availability (simple)","type":"boolean"},{"properties":{"active":{"description":"Options for active devices (routers/mains powered)","properties":{"timeout":{"default":10,"description":"Time after which an active device will be marked as offline in minutes","requiresRestart":true,"title":"Timeout","type":"number"}},"requiresRestart":true,"title":"Active","type":"object"},"passive":{"description":"Options for passive devices (mostly battery powered)","properties":{"timeout":{"default":1500,"description":"Time after which an passive device will be marked as offline in minutes","requiresRestart":true,"title":"Timeout","type":"number"}},"requiresRestart":true,"title":"Passive","type":"object"}},"title":"Availability (advanced)","type":"object"}],"requiresRestart":true,"title":"Availability"},"ban":{"items":{"type":"string"},"readOnly":true,"requiresRestart":true,"title":"Ban (deprecated, use blocklist)","type":"array"},"blocklist":{"description":"Block devices from the network (by ieeeAddr)","items":{"type":"string"},"requiresRestart":true,"title":"Blocklist","type":"array"},"device_options":{"title":"Options that are applied to all devices","type":"object"},"devices":{"patternProperties":{"^.*$":{"$ref":"#/definitions/device"}},"propertyNames":{"pattern":"^0x[\\d\\w]{16}$"},"type":"object"},"external_converters":{"description":"You can define external converters to e.g. add support for a DiY device","examples":["DIYRuZ_FreePad.js"],"items":{"type":"string"},"requiresRestart":true,"title":"External converters","type":"array"},"frontend":{"oneOf":[{"title":"Frontend (simple)","type":"boolean"},{"properties":{"auth_token":{"description":"Enables authentication, disabled by default","requiresRestart":true,"title":"Auth token","type":["string","null"]},"host":{"default":"0.0.0.0","description":"Frontend binding host","requiresRestart":true,"title":"Bind host","type":"string"},"port":{"default":8080,"description":"Frontend binding port","requiresRestart":true,"title":"Port","type":"number"},"url":{"description":"URL on which the frontend can be reached, currently only used for the Home Assistant device configuration page","requiresRestart":true,"title":"URL","type":["string","null"]}},"title":"Frontend (advanced)","type":"object"}],"requiresRestart":true,"title":"Frontend"},"groups":{"patternProperties":{"^.*$":{"$ref":"#/definitions/group"}},"propertyNames":{"pattern":"^[\\w].*$"},"type":"object"},"homeassistant":{"default":false,"description":"Home Assistant integration (MQTT discovery)","oneOf":[{"title":"Home Assistant (simple)","type":"boolean"},{"properties":{"discovery_topic":{"description":"Home Assistant discovery topic","examples":["homeassistant"],"requiresRestart":true,"title":"Homeassistant discovery topic","type":"string"},"legacy_entity_attributes":{"default":true,"description":"Home Assistant legacy entity attributes, when enabled Zigbee2MQTT will add state attributes to each entity, additional to the separate entities and devices it already creates","title":"Home Assistant legacy entity attributes","type":"boolean"},"legacy_triggers":{"default":true,"description":"Home Assistant legacy triggers, when enabled Zigbee2mqt will send an empty 'action' or 'click' after one has been send. A 'sensor_action' and 'sensor_click' will be discoverd","title":"Home Assistant legacy triggers","type":"boolean"},"status_topic":{"description":"Home Assistant status topic","examples":["homeassistant/status"],"requiresRestart":true,"title":"Home Assistant status topic","type":"string"}},"title":"Home Assistant (advanced)","type":"object"}],"requiresRestart":true,"title":"Home Assistant integration"},"map_options":{"properties":{"graphviz":{"properties":{"colors":{"properties":{"fill":{"properties":{"coordinator":{"type":"string"},"enddevice":{"type":"string"},"router":{"type":"string"}},"type":"object"},"font":{"properties":{"coordinator":{"type":"string"},"enddevice":{"type":"string"},"router":{"type":"string"}},"type":"object"},"line":{"properties":{"active":{"type":"string"},"inactive":{"type":"string"}},"type":"object"}},"type":"object"}},"type":"object"}},"title":"Networkmap","type":"object"},"mqtt":{"properties":{"base_topic":{"default":"zigbee2mqtt","description":"MQTT base topic for Zigbee2MQTT MQTT messages","examples":["zigbee2mqtt"],"requiresRestart":true,"title":"Base topic","type":"string"},"ca":{"description":"Absolute path to SSL/TLS certificate of CA used to sign server and client certificates","examples":["/etc/ssl/mqtt-ca.crt"],"requiresRestart":true,"title":"Certificate authority","type":"string"},"cert":{"description":"Absolute path to SSL/TLS certificate for client-authentication","examples":["/etc/ssl/mqtt-client.crt"],"requiresRestart":true,"title":"SSL/TLS certificate","type":"string"},"client_id":{"description":"MQTT client ID","examples":["MY_CLIENT_ID"],"requiresRestart":true,"title":"Client ID","type":"string"},"force_disable_retain":{"default":false,"description":"Disable retain for all send messages. ONLY enable if you MQTT broker doesn't support retained message (e.g. AWS IoT core, Azure IoT Hub, Google Cloud IoT core, IBM Watson IoT Platform). Enabling will break the Home Assistant integration","requiresRestart":true,"title":"Force disable retain","type":"boolean"},"include_device_information":{"default":false,"description":"Include device information to mqtt messages","title":"Include device information",�"type":"boolean"},"keepalive":{"default":60,"description":"MQTT keepalive in second","requiresRestart":true,"title":"Keepalive","type":"number"},"key":{"description":"Absolute path to SSL/TLS key for client-authentication","examples":["/etc/ssl/mqtt-client.key"],"requiresRestart":true,"title":"SSL/TLS key","type":"string"},"password":{"description":"MQTT server authentication password","examples":["ILOVEPELMENI"],"requiresRestart":true,"title":"Password","type":"string"},"reject_unauthorized":{"default":true,"description":"Disable self-signed SSL certificate","requiresRestart":true,"title":"Reject unauthorized","type":"boolean"},"server":{"description":"MQTT server URL (use mqtts:// for SSL/TLS connection)","examples":["mqtt://localhost:1883"],"requiresRestart":true,"title":"MQTT server","type":"string"},"user":{"description":"MQTT server authentication user","examples":["johnnysilverhand"],"requiresRestart":true,"title":"User","type":"string"},"version":{"default":4,"description":"MQTT protocol version","examples":[5],"requiresRestart":true,"title":"Version","type":["number","null"]}},"required":["server"],"title":"MQTT","type":"object"},"ota":{"properties":{"disable_automatic_update_check":{"default":false,"description":"Zigbee devices may request a firmware update, and do so frequently, causing Zigbee2MQTT to reach out to third party servers. If you disable these device initiated checks, you can still initiate a firmware update check manually.","title":"Disable automatic update check","type":"boolean"},"ikea_ota_use_test_url":{"default":false,"description":"Use IKEA TRADFRI OTA test server, see OTA updates documentation","requiresRestart":true,"title":"IKEA TRADFRI OTA use test url","type":"boolean"},"update_check_interval":{"default":1440,"description":"Your device may request a check for a new firmware update. This value determines how frequently third party servers may actually be contacted to look for firmware updates. The value is set in minutes, and the default is 1 day.","title":"Update check interval","type":"number"},"zigbee_ota_override_index_location":{"description":"Location of override OTA index file","examples":["index.json"],"requiresRestart":true,"title":"OTA index override file name","type":"string"}},"title":"OTA updates","type":"object"},"passlist":{"description":"Allow only certain devices to join the network (by ieeeAddr). Note that all devices not on the passlist will be removed from the network!","items":{"type":"string"},"requiresRestart":true,"title":"Passlist","type":"array"},"permit_join":{"default":false,"description":"Allow new devices to join (re-applied at restart)","title":"Permit join","type":"boolean"},"serial":{"properties":{"adapter":{"default":"auto","description":"Adapter type, not needed unless you are experiencing problems","enum":["deconz","zstack","zigate","ezsp","auto"],"requiresRestart":true,"title":"Adapter","type":["string"]},"baudrate":{"description":"Baud rate speed for serial port, this can be anything firmware support but default is 115200 for Z-Stack and EZSP, 38400 for Deconz, however note that some EZSP firmware need 57600","examples":[38400,57600,115200],"requiresRestart":true,"title":"Baudrate","type":"number"},"disable_led":{"default":false,"description":"Disable LED of the adapter if supported","requiresRestart":true,"title":"Disable led","type":"boolean"},"port":{"description":"Location of the adapter. To autodetect the port, set null","examples":["/dev/ttyACM0"],"requiresRestart":true,"title":"Port","type":["string","null"]},"rtscts":{"description":"RTS / CTS Hardware Flow Control for serial port","requiresRestart":true,"title":"RTS / CTS","type":"boolean"}},"title":"Serial","type":"object"},"whitelist":{"items":{"type":"string"},"readOnly":true,"requiresRestart":true,"title":"Whitelist (deprecated, use passlist)","type":"array"}},"required":["mqtt"],"type":"object"},"coordinator":{"ieee_address":"0x00124b00257cae15","meta":{"maintrel":1,"majorrel":2,"minorrel":7,"product":1,"revision":20210708,"transportrev":2},"type":"zStack3x0"},"log_level":"debug","network":{"channel":21,"extended_pan_id":"0x00124b00257cae15","pan_id":6754},"permit_join":false,"restart_required":false,"version":"1.26.0-dev"}'
Zigbee2MQTT:debug 2022-08-30 05:04:02: Received MQTT message on 'zigbee2mqtt/bridge/devices' with data '[{"definition":null,"endpoints":{"1":{"bindings":[],"clusters":{"input":[],"output":[]},"configured_reportings":[],"scenes":[]},"10":{"bindings":[],"clusters":{"input":[],"output":[]},"configured_reportings":[],"scenes":[]},"11":{"bindings":[],"clusters":{"input":["ssIasAce","genTime"],"output":["ssIasZone","ssIasWd"]},"configured_reportings":[],"scenes":[]},"110":{"bindings":[],"clusters":{"input":[],"output":[]},"configured_reportings":[],"scenes":[]},"12":{"bindings":[],"clusters":{"input":[],"output":[]},"configured_reportings":[],"scenes":[]},"13":{"bindings":[],"clusters":{"input":["genOta"],"output":[]},"configured_reportings":[],"scenes":[]},"2":{"bindings":[],"clusters":{"input":[],"output":[]},"configured_reportings":[],"scenes":[]},"242":{"bindings":[],"clusters":{"input":[],"output":[]},"configured_reportings":[],"scenes":[]},"3":{"bindings":[],"clusters":{"input":[],"output":[]},"configured_reportings":[],"scenes":[]},"4":{"bindings":[],"clusters":{"input":[],"output":[]},"configured_reportings":[],"scenes":[]},"47":{"bindings":[],"clusters":{"input":[],"output":[]},"configured_reportings":[],"scenes":[]},"5":{"bindings":[],"clusters":{"input":[],"output":[]},"configured_reportings":[],"scenes":[]},"6":{"bindings":[],"clusters":{"input":[],"output":[]},"configured_reportings":[],"scenes":[]},"8":{"bindings":[],"clusters":{"input":[],"output":[]},"configured_reportings":[],"scenes":[]}},"friendly_name":"Coordinator","ieee_address":"0x00124b00257cae15","interview_completed":true,"interviewing":false,"network_address":0,"supported":false,"type":"Coordinator"},{"date_code":"","definition":{"description":"4Ch Din Zigbee/RF Relay Module","exposes":[{"endpoint":"l1","features":[{"access":7,"description":"On/off state of the switch","endpoint":"l1","name":"state","property":"state_l1","type":"binary","value_off":"OFF","value_on":"ON","value_toggle":"TOGGLE"}],"type":"switch"},{"access":7,"description":"Controls the behavior when the device is powered on","endpoint":"l1","name":"power_on_behavior","property":"power_on_behavior_l1","type":"enum","values":["off","previous","on"]},{"endpoint":"l2","features":[{"access":7,"description":"On/off state of the switch","endpoint":"l2","name":"state","property":"state_l2","type":"binary","value_off":"OFF","value_on":"ON","value_toggle":"TOGGLE"}],"type":"switch"},{"access":7,"description":"Controls the behavior when the device is powered on","endpoint":"l2","name":"power_on_behavior","property":"power_on_behavior_l2","type":"enum","values":["off","previous","on"]},{"endpoint":"l3","features":[{"access":7,"description":"On/off state of the switch","endpoint":"l3","name":"state","property":"state_l3","type":"binary","value_off":"OFF","value_on":"ON","value_toggle":"TOGGLE"}],"type":"switch"},{"access":7,"description":"Controls the behavior when the device is powered on","endpoint":"l3","name":"power_on_behavior","property":"power_on_behavior_l3","type":"enum","values":["off","previous","on"]},{"endpoint":"l4","features":[{"access":7,"description":"On/off state of the switch","endpoint":"l4","name":"state","property":"state_l4","type":"binary","value_off":"OFF","value_on":"ON","value_toggle":"TOGGLE"}],"type":"switch"},{"access":7,"description":"Controls the behavior when the device is powered on","endpoint":"l4","name":"power_on_behavior","property":"power_on_behavior_l4","type":"enum","values":["off","previous","on"]},{"access":1,"description":"Link quality (signal strength)","name":"linkquality","property":"linkquality","type":"numeric","unit":"lqi","value_max":255,"value_min":0}],"model":"ZG-003-RF","options":[],"supports_ota":false,"vendor":"Tuya"},"endpoints":{"1":{"bindings":[{"cluster":"genOnOff","target":{"endpoint":1,"ieee_address":"0x00124b00257cae15","type":"endpoint"}}],"clusters":{"input":["genIdentify","genGroups","genScenes","genOnOff","57344","manuSpecificTuya_3","genBasic"],"output":["genOta","genTime"]},"configured_reportings":[],"scenes":[]},"2":{"bindings":[{"cluster":"genOnOff","target":{"endpoint":1,"ieee_address":"0x00124b00257cae15","type":"endpoint"}}],"clusters":{"input":["genGroups","genScenes","genOnOff","manuSpecificTuya_3"],"output":[]},"configured_reportings":[],"scenes":[]},"242":{"bindings":[],"clusters":{"input":[],"output":["greenPower"]},"configured_reportings":[],"scenes":[]},"3":{"bindings":[{"cluster":"genOnOff","target":{"endpoint":1,"ieee_address":"0x00124b00257cae15","type":"endpoint"}}],"clusters":{"input":["genGroups","genScenes","genOnOff","manuSpecificTuya_3"],"output":[]},"configured_reportings":[],"scenes":[]},"4":{"bindings":[{"cluster":"genOnOff","target":{"endpoint":1,"ieee_address":"0x00124b00257cae15","type":"endpoint"}}],"clusters":{"input":["genGroups","genScenes","genOnOff","manuSpecificTuya_3"],"output":[]},"configured_reportings":[],"scenes":[]}},"friendly_name":"0xa4c1381538445fab","ieee_address":"0xa4c1381538445fab","interview_completed":true,"interviewing":false,"manufacturer":"_TZ3000_u3oupgdy","model_id":"TS0004","network_address":20472,"power_source":"Mains (single phase)","supported":true,"type":"Router"}]'
Zigbee2MQTT:debug 2022-08-30 05:04:02: Received MQTT message on 'zigbee2mqtt/bridge/groups' with data '[]'
Zigbee2MQTT:debug 2022-08-30 05:04:02: Received MQTT message on 'zigbee2mqtt/bridge/extensions' with data '[{"code":"const constants = require('zigbee-herdsman/dist/adapter/z-stack/unpi/constants');\nconst {Buffer} = require('buffer');\nconsole.log(Buffer);\nconst Subsystem = constants.Subsystem;\n\nclass MyExampleExtension {\n    constructor(zigbee, mqtt, state, publishEntityState, eventBus, settings, logger) {\n        this.zigbee = zigbee;\n        this.mqtt = mqtt;\n        this.state = state;\n        this.publishEntityState = publishEntityState;\n        this.eventBus = eventBus;\n        this.settings = settings;\n        this.logger = logger;\n    }\n\n    /**\n     * This method is called by the controller once Zigbee2MQTT has been started.\n     */\n    async start() {\n        console.log('Adding install code!');\n        const payload = {\n            installCodeFormat: 1,\n            ieeeaddr: '0x9035EAFFFE424783',\n            installCode: Buffer.from([0xAE, 0x3B, 0x28, 0x72, 0x81, 0xCF, 0x16, 0xF5, 0x50, 0x73, 0x3A, 0x0C, 0xEC, 0x38, 0xAA, 0x31, 0xE8, 0x02]),\n        };\n        const k = await this.zigbee.herdsman.adapter.znp.request(Subsystem.APP_CNF, 'bdbAddInstallCode', payload);\n        console.log(k);\n        console.log('Added install code');\n    }\n}\n\nmodule.exports = MyExampleExtension;\n","name":"install_code.js"}]'
  poolSize: 8192,
  from: [Function: from],
  of: [Function: of],
  alloc: [Function: alloc],
  allocUnsafe: [Function: allocUnsafe],
  allocUnsafeSlow: [Function: allocUnsafeSlow],
  isBuffer: [Function: isBuffer],
  compare: [Function: compare],
  isEncoding: [Function: isEncoding],
  concat: [Function: concat],
  byteLength: [Function: byteLength],
  [Symbol(kIsEncodingSymbol)]: [Function: isEncoding]
}
Adding install code!
Zigbee2MQTT:info  2022-08-30 05:04:02: Started frontend on port 0.0.0.0:8881
Zigbee2MQTT:info  2022-08-30 05:04:02: MQTT publish: topic 'zigbee2mqtt/0xa4c1381538445fab', payload '{"linkquality":189,"power_on_behavior_l1":"off","power_on_behavior_l2":"off","power_on_behavior_l3":"off","power_on_behavior_l4":"off","state_l1":"OFF","state_l2":"OFF","state_l3":"OFF","state_l4":"OFF"}'
ZpiObject {
  subsystem: 15,
  command: 'bdbAddInstallCode',
  commandID: 4,
  payload: { status: 0 },
  type: 3,
  parameters: [ { name: 'status', parameterType: 0 } ]
Added install code
Zigbee2MQTT:debug 2022-08-30 05:05:36: Received MQTT message on 'zigbee2mqtt/bridge/request/permit_join' with data '{"device":null,"time":254,"transaction":"j7pex-1","value":true}'
Zigbee2MQTT:info  2022-08-30 05:05:36: Zigbee: allowing new devices to join.
Zigbee2MQTT:info  2022-08-30 05:05:36: MQTT publish: topic 'zigbee2mqtt/bridge/response/permit_join', payload '{"data":{"time":254,"value":true},"status":"ok","transaction":"j7pex-1"}'
Zigbee2MQTT:info  2022-08-30 05:05:39: Device '0x9035eafffe424783' joined
Zigbee2MQTT:info  2022-08-30 05:05:39: MQTT publish: topic 'zigbee2mqtt/bridge/event', payload '{"data":{"friendly_name":"0x9035eafffe424783","ieee_address":"0x9035eafffe424783"},"type":"device_joined"}'
Zigbee2MQTT:info  2022-08-30 05:05:39: Starting interview of '0x9035eafffe424783'
Zigbee2MQTT:info  2022-08-30 05:05:39: MQTT publish: topic 'zigbee2mqtt/bridge/event', payload '{"data":{"friendly_name":"0x9035eafffe424783","ieee_address":"0x9035eafffe424783","status":"started"},"type":"device_interview"}'
Zigbee2MQTT:debug 2022-08-30 05:05:39: Device '0x9035eafffe424783' announced itself
Zigbee2MQTT:info  2022-08-30 05:05:39: MQTT publish: topic 'zigbee2mqtt/bridge/event', payload '{"data":{"friendly_name":"0x9035eafffe424783","ieee_address":"0x9035eafffe424783"},"type":"device_announce"}'
Zigbee2MQTT:debug 2022-08-30 05:05:54: Received Zigbee message from '0x9035eafffe424783', type 'readResponse', cluster 'genBasic', data '{"modelId":"RBSH-OS-ZB-EU"}' from endpoint 1 with groupID 0
Zigbee2MQTT:debug 2022-08-30 05:05:54: Skipping message, definition is undefined and still interviewing
Zigbee2MQTT:debug 2022-08-30 05:05:54: Received Zigbee message from '0x9035eafffe424783', type 'readResponse', cluster 'genBasic', data '{"manufacturerName":"Bosch"}' from endpoint 1 with groupID 0
Zigbee2MQTT:debug 2022-08-30 05:05:55: Received Zigbee message from '0x9035eafffe424783', type 'readResponse', cluster 'genBasic', data '{"powerSource":132}' from endpoint 1 with groupID 0
Zigbee2MQTT:debug 2022-08-30 05:05:55: Skipping message, definition is undefined and still interviewing
Zigbee2MQTT:debug 2022-08-30 05:05:55: Received Zigbee message from '0x9035eafffe424783', type 'readResponse', cluster 'genBasic', data '{"zclVersion":3}' from endpoint 1 with groupID 0
Zigbee2MQTT:debug 2022-08-30 05:05:56: Received Zigbee message from '0x9035eafffe424783', type 'readResponse', cluster 'genBasic', data '{"appVersion":2}' from endpoint 1 with groupID 0
Zigbee2MQTT:debug 2022-08-30 05:05:56: Skipping message, definition is undefined and still interviewing
Zigbee2MQTT:debug 2022-08-30 05:05:56: Received Zigbee message from '0x9035eafffe424783', type 'readResponse', cluster 'genBasic', data '{"stackVersion":7}' from endpoint 1 with groupID 0
Zigbee2MQTT:debug 2022-08-30 05:05:57: Received Zigbee message from '0x9035eafffe424783', type 'readResponse', cluster 'genBasic', data '{"dateCode":"20211012"}' from endpoint 1 with groupID 0
Zigbee2MQTT:debug 2022-08-30 05:05:57: Skipping message, definition is undefined and still interviewing
Zigbee2MQTT:debug 2022-08-30 05:05:57: Received Zigbee message from '0x9035eafffe424783', type 'readResponse', cluster 'genBasic', data '{"hwVersion":32}' from endpoint 1 with groupID 0
Zigbee2MQTT:debug 2022-08-30 05:05:58: Received Zigbee message from '0x9035eafffe424783', type 'readResponse', cluster 'genBasic', data '{"swBuildId":"V1.19.00"}' from endpoint 1 with groupID 0
Zigbee2MQTT:debug 2022-08-30 05:05:58: Received Zigbee message from '0x9035eafffe424783', type 'readResponse', cluster 'ssIasZone', data '{"iasCieAddr":"0x0000000000000000","zoneState":0}' from endpoint 1 with groupID 0
Zigbee2MQTT:debug 2022-08-30 05:05:58: Skipping message, definition is undefined and still interviewing
Zigbee2MQTT:debug 2022-08-30 05:06:00: Received Zigbee message from '0x9035eafffe424783', type 'readResponse', cluster 'ssIasZone', data '{"iasCieAddr":"0x00124b00257cae15","zoneState":1}' from endpoint 1 with groupID 0
Zigbee2MQTT:debug 2022-08-30 05:06:00: Skipping message, definition is undefined and still interviewing
Zigbee2MQTT:debug 2022-08-30 05:06:01: Received Zigbee message from '0x9035eafffe424783', type 'readResponse', cluster 'genPollCtrl', data '{"checkinInterval":6480}' from endpoint 1 with groupID 0
Zigbee2MQTT:debug 2022-08-30 05:06:01: Skipping message, definition is undefined and still interviewing
Zigbee2MQTT:info  2022-08-30 05:06:01: Successfully interviewed '0x9035eafffe424783', device has successfully been paired
Zigbee2MQTT:warn  2022-08-30 05:06:01: Device '0x9035eafffe424783' with Zigbee model 'RBSH-OS-ZB-EU' and manufacturer name 'Bosch' is NOT supported, please follow https://www.zigbee2mqtt.io/advanced/support-new-devices/01_support_new_devices.html
Zigbee2MQTT:info  2022-08-30 05:06:01: MQTT publish: topic 'zigbee2mqtt/bridge/event', payload '{"data":{"definition":null,"friendly_name":"0x9035eafffe424783","ieee_address":"0x9035eafffe424783","status":"successful","supported":false},"type":"device_interview"}'
Zigbee2MQTT:debug 2022-08-30 05:06:02: Received Zigbee message from '0x9035eafffe424783', type 'attributeReport', cluster 'genPowerCfg', data '{"batteryPercentageRemaining":200}' from endpoint 1 with groupID 0
Zigbee2MQTT:warn  2022-08-30 05:06:02: Received message from unsupported device with Zigbee model 'RBSH-OS-ZB-EU' and manufacturer name 'Bosch'
Zigbee2MQTT:warn  2022-08-30 05:06:02: Please see: https://www.zigbee2mqtt.io/advanced/support-new-devices/01_support_new_devices.html
Zigbee2MQTT:debug 2022-08-30 05:06:02: Received Zigbee message from '0x9035eafffe424783', type 'attributeReport', cluster 'genPowerCfg', data '{"batteryAlarmState":0}' from endpoint 1 with groupID 0
Zigbee2MQTT:debug 2022-08-30 05:06:02: Received Zigbee message from '0x9035eafffe424783', type 'attributeReport', cluster 'genPowerCfg', data '{"40960":2}' from endpoint 1 with groupID 0
Zigbee2MQTT:debug 2022-08-30 05:06:02: Received Zigbee message from '0x9035eafffe424783', type 'attributeReport', cluster 'genPowerCfg', data '{"40961":1}' from endpoint 1 with groupID 0
Zigbee2MQTT:debug 2022-08-30 05:06:05: Received Zigbee message from '0x9035eafffe424783', type 'attributeReport', cluster 'genPowerCfg', data '{"batteryPercentageRemaining":200}' from endpoint 1 with groupID 0
Zigbee2MQTT:warn  2022-08-30 05:06:05: Received message from unsupported device with Zigbee model 'RBSH-OS-ZB-EU' and manufacturer name 'Bosch'
Zigbee2MQTT:warn  2022-08-30 05:06:05: Please see: https://www.zigbee2mqtt.io/advanced/support-new-devices/01_support_new_devices.html
Zigbee2MQTT:debug 2022-08-30 05:06:05: Received Zigbee message from '0x9035eafffe424783', type 'attributeReport', cluster 'genPowerCfg', data '{"batteryAlarmState":0}' from endpoint 1 with groupID 0
Zigbee2MQTT:debug 2022-08-30 05:06:05: Received Zigbee message from '0x9035eafffe424783', type 'attributeReport', cluster 'genPowerCfg', data '{"40960":2}' from endpoint 1 with groupID 0
Zigbee2MQTT:debug 2022-08-30 05:06:05: Received Zigbee message from '0x9035eafffe424783', type 'attributeReport', cluster 'genPowerCfg', data '{"40961":1}' from endpoint 1 with groupID 0
Zigbee2MQTT:debug 2022-08-30 05:06:10: Received Zigbee message from '0x9035eafffe424783', type 'commandQueryNextImageRequest', cluster 'genOta', data '{"fieldControl":1,"fileVersion":421095264,"imageType":12293,"manufacturerCode":4617}' from endpoint 1 with groupID 0
Zigbee2MQTT:warn  2022-08-30 05:06:10: Please see: https://www.zigbee2mqtt.io/advanced/support-new-devices/01_support_new_devices.html
Zigbee2MQTT:warn  2022-08-30 05:06:10: Received message from unsupported device with Zigbee model 'RBSH-OS-ZB-EU' and manufacturer name 'Bosch'
Zigbee2MQTT:debug 2022-08-30 05:06:13: Received Zigbee message from '0x9035eafffe424783', type 'commandStatusChangeNotification', cluster 'ssIasZone', data '{"extendedstatus":0,"zonestatus":160}' from endpoint 1 with groupID 0
Zigbee2MQTT:warn  2022-08-30 05:06:13: Received message from unsupported device with Zigbee model 'RBSH-OS-ZB-EU' and manufacturer name 'Bosch'
Zigbee2MQTT:warn  2022-08-30 05:06:13: Please see: https://www.zigbee2mqtt.io/advanced/support-new-devices/01_support_new_devices.html
Zigbee2MQTT:debug 2022-08-30 05:06:13: Received Zigbee message from '0x9035eafffe424783', type 'commandQueryNextImageRequest', cluster 'genOta', data '{"fieldControl":1,"fileVersion":421095264,"imageType":12293,"manufacturerCode":4617}' from endpoint 1 with groupID 0
Zigbee2MQTT:debug 2022-08-30 05:06:16: Received Zigbee message from '0x9035eafffe424783', type 'commandQueryNextImageRequest', cluster 'genOta', data '{"fieldControl":1,"fileVersion":421095264,"imageType":12293,"manufacturerCode":4617}' from endpoint 1 with groupID 0
Zigbee2MQTT:warn  2022-08-30 05:06:16: Received message from unsupported device with Zigbee model 'RBSH-OS-ZB-EU' and manufacturer name 'Bosch'
Zigbee2MQTT:debug 2022-08-30 05:06:19: Received Zigbee message from '0x9035eafffe424783', type 'commandQueryNextImageRequest', cluster 'genOta', data '{"fieldControl":1,"fileVersion":421095264,"imageType":12293,"manufacturerCode":4617}' from endpoint 1 with groupID 0
Zigbee2MQTT:warn  2022-08-30 05:06:16: Please see: https://www.zigbee2mqtt.io/advanced/support-new-devices/01_support_new_devices.html
Zigbee2MQTT:warn  2022-08-30 05:06:19: Received message from unsupported device with Zigbee model 'RBSH-OS-ZB-EU' and manufacturer name 'Bosch'
Zigbee2MQTT:warn  2022-08-30 05:06:19: Please see: https://www.zigbee2mqtt.io/advanced/support-new-devices/01_support_new_devices.html
Zigbee2MQTT:debug 2022-08-30 05:06:22: Received Zigbee message from '0x9035eafffe424783', type 'commandQueryNextImageRequest', cluster 'genOta', data '{"fieldControl":1,"fileVersion":421095264,"imageType":12293,"manufacturerCode":4617}' from endpoint 1 with groupID 0
Zigbee2MQTT:warn  2022-08-30 05:06:22: Received message from unsupported device with Zigbee model 'RBSH-OS-ZB-EU' and manufacturer name 'Bosch'
Zigbee2MQTT:warn  2022-08-30 05:06:22: Please see: https://www.zigbee2mqtt.io/advanced/support-new-devices/01_support_new_devices.html

Database Entry:

{
  "id": 3,
  "type": "EndDevice",
  "ieeeAddr": "0x9035eafffe424783",
  "nwkAddr": 17198,
  "manufId": 4617,
  "manufName": "Bosch",
  "powerSource": "DC Source",
  "modelId": "RBSH-OS-ZB-EU",
  "epList": [
    1
  ],
  "endpoints": {
    "1": {
      "profId": 260,
      "epId": 1,
      "devId": 1027,
      "inClustterList": [
        0,
        1,
        3,
        32,
        1280,
        1282,
        2821
      ],
      "outClusterList": [
        25
      ],
      "clusters": {
        "genBasic": {
          "attributes": {
            "modelId": "RBSH-OS-ZB-EU",
            "manufacturerName": "Bosch",
            "powerSource": 132,
            "zclVersion": 3,
            "appVersion": 2,
            "stackVersion": 7,
            "hwVersion": 32,
            "dateCode": "20211012",
            "swBuildId": "V1.19.00"
          }
        },
        "ssIasZone": {
          "attributes": {
            "iasCieAddr": "0x00124b00257cae15",
            "zoneState": 1
          }
        },
        "genPollCtrl": {
          "attributes": {
            "checkinInterval": 6480
          }
        }
      },
      "binds": [
        {
          "cluster": 32,
          "type": "endpoint",
          "deviceIeeeeAddress": "0x00124b00257cae15",
          "endpointID": 1
        }
      ],
      "configuredReportings": [],
      "meta": {}
    }
  },
  "appVersion": 2,
  "stackVersion": 7,
  "hwVersion": 32,
  "dateCode": "20211012",
  "swBuildId": "V1.19.00",
  "zclVersion": 3,
  "interviewCompleted": true,
  "meta": {},
  "lastSeen": 1661835961869,
  "defaultSendRequestWhen": "active"
}
safakaltun commented 1 year ago

I also can confirm that I managed to successfully pair the device using hass.io. I think it is important to mention for the people who will do this after us that ieeeaddr and installCode are both device specific and case sensitive in the example extension @Koenkk provided. Otherwise the device does not pair.

danieledwardgeorgehitchcock commented 1 year ago

I am guessing the extension above is just a proof of concept to see if we could successfully join the devices to Z2M.

If I was to see this working in production, I'd probably create a new MQTT topic that accepts the IEEE MAC Adress, Install Code and Install Code Format that in turn adds an entry to the co-ordinator (and one to remove it too)

Koenkk commented 1 year ago

Awesome! The extension is indeed a prototype, next step is to properly integrate install code support. @kirovilya does EZSP also support adding install code, if yes, what parameters does it need? For ZStack it need to ieeeAddr + installCode (see https://github.com/Koenkk/zigbee2mqtt/issues/13520#issuecomment-1230662569)

kirovilya commented 1 year ago

@Koenkk I think I can implement for the EZSP adapter. just need to figure out where to put the key and how to use it :) https://www.silabs.com/documents/public/application-notes/an1089-using-installation-codes-with-zigbee-devices.pdf

I have one device with this type of connection - Aqara Knob H1, although you can connect without an install code.

image

G$M:69775$S:680S00003915$D:0000000017B2335C%Z$A:54EF44100006E7DF$I:3313A005E177A647FC7925620AB207C4BEF5

danieledwardgeorgehitchcock commented 1 year ago

@safakaltun - do you want to have a go at a herdsman converter? I'm happy to have a go if not, just didn't want to duplicate effort...

safakaltun commented 1 year ago

@danieledwardgeorgehitchcock Sure thing. I will have a look at it tonight and see how much I can do. Have you seen anything interesting related to the exports when you did the sniff with the Bosch Smart Controller?

safakaltun commented 1 year ago

Hi again, I am little bit stuck, and can use some help. Below converter works fine to control the siren, set the volume and duration just fine. However, the exposed tamper doesn't work. It seems to be stuck in the "tampered" mode. Any ideas what could be the problem?

const fz = require('zigbee-herdsman-converters/converters/fromZigbee');
const tz = require('zigbee-herdsman-converters/converters/toZigbee');
const exposes = require('zigbee-herdsman-converters/lib/exposes');
const reporting = require('zigbee-herdsman-converters/lib/reporting');
const extend = require('zigbee-herdsman-converters/lib/extend');
const e = exposes.presets;
const ea = exposes.access;

const definition = {
    zigbeeModel: ['RBSH-OS-ZB-EU'], // The model ID from: Device with modelID 'lumi.sens' is not supported.
    model: 'BSIR-EZ', // Vendor model number, look on the device for a model number
    vendor: 'Bosch', // Vendor of the device (only used for documentation and startup logging)
    description: 'Wired/Wireless Smart Outdoor Siren', // Description of the device, copy from vendor site. (only used for documentation and startup logging)
    fromZigbee: [fz.battery, fz.ias_siren],
    toZigbee: [tz.warning],
    exposes: [e.warning(), e.battery(), e.battery_low(), e.tamper()],
    configure: async (device, coordinatorEndpoint, logger) => {
        device.defaultSendRequestWhen = 'immediate';
        device.save();
        await device.getEndpoint(1).unbind('genPollCtrl', coordinatorEndpoint);
    },
};

module.exports = definition;
danieledwardgeorgehitchcock commented 1 year ago

I'm looking into the tamper alarm. When looking at the debug log, it looks as though the tamper is reported on the ssIasZone cluster with the following data {"extendedstatus":0, "zonestatus":1188} - this message is both the same on a trigger and clear. Going to do some further sniffing to see if that yields anything further

danieledwardgeorgehitchcock commented 1 year ago

Looking at the sniff events, theres nothing to report with the tamper.

It looks to be an 'action' type response from the device rather than a binary i.e. it reports a tamper event each time the value of the tamper button changes.

That being said, I noticed when setting up the device with the native hub that there is a tamper self-test option in the configuration screen so, I am going to look into that to see if I can see anything - difficulty with this though, is I can't decrypt the sniff

Koenkk commented 1 year ago

Install codes are now supported (frontend Settings -> Tools -> Add install code)

Changes will be available in the dev branch in a few hours from now. (https://www.zigbee2mqtt.io/advanced/more/switch-to-dev-branch.html)

safakaltun commented 1 year ago

Thanks @Koenkk!

@danieledwardgeorgehitchcock have you managed to make any progress on the tamper button? I am in the middle of moving my place, so haven’t had a chance to look into this. I am wondering if the tamper integration is done in a similar way to a button or something like that.

danieledwardgeorgehitchcock commented 1 year ago

@safakaltun - yeah thats basically what I discovered above when looking at the debug logs.

I know that the Bosch app has the ability to test the tamper feature of the device but, without being able to decrypt the device to controller logs when the device is connected to its native hub, I am just going through a very manual process of figuring out which endpoints I can read from and write to, to see if I can fire a request to read the status when the event is fired

safakaltun commented 1 year ago

Install codes are now supported (frontend Settings -> Tools -> Add install code)

Changes will be available in the dev branch in a few hours from now. (https://www.zigbee2mqtt.io/advanced/more/switch-to-dev-branch.html)

Hi again @Koenkk,

I have tried this and works perfectly fine for the siren. However, another device (twinguard) from Bosch uses a different length for the install code. It appears that the length of the qr code for this device is 91, therefore “Add Install” function fails due to the length being shorter than 95 characters. Below is the install code from the twinguard:

RB01SG0D836591B3CC0010000000000000000000000D6F00179F2BC9DLKD0F471C9BBA2C0208608E91EED17E2B1

Is it possible to make this implementation more flexible?

Koenkk commented 1 year ago

@safakaltun can you try with RB01SG0D836591B3CC00100000000000000000000000000D6F00179F2BC9DLKD0F471C9BBA2C0208608E91EED17E2B1 ? I just added a few more zeros in the middle.

danieledwardgeorgehitchcock commented 1 year ago

I don't think that code will work.

Have a look at how I split out the QR code above.

You should just need the last 36 digits (32 network code and 4 CRC)

9DLKD0F471C9BBA2C0208608E91EED17E2B1

safakaltun commented 1 year ago

I tried adding padding in different places as well, but didn’t work unfortunately. When I try the above suggestion the error I get is:

09Request 'zigbee2mqtt/bridge/request/install_code/add' failed with error: 'SREQ '--> APP_CNF - bdbAddInstallCode - {"installCodeFormat":1,"ieeeaddr":"0x0000000D6F00179F","installCode":{"type":"Buffer","data":[157,0,208,244,113,201,187,162,192,32,134,8,233,30,237,23,226,177]}}' failed with status '(0x02: INVALID_PARAM)' (expected '(0x00: SUCCESS)')'

The additional zeros are interpreted as a part of the ieee address.

danieledwardgeorgehitchcock commented 1 year ago

I'd suggest you open up a new thread for this as it is a different device and you wouldn't want to muddy up this thread.

That being said, I have found an image of the label on the device and it looks as though it might be a type 2 (16 bytes for key derived from Install Code) - see ZStack Command Reference page above.

The confusing thing is that there is a 'Device Local Key' which appears to be 26 characters long so, I don't know how you would derive a link key from 26 non-hex characters...

Twinguard

Koenkk commented 1 year ago

@safakaltun I've added support for the 16 byte install code now, please check again in the latest dev (with the original key, not the one I added zeros to).

Changes will be available in the dev branch in a few hours from now. (https://www.zigbee2mqtt.io/advanced/more/switch-to-dev-branch.html)

github-actions[bot] commented 1 year ago

This issue is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 7 days

safakaltun commented 1 year ago

Not stale. Waiting for action from my end to push the converter file. I need to find the time to look into the issue with "tamper" integration.

danieledwardgeorgehitchcock commented 1 year ago

Would it be worth pushing what you have, then adding to it when you / I have worked out the tamper logic?

safakaltun commented 1 year ago

I am having a look at it now and I noticed that when I removed the siren to test, its zoneStatus went from 33956 to 32932. This corresponds to bit 10 going to 0 from 1. However, when I put the device back on the wall mount, zoneStatus did not go back to 33956. I am waiting to see if there is an internal timer that needs to be reset for the zoneStatus to go back to its previous value. My other theory is that the device might be waiting to be triggered for bit 10 to go back to its initial value - I will test this tomorrow.

I am not sure what bit 10 corresponds to as it is not explained in the Zigbee Cluster Library Specification. I am also not sure why Bosch did not use Bit 2 for tamper.

image

@danieledwardgeorgehitchcock it might be very helpful if you could also check the zoneStatus before and after removing the device from the wall mount if you have it already installed. If bit 10 changes for you as well, that can at least tell us.