Bosch Smoke Alarm II

I think it’s long overdue that we get a good ZigBee based smoke detector and it seems that the Bosch Smoke Alarm II is finally the solution. The new V2 is now Zigbee based (V1 was WiFi).

I have created the respective GitHub request however it seems that device does not provide the cluster infos - or rather deCONZ is not able to retrieve them.

On the device is a Zigbee EUI-64 code and an installer-code - maybe this helps?

Link to GitHub: Device name · Issue #6421 · dresden-elektronik/deconz-rest-plugin · GitHub

I bought one of those devices and managed to pair it, but there is no DDF so I created a draft one which seems to work but it would be good if an expert like @Smanar could have a look :slight_smile:

First the steps for pairing:

  1. Install the install code via the deconz REST API. I use Postman for this but there are many options for API tools.
  2. In Phoscon, scan for a new sensor and put the battery in/remove the protective lid.
  3. In the Deconz GUI, a new node appears but it is not recognized by Phoscon due to lack of a suitable DDF.

With the below DDF, it is recognized with the following properties, which seem to look quite OK on a first glance, although the device appears in Phoscon as CO sensor (?):

{
    "config": {
        "battery": 100,
        "on": true,
        "reachable": true
    },
    "etag": "551c2814fd8728494c09e60943eb4e77",
    "lastannounced": null,
    "lastseen": "2023-11-02T14:04Z",
    "manufacturername": "Bosch",
    "modelid": "RBSH-SD-ZB-EU",
    "name": "RBSH-SD-ZB-EU",
    "state": {
        "fire": false,
        "lastupdated": "2023-11-02T14:05:22.195",
        "lowbattery": false,
        "tampered": false,
        "test": false
    },
    "swversion": "1.10",
    "type": "ZHAFire",
    "uniqueid": "70:ac:08:ff:fe:64:e7:07-01-0500"
}

And here is the DDF, any help and review is welcome. One thing I noticed is that the IAS zone state is reported as “not enrolled”, but I don’t know whether it has an impact or not.

image

{
  "schema": "devcap1.schema.json",
  "manufacturername": "$MF_BOSCH",
  "modelid": "RBSH-SD-ZB-EU",
  "vendor": "Bosch",
  "product": "RBSH-SD-ZB-EU",
  "sleeper": true,
  "status": "Gold",
  "path": "/devices/rbsh-sd-zb-eu.json",
  "subdevices": [
    {
      "type": "$TYPE_FIRE_SENSOR",
      "restapi": "/sensors",
      "uuid": [
        "$address.ext",
        "0x01",
        "0x0500"
      ],
      "items": [
        {
          "name": "attr/id"
        },
        {
          "name": "attr/lastannounced"
        },
        {
          "name": "attr/lastseen"
        },
        {
          "name": "attr/manufacturername"
        },
        {
          "name": "attr/modelid"
        },
        {
          "name": "attr/name"
        },
        {
          "name": "attr/swversion"
        },
        {
          "name": "attr/type"
        },
        {
          "name": "attr/uniqueid"
        },
        {
          "name": "config/battery",
          "refresh.interval": 84000,
          "read": {
            "at": "0x0021",
            "cl": "0x0001",
            "ep": 1,
            "fn": "zcl"
          },
          "parse": {
            "at": "0x0021",
            "cl": "0x0001",
            "ep": 1,
            "eval": "Item.val = Attr.val / 2",
            "fn": "zcl"
          },
          "default": 0
        },
        {
          "name": "config/on"
        },
        {
          "name": "config/reachable"
        },
        {
          "name": "state/fire"
        },
        {
          "name": "state/lastupdated"
        },
        {
          "name": "state/lowbattery",
          "description": "True when the device battery runs low."
        },
        {
          "name": "state/tampered",
          "parse": {
            "fn": "ias:zonestatus",
            "mask": "tamper"
          }
        },
        {
          "name": "state/test",
          "parse": {
            "fn": "ias:zonestatus",
            "mask": "test"
          },
          "default": false
        }
      ]
    }
  ],
  "bindings": [
    {
      "bind": "unicast",
      "src.ep": 1,
      "cl": "0x0001",
      "report": [
        {
          "at": "0x0021",
          "dt": "0x20",
          "min": 0,
          "max": 8400
        }
      ]
    }
  ]
}

Hello,

Not your fault, your device json is fine, it’s certainly from phoscon.

"type": "ZHAFire",

the IAS zone state is reported as “not enrolled”

Yes, generally this kind of device need enrollement, but if it work without …
If you need enrollement (for exemple I don’t think the tamper can work without it), just add in your DDF

        {
          "name": "config/enrolled"
        },
        {
          "name": "config/pending"
        },

The enrollement will be done itself (can take time if the device is already included, lazy device)
And you can remove all

          "parse": {
            "fn": "ias:zonestatus",
            "mask": "XXXX"
          }

I have big doubt thoses part are usefull.

To compare you have another bosh IAS device here https://github.com/dresden-elektronik/deconz-rest-plugin/blob/master/devices/bosch/bwa-1_water_sensor.json

And ofc, when all is fine for you, don’t forget to make a PR to submit the device ^^ (I can do it, but I can explain how to do if needed)

Thanks Smanar! Here is the updated DDF. All attributes are exposed via API, however I am not sure whether signalling does actually work. If I press the test button on the device, the alarm is sounded but there is no change of state visible for the “test” attribute in the API. I will try to look a bit in the logs. Also, there should be some way to trigger the siren, but I did not yet find how.

{
  "schema": "devcap1.schema.json",
  "manufacturername": "$MF_BOSCH",
  "modelid": "RBSH-SD-ZB-EU",
  "vendor": "Bosch",
  "product": "Smoke Alarm II",
  "sleeper": true,
  "status": "Gold",
  "path": "/devices/rbsh-sd-zb-eu.json",
  "subdevices": [
    {
      "type": "$TYPE_FIRE_SENSOR",
      "restapi": "/sensors",
      "uuid": [
        "$address.ext",
        "0x01",
        "0x0500"
      ],
      "items": [
        {
          "name": "attr/id"
        },
        {
          "name": "attr/lastannounced"
        },
        {
          "name": "attr/lastseen"
        },
        {
          "name": "attr/manufacturername"
        },
        {
          "name": "attr/modelid"
        },
        {
          "name": "attr/name"
        },
        {
          "name": "attr/swversion"
        },
        {
          "name": "attr/type"
        },
        {
          "name": "attr/uniqueid"
        },
        {
          "name": "config/battery",
          "parse": {
            "at": "0x0021",
            "cl": "0x0001",
            "ep": 1,
            "eval": "Item.val = Attr.val / 2",
            "fn": "zcl"
          },
          "default": 0
        },
        {
          "name": "config/checkin",
          "public": false,
          "refresh.interval": 3599,
          "default": 14400
        },
        {
          "name": "config/enrolled",
          "public": false
        },
        {
          "name": "config/on"
        },
        {
          "name": "config/pending",
        },
        {
          "name": "config/reachable"
        },
        {
          "name": "state/fire",
          "awake": true
        },
        {
          "name": "state/lastupdated"
        },
        {
          "name": "state/lowbattery",
        },
        {
          "name": "state/tampered",
          "awake": true
        },
        {
          "name": "state/test",
          "awake": true
        }
      ]
    }
  ],
  "bindings": [
    {
      "bind": "unicast",
      "src.ep": 1,
      "cl": "0x0001",
      "report": [
        {
          "at": "0x0021",
          "dt": "0x20",
          "min": 600,
          "max": 43200,
          "change": "0x00000001"
        }
      ]
    },
    {
      "bind": "unicast",
      "src.ep": 1,
      "cl": "0x0500"
    }
  ]
}

You can remove the "name": "config/checkin" part.
And this device haven’t siren, no ?
But from what I m reading it need to have a test mode. (I m not sure for the tamper, I think no)
The device is enrolled now ?

The state/fire don’t move when you use the test button ?

I will try to look a bit in the logs

Yep, if you are using the GUI, can take a look in deconz/help/debug view with flag “DDF” , “Info” and “info_l2”

I did some tests now. When I press the test button on the device, the alarm sounds but there is no message in the logs from the device visible. DDF seems to be working fine, below are the items created for the sub-device (ignore the “checkin”, I did not yet remove it). Note that GUI still indicates “not enrolled” (for zone 0). I am a bit lost…

PS: I played with the “Zone Enroll Request” button in the GUI, but I get a “UNSUP_CLUSTER_COMMAND” error.

09:48:03:454 sub-device: 70:ac:08:ff:fe:64:e7:07-01-0500, has item: attr/id
09:48:03:456 sub-device: 70:ac:08:ff:fe:64:e7:07-01-0500, has item: attr/lastannounced
09:48:03:458 sub-device: 70:ac:08:ff:fe:64:e7:07-01-0500, has item: attr/lastseen
09:48:03:459 sub-device: 70:ac:08:ff:fe:64:e7:07-01-0500, has item: attr/manufacturername
09:48:03:460 sub-device: 70:ac:08:ff:fe:64:e7:07-01-0500, has item: attr/modelid
09:48:03:460 sub-device: 70:ac:08:ff:fe:64:e7:07-01-0500, has item: attr/name
09:48:03:461 sub-device: 70:ac:08:ff:fe:64:e7:07-01-0500, has item: attr/swversion
09:48:03:462 sub-device: 70:ac:08:ff:fe:64:e7:07-01-0500, has item: attr/type
09:48:03:463 sub-device: 70:ac:08:ff:fe:64:e7:07-01-0500, has item: attr/uniqueid
09:48:03:464 sub-device: 70:ac:08:ff:fe:64:e7:07-01-0500, create item: config/battery
09:48:03:467 sub-device: 70:ac:08:ff:fe:64:e7:07-01-0500, create item: config/checkin
09:48:03:469 sub-device: 70:ac:08:ff:fe:64:e7:07-01-0500, create item: config/enrolled
09:48:03:470 sub-device: 70:ac:08:ff:fe:64:e7:07-01-0500, has item: config/on
09:48:03:471 sub-device: 70:ac:08:ff:fe:64:e7:07-01-0500, create item: config/pending
09:48:03:472 sub-device: 70:ac:08:ff:fe:64:e7:07-01-0500, has item: config/reachable
09:48:03:473 sub-device: 70:ac:08:ff:fe:64:e7:07-01-0500, create item: state/fire
09:48:03:473 sub-device: 70:ac:08:ff:fe:64:e7:07-01-0500, has item: state/lastupdated
09:48:03:474 sub-device: 70:ac:08:ff:fe:64:e7:07-01-0500, create item: state/lowbattery
09:48:03:475 sub-device: 70:ac:08:ff:fe:64:e7:07-01-0500, create item: state/tampered
09:48:03:476 sub-device: 70:ac:08:ff:fe:64:e7:07-01-0500, create item: state/test

On the siren, acc. to the device description, it can be triggered in case of an alarm (German only): Funk-Rauchwarnmelder kaufen | Bosch Smart Home

Try a re-inclusion with the good DDF, perhaps the device is too lazed fo finish the operation after this step.
You can too remove the "public": false to see the status using API. And in config/pending you will see the enrollement step.

For the siren I can tell more if you can share the node description, with all cluster/endpoint

I re-paired with the new cleaned-up DDF where I removed the tamper, checkin, etc. Until now, no changes in behaviour - if I press the test button, the alarm sounds but nothing is visible in the logs. BTW, here is the corresponding device definition in Zigbee2mqtt (link).

    {
        zigbeeModel: ['RBSH-SD-ZB-EU'],
        model: 'BSD-2',
        vendor: 'Bosch',
        description: 'Smoke alarm detector',
        fromZigbee: [fz.battery, fz.ias_smoke_alarm_1],
        toZigbee: [],
        meta: {},
        configure: async (device, coordinatorEndpoint, logger) => {
            const endpoint = device.getEndpoint(1);
            await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 64684]);
            await reporting.batteryPercentageRemaining(endpoint);
        },
        exposes: [e.smoke(), e.battery(), e.battery_low(), e.test()],
    },

Current API output (after ca. 1h):

                    {
    "config": {
        "battery": 100,
        "on": true,
        "pending": [],
        "reachable": true
    },
    "etag": "9890ff07b82cd7fe45ca61fae4c44314",
    "lastannounced": null,
    "lastseen": "2023-11-13T10:09Z",
    "manufacturername": "Bosch",
    "modelid": "RBSH-SD-ZB-EU",
    "name": "RBSH-SD-ZB-EU",
    "state": {
        "fire": false,
        "lastupdated": "none",
        "test": false
    },
    "swversion": "1.10",
    "type": "ZHAFire",
    "uniqueid": "70:ac:08:ff:fe:64:e7:07-01-0500"
}

Regarding the siren, there are related stale issues in zigbee2mqtt but no solution yet.

The device is enrolled now ?
Do you have some log from deconz when pressing the button ? With flag “info” “info_l2” and “DDF”( and “ZCL” if there is nothing usefull on other flags)

Edit:
You miss the fingerPrint (used for IAS devices)

      "0x0500"
      ],
      "fingerprint": {
        "profile": "0x0104",
        "device": "0x0402",
        "endpoint": "0x01",
        "in": [
          "0x0000",
          "0x0001",
          "0x0500"
        ]
      },
      "items": [

That was the missing piece - it is working now, thanks Smanar, PR will be created. I will add the “lowbattery” attribute still.

{
  "schema": "devcap1.schema.json",
  "manufacturername": "$MF_BOSCH",
  "modelid": "RBSH-SD-ZB-EU",
  "vendor": "Bosch",
  "product": "Smoke Alarm II",
  "sleeper": true,
  "status": "Gold",
  "subdevices": [
    {
      "type": "$TYPE_FIRE_SENSOR",
      "restapi": "/sensors",
      "uuid": [
        "$address.ext",
        "0x01",
        "0x0500"
      ],
      "fingerprint": {
        "profile": "0x0104",
        "device": "0x0402",
        "endpoint": "0x01",
        "in": [
          "0x0000",
          "0x0001",
          "0x0500"
        ]
      },
      "items": [
        {
          "name": "attr/id"
        },
        {
          "name": "attr/lastannounced"
        },
        {
          "name": "attr/lastseen"
        },
        {
          "name": "attr/manufacturername"
        },
        {
          "name": "attr/modelid"
        },
        {
          "name": "attr/name"
        },
        {
          "name": "attr/swversion"
        },
        {
          "name": "attr/type"
        },
        {
          "name": "attr/uniqueid"
        },
        {
          "name": "config/battery",
          "parse": {
            "at": "0x0021",
            "cl": "0x0001",
            "ep": 1,
            "eval": "Item.val = Attr.val / 2",
            "fn": "zcl"
          },
          "default": 0
        },
        {
          "name": "config/enrolled",
          "public": false
        },
        {
          "name": "config/on"
        },
        {
          "name": "config/pending"
        },
        {
          "name": "config/reachable"
        },
        {
          "name": "state/fire",
          "awake": true
        },
        {
          "name": "state/lastupdated"
        },
        {
          "name": "state/test",
          "awake": true
        }
      ]
    }
  ],
  "bindings": [
    {
      "bind": "unicast",
      "src.ep": 1,
      "cl": "0x0001",
      "report": [
        {
          "at": "0x0021",
          "dt": "0x20",
          "min": 600,
          "max": 43200,
          "change": "0x00000001"
        }
      ]
    },
    {
      "bind": "unicast",
      "src.ep": 1,
      "cl": "0x0500"
    }
  ]
}

PS: PR created here.