Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

[Device Support Request] Sonoff SNZB-04p Zigbee Door/Window Sensor #3308

Open
lernerich opened this issue Aug 21, 2024 · 9 comments · May be fixed by #3665 or zigpy/zha#345
Open

[Device Support Request] Sonoff SNZB-04p Zigbee Door/Window Sensor #3308

lernerich opened this issue Aug 21, 2024 · 9 comments · May be fixed by #3665 or zigpy/zha#345
Labels
device support request This requests support for a new device

Comments

@lernerich
Copy link

Problem description

The device successfully pairs, and the primary binary sensor operates as expected.
However, the secondary binary sensor (tamper switch) does not function correctly; it remains in a "closed" state regardless of tampering or not.

Solution description

The tamper switch (rectius: secondary binary sensor) should detect and report any tampering by changing state from "closed" to "open" when triggered (or other proper states).

Screenshots/Video

Screenshots/Video

[Paste/upload your media here]

Device signature

Device signature
{
  "node_descriptor": {
    "logical_type": 2,
    "complex_descriptor_available": 0,
    "user_descriptor_available": 0,
    "reserved": 0,
    "aps_flags": 0,
    "frequency_band": 8,
    "mac_capability_flags": 128,
    "manufacturer_code": 4742,
    "maximum_buffer_size": 82,
    "maximum_incoming_transfer_size": 255,
    "server_mask": 11264,
    "maximum_outgoing_transfer_size": 255,
    "descriptor_capability_field": 0
  },
  "endpoints": {
    "1": {
      "profile_id": "0x0104",
      "device_type": "0x0402",
      "input_clusters": [
        "0x0000",
        "0x0001",
        "0x0003",
        "0x0020",
        "0x0500",
        "0xfc11",
        "0xfc57"
      ],
      "output_clusters": [
        "0x0003",
        "0x0006",
        "0x0019"
      ]
    }
  },
  "manufacturer": "eWeLink",
  "model": "SNZB-04P",
  "class": "zigpy.device.Device"
}

Diagnostic information

Diagnostic information
{
  "home_assistant": {
    "installation_type": "Home Assistant OS",
    "version": "2024.8.0",
    "dev": false,
    "hassio": true,
    "virtualenv": false,
    "python_version": "3.12.4",
    "docker": true,
    "arch": "aarch64",
    "timezone": "America/Sao_Paulo",
    "os_name": "Linux",
    "os_version": "6.6.31-haos-raspi",
    "supervisor": "2024.08.0",
    "host_os": "Home Assistant OS 12.4",
    "docker_version": "26.1.4",
    "chassis": "embedded",
    "run_as_root": true
  },
  "custom_components": {},
  "integration_manifest": {
    "domain": "zha",
    "name": "Zigbee Home Automation",
    "after_dependencies": [
      "onboarding",
      "usb"
    ],
    "codeowners": [
      "dmulcahey",
      "adminiuga",
      "puddly",
      "TheJulianJES"
    ],
    "config_flow": true,
    "dependencies": [
      "file_upload"
    ],
    "documentation": "https://www.home-assistant.io/integrations/zha",
    "iot_class": "local_polling",
    "loggers": [
      "aiosqlite",
      "bellows",
      "crccheck",
      "pure_pcapy3",
      "zhaquirks",
      "zigpy",
      "zigpy_deconz",
      "zigpy_xbee",
      "zigpy_zigate",
      "zigpy_znp",
      "zha",
      "universal_silabs_flasher"
    ],
    "requirements": [
      "universal-silabs-flasher==0.0.22",
      "zha==0.0.28"
    ],
    "usb": [
      {
        "vid": "10C4",
        "pid": "EA60",
        "description": "*2652*",
        "known_devices": [
          "slae.sh cc2652rb stick"
        ]
      },
      {
        "vid": "10C4",
        "pid": "EA60",
        "description": "*slzb-07*",
        "known_devices": [
          "smlight slzb-07"
        ]
      },
      {
        "vid": "1A86",
        "pid": "55D4",
        "description": "*sonoff*plus*",
        "known_devices": [
          "sonoff zigbee dongle plus v2"
        ]
      },
      {
        "vid": "10C4",
        "pid": "EA60",
        "description": "*sonoff*plus*",
        "known_devices": [
          "sonoff zigbee dongle plus"
        ]
      },
      {
        "vid": "10C4",
        "pid": "EA60",
        "description": "*tubeszb*",
        "known_devices": [
          "TubesZB Coordinator"
        ]
      },
      {
        "vid": "1A86",
        "pid": "7523",
        "description": "*tubeszb*",
        "known_devices": [
          "TubesZB Coordinator"
        ]
      },
      {
        "vid": "1A86",
        "pid": "7523",
        "description": "*zigstar*",
        "known_devices": [
          "ZigStar Coordinators"
        ]
      },
      {
        "vid": "1CF1",
        "pid": "0030",
        "description": "*conbee*",
        "known_devices": [
          "Conbee II"
        ]
      },
      {
        "vid": "0403",
        "pid": "6015",
        "description": "*conbee*",
        "known_devices": [
          "Conbee III"
        ]
      },
      {
        "vid": "10C4",
        "pid": "8A2A",
        "description": "*zigbee*",
        "known_devices": [
          "Nortek HUSBZB-1"
        ]
      },
      {
        "vid": "0403",
        "pid": "6015",
        "description": "*zigate*",
        "known_devices": [
          "ZiGate+"
        ]
      },
      {
        "vid": "10C4",
        "pid": "EA60",
        "description": "*zigate*",
        "known_devices": [
          "ZiGate"
        ]
      },
      {
        "vid": "10C4",
        "pid": "8B34",
        "description": "*bv 2010/10*",
        "known_devices": [
          "Bitron Video AV2010/10"
        ]
      }
    ],
    "zeroconf": [
      {
        "type": "_esphomelib._tcp.local.",
        "name": "tube*"
      },
      {
        "type": "_zigate-zigbee-gateway._tcp.local.",
        "name": "*zigate*"
      },
      {
        "type": "_zigstar_gw._tcp.local.",
        "name": "*zigstar*"
      },
      {
        "type": "_uzg-01._tcp.local.",
        "name": "uzg-01*"
      },
      {
        "type": "_slzb-06._tcp.local.",
        "name": "slzb-06*"
      },
      {
        "type": "_xzg._tcp.local.",
        "name": "xzg*"
      },
      {
        "type": "_czc._tcp.local.",
        "name": "czc*"
      }
    ],
    "is_built_in": true
  },
  "setup_times": {
    "null": {
      "setup": 0.00015310700000270572
    },
    "01J4MX3T2ZWXTQZGSP313K7SVA": {
      "wait_import_platforms": -0.0360018159999953,
      "wait_base_component": -0.0025521059999960016,
      "config_entry_setup": 19.607021302000007
    }
  },
  "data": {
    "ieee": "**REDACTED**",
    "nwk": 54364,
    "manufacturer": "eWeLink",
    "model": "SNZB-04P",
    "name": "eWeLink SNZB-04P",
    "quirk_applied": false,
    "quirk_class": "zigpy.device.Device",
    "quirk_id": null,
    "manufacturer_code": 4742,
    "power_source": "Battery or Unknown",
    "lqi": 140,
    "rssi": -65,
    "last_seen": "2024-08-21T18:23:26",
    "available": true,
    "device_type": "EndDevice",
    "signature": {
      "node_descriptor": {
        "logical_type": 2,
        "complex_descriptor_available": 0,
        "user_descriptor_available": 0,
        "reserved": 0,
        "aps_flags": 0,
        "frequency_band": 8,
        "mac_capability_flags": 128,
        "manufacturer_code": 4742,
        "maximum_buffer_size": 82,
        "maximum_incoming_transfer_size": 255,
        "server_mask": 11264,
        "maximum_outgoing_transfer_size": 255,
        "descriptor_capability_field": 0
      },
      "endpoints": {
        "1": {
          "profile_id": "0x0104",
          "device_type": "0x0402",
          "input_clusters": [
            "0x0000",
            "0x0001",
            "0x0003",
            "0x0020",
            "0x0500",
            "0xfc11",
            "0xfc57"
          ],
          "output_clusters": [
            "0x0003",
            "0x0006",
            "0x0019"
          ]
        }
      },
      "manufacturer": "eWeLink",
      "model": "SNZB-04P"
    },
    "active_coordinator": false,
    "entities": [
      {
        "entity_id": "binary_sensor.ewelink_snzb_04p_abrindo",
        "name": "eWeLink SNZB-04P"
      },
      {
        "entity_id": "binary_sensor.ewelink_snzb_04p_abrindo_2",
        "name": "eWeLink SNZB-04P"
      },
      {
        "entity_id": "button.ewelink_snzb_04p_identificar",
        "name": "eWeLink SNZB-04P"
      },
      {
        "entity_id": "sensor.ewelink_snzb_04p_bateria",
        "name": "eWeLink SNZB-04P"
      },
      {
        "entity_id": "update.ewelink_snzb_04p_firmware",
        "name": "eWeLink SNZB-04P"
      }
    ],
    "neighbors": [],
    "routes": [],
    "endpoint_names": [
      {
        "name": "IAS_ZONE"
      }
    ],
    "user_given_name": null,
    "device_reg_id": "1875942e58a791505f1be3a3675bef62",
    "area_id": null,
    "cluster_details": {
      "1": {
        "device_type": {
          "name": "IAS_ZONE",
          "id": 1026
        },
        "profile_id": 260,
        "in_clusters": {
          "0x0000": {
            "endpoint_attribute": "basic",
            "attributes": {
              "0x0004": {
                "attribute_name": "manufacturer",
                "value": "eWeLink"
              },
              "0x0005": {
                "attribute_name": "model",
                "value": "SNZB-04P"
              }
            },
            "unsupported_attributes": {}
          },
          "0x0001": {
            "endpoint_attribute": "power",
            "attributes": {
              "0x0021": {
                "attribute_name": "battery_percentage_remaining",
                "value": 200
              },
              "0x0020": {
                "attribute_name": "battery_voltage",
                "value": 30
              }
            },
            "unsupported_attributes": {
              "0x0033": {
                "attribute_name": "battery_quantity"
              },
              "0x0031": {
                "attribute_name": "battery_size"
              },
              "0xfffe": {
                "attribute_name": "reporting_status"
              },
              "0x0010": {
                "attribute_name": "mains_alarm_mask"
              }
            }
          },
          "0x0003": {
            "endpoint_attribute": "identify",
            "attributes": {},
            "unsupported_attributes": {}
          },
          "0x0020": {
            "endpoint_attribute": "poll_control",
            "attributes": {
              "0x0000": {
                "attribute_name": "checkin_interval",
                "value": 13200
              }
            },
            "unsupported_attributes": {}
          },
          "0x0500": {
            "endpoint_attribute": "ias_zone",
            "attributes": {
              "0x0010": {
                "attribute_name": "cie_addr",
                "value": "e8:e0:7e:ff:fe:7a:f6:75"
              },
              "0x0000": {
                "attribute_name": "zone_state",
                "value": 1
              },
              "0x0002": {
                "attribute_name": "zone_status",
                "value": 0
              },
              "0x0001": {
                "attribute_name": "zone_type",
                "value": 21
              }
            },
            "unsupported_attributes": {}
          },
          "0xfc57": {
            "endpoint_attribute": "manufacturer_specific",
            "attributes": {},
            "unsupported_attributes": {}
          },
          "0xfc11": {
            "endpoint_attribute": "manufacturer_specific",
            "attributes": {},
            "unsupported_attributes": {}
          }
        },
        "out_clusters": {
          "0x0003": {
            "endpoint_attribute": "identify",
            "attributes": {},
            "unsupported_attributes": {}
          },
          "0x0006": {
            "endpoint_attribute": "on_off",
            "attributes": {},
            "unsupported_attributes": {
              "0x0000": {
                "attribute_name": "on_off"
              },
              "0x4003": {
                "attribute_name": "start_up_on_off"
              }
            }
          },
          "0x0019": {
            "endpoint_attribute": "ota",
            "attributes": {
              "0x0002": {
                "attribute_name": "current_file_version",
                "value": 8704
              }
            },
            "unsupported_attributes": {}
          }
        }
      }
    }
  }
}

Logs

Logs
[Paste the logs here]

Custom quirk

Custom quirk
[Paste your custom quirk here]

Additional information

The official Sonoff webpage shows the tamper alert doesn't work in ZHA: https://sonoff.tech/product/gateway-and-sensors/snzb-04p/

@lernerich
Copy link
Author

Despite the fact that two binary sensors appear on the ZHA, the second non-functional sensor is not the tamper.
The tamper has a manufacturer-specific cluster (0xFC11).
In another sensor's quirk (Sonoff SNZB-06), this cluster is named as follows:
SONOFF_CLUSTER_FC11_ID = 0xFC11
There, a custom cluster replaces the original ManufacturerSpecificCluster.
With the same technique, it is possible to read the sensor state, as an attribute, in the system. But I was unable to configure a sensor in Home Assistant with these binary values.

@Nbird67
Copy link

Nbird67 commented Dec 6, 2024

Some news about the support ?
Thank you

@derderdercrusader
Copy link

+1

@mguaylam
Copy link
Contributor

mguaylam commented Jan 2, 2025

Right now I can see 1 or 2 issue but should not be incredibly hard to fix.

  • Reporting look not right for the opening. It does report but there does not seem to be anything periodic.
  • We need to gather attributes information since some stuff seem to be implemented in manufacturer specific clusters.
  • There is a manufacturer specific cluster for 0xFC57 but no indication what it is for.
  • We need to find what's creating the second opening entity and it's probably not the tamper. But there is a IAS cluster and I think it should at least try to create a contact entity from it.
  • ITead pushed this but it's not terribly interesting. But this is the the part they implemented manually and is interesting, also gives us the type.

One hypothesis would be that the contact entity comes from the IAS cluster and the other one from the on/off one but it is not working as intended.

I have written to ITead support to have some information on this device.
Tamper will probably be done via the FC11 with a v2 quirk but we will need to implement reporting for it in ZHA.

For my reference, their manufacturer code.

Things to do :

  • Implement 0xFC11 reporting in ZHA.
  • Implement 0xFC11 in a v2 quirk.
  • Fix opening reporting.
Cluster testing for my reference Obtenir le status : service: zha_toolkit.conf_report_read data: ieee: 0c:ef:f6:ff:fe:90:46:16 endpoint: 1 cluster: 0x0500 attribute: 0x0000 manf: 0x1286

Configuration attribut :
service: zha_toolkit.conf_report
data:
ieee: 0c:ef:f6:ff:fe:90:46:16
endpoint: 1
cluster: 0x0500
attribute: 0x0000
min_interval: 0
max_interval: 300
reportable_change: 1
manf: 0x1286
tries: 3

Obtenir le status :
service: zha_toolkit.conf_report_read
data:
ieee: 0c:ef:f6:ff:fe:90:46:16
endpoint: 1
cluster: 0xfc11
attribute: 0x2000
manf: 0x1286

Configuration attribut :
service: zha_toolkit.conf_report
data:
ieee: 0c:ef:f6:ff:fe:90:46:16
endpoint: 1
cluster: 0xfc11
attribute: 0x2000
min_interval: 0
max_interval: 60
reportable_change: 1
manf: 0x1286
tries: 3

@mguaylam
Copy link
Contributor

mguaylam commented Jan 2, 2025

I tried to configure reporting on the IAS zone state but it does not look promising : success: false. Reporting configuration is not standard on a IAS cluster I think.
At least the water leak sensor does report itself at 12 minutes so that's less depressing.

@mguaylam
Copy link
Contributor

mguaylam commented Jan 2, 2025

Hey there @liangjia2019, sorry to bother you.

I saw you implemented the ZigBee2MQTT part for this device for Itead, would you mind sharing cluster details about this device so I can properly handle it? Especially 0xFC57 and 0xFC11?

More importantly, would it be possible to update the device to do reporting on the IAS cluster for every 10-15 minutes like the SNZB-05P?
The device does not report again when there is a network failure and is a security issue for the house.

@liangjia2019
Copy link

Hey there @liangjia2019, sorry to bother you.

I saw you implemented the ZigBee2MQTT part for this device for Itead, would you mind sharing cluster details about this device so I can properly handle it? Especially 0xFC57 and 0xFC11?

More importantly, would it be possible to update the device to do reporting on the IAS cluster for every 10-15 minutes like the SNZB-05P? The device does not report again when there is a network failure and is a security issue for the house.

Hi mguaylam , I'm glad to receive your message.

Here are some relevant information I know:
tamper cluster:0xfc11 attribute:0x2000 datatype:0x20 value: 0x00 installation 0x01 removal

Cluster: 0xFC57 was Works with All Hubs (WWAH) Cluster,He currently only works on Amazon Hub,You can ignore.

He is currently unable to report to the cluster within 10-15 minutes, but he may achieve it in the near future.

@mguaylam
Copy link
Contributor

mguaylam commented Jan 3, 2025

Thank you for your fast reply @liangjia2019! Really appreciate your help on this matter.
I just finished integrating the tamper sensor and the reporting.

Unfortunately I see two major issues :

  • No reporting interval of less than an hour on cluster 0x0500 ➡️ attribute 0x0002 (IAS)
  • Reporting configuration is refused on cluster:0xfc11 ➡️ attribute:0x2000 (tamper)
    • result : success: false ➡️ currently at min_interval: 1, max_interval: 65534 and reportable_change: 0

Things that need to be fixed in the firmware :

  • Reporting max interval for cluster 0x0500 ➡️ attribute 0x0002 to 900 (15 minutes or something reasonable)
  • Allow reporting configuration for cluster 0xfc11 ➡️ attribute 0x2000 (no constraint)

We would love to have your help on this matter in order to make this sensor a great recommendation for ZHA. Would you guys be interested into fixing those issues?

Thank you for your help.

@liangjia2019
Copy link

Thank you for your fast reply @liangjia2019! Really appreciate your help on this matter. I just finished integrating the tamper sensor and the reporting.

Unfortunately I see two major issues :

  • No reporting interval of less than an hour on cluster 0x0500 ➡️ attribute 0x0002 (IAS)

  • Reporting configuration is refused on cluster:0xfc11 ➡️ attribute:0x2000 (tamper)

    • result : success: false ➡️ currently at min_interval: 1, max_interval: 65534 and reportable_change: 0

Things that need to be fixed in the firmware :

  • Reporting max interval for cluster 0x0500 ➡️ attribute 0x0002 to 900 (15 minutes or something reasonable)
  • Allow reporting configuration for cluster 0xfc11 ➡️ attribute 0x2000 (no constraint)

We would love to have your help on this matter in order to make this sensor a great recommendation for ZHA. Would you guys be interested into fixing those issues?

Thank you for your help.

They will solve it in the near future. Thank you for your feedback.

@TheJulianJES TheJulianJES added the device support request This requests support for a new device label Jan 26, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
device support request This requests support for a new device
Projects
None yet
7 participants
@TheJulianJES @mguaylam @liangjia2019 @Nbird67 @lernerich @derderdercrusader and others