Skip to content

Conversation

@barnslig
Copy link

@barnslig barnslig commented Dec 22, 2025

Proposed change

This PR adds a quirk for the ubisys H1 thermostatic radiator valve.

The device has a few quirks:

  • There are manufacturer-specific attributes in the Thermostat cluster that need to be implemented.
  • The manufacturer-specific attributes in the Thermostat cluster have conflicting IDs with ZCL attributes.
  • When writing manufacturer-specific attributes, the attribute needs to be explicitely read after write to update the Home Assistant entity.

This PR adds the manufacturer-specific attributes and implements a mechanism to rewrite attribute IDs during attribute read and write. I am not sure if the proposed implementation is optimal, see my discussion #4587.

The Zigbee interface of the ubisys H1 is documented here: ubisys H1 Reference Manual.

Additional information

This PR does not expose attributes related to the scheduling feature of the thermostat.

As stated by the reference manual, the device needs at least application firmware 1.6.0 for some attributes to be available. To update the device using Home Assistant, add the following lines to the configuration.yaml:

zha:
  zigpy_config:
    ota:
      extra_providers:
        - type: z2m
          manufacturer_ids:
            - 0x10F2 # ubisys

The firmware changelog can be found here: ubisys H1 Firmware Change Logs. Firmware updates can also be manually obtained from the manufacturer: Firmware for Zigbee products by ubisys.

Device diagnostics

Details
{
  "home_assistant": {
    "installation_type": "Home Assistant OS",
    "version": "2025.12.4",
    "dev": false,
    "hassio": true,
    "virtualenv": false,
    "python_version": "3.13.9",
    "docker": true,
    "arch": "aarch64",
    "timezone": "Europe/Berlin",
    "os_name": "Linux",
    "os_version": "6.12.47-haos-raspi",
    "container_arch": "aarch64",
    "supervisor": "2025.12.3",
    "host_os": "Home Assistant OS 16.3",
    "docker_version": "28.3.3",
    "chassis": "embedded",
    "run_as_root": true
  },
  "custom_components": {
    "myskoda": {
      "documentation": "https://github.com/skodaconnect/homeassistant-myskoda/blob/main/README.md",
      "version": "1.29.2",
      "requirements": [
        "myskoda==2.5.1"
      ]
    },
    "hacs": {
      "documentation": "https://hacs.xyz/docs/use/",
      "version": "2.0.5",
      "requirements": [
        "aiogithubapi>=22.10.1"
      ]
    },
    "dreame_vacuum": {
      "documentation": "https://github.com/Tasshack/dreame-vacuum/tree/dev?tab=readme-ov-file#features",
      "version": "v2.0.0b19",
      "requirements": [
        "pillow",
        "numpy",
        "pybase64",
        "requests",
        "pycryptodome",
        "python-miio",
        "py-mini-racer",
        "paho-mqtt"
      ]
    }
  },
  "integration_manifest": {
    "domain": "zha",
    "name": "Zigbee Home Automation",
    "after_dependencies": [
      "hassio",
      "onboarding",
      "usb"
    ],
    "codeowners": [
      "dmulcahey",
      "adminiuga",
      "puddly",
      "TheJulianJES"
    ],
    "config_flow": true,
    "dependencies": [
      "file_upload",
      "homeassistant_hardware"
    ],
    "documentation": "https://www.home-assistant.io/integrations/zha",
    "integration_type": "hub",
    "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": [
      "zha==0.0.81"
    ],
    "usb": [
      {
        "description": "*2652*",
        "known_devices": [
          "slae.sh cc2652rb stick"
        ],
        "pid": "EA60",
        "vid": "10C4"
      },
      {
        "description": "*slzb-07*",
        "known_devices": [
          "smlight slzb-07"
        ],
        "pid": "EA60",
        "vid": "10C4"
      },
      {
        "description": "*sonoff*plus*",
        "known_devices": [
          "sonoff zigbee dongle plus v2"
        ],
        "pid": "55D4",
        "vid": "1A86"
      },
      {
        "description": "*sonoff*plus*",
        "known_devices": [
          "sonoff zigbee dongle plus"
        ],
        "pid": "EA60",
        "vid": "10C4"
      },
      {
        "description": "*tubeszb*",
        "known_devices": [
          "TubesZB Coordinator"
        ],
        "pid": "EA60",
        "vid": "10C4"
      },
      {
        "description": "*tubeszb*",
        "known_devices": [
          "TubesZB Coordinator"
        ],
        "pid": "7523",
        "vid": "1A86"
      },
      {
        "description": "*zigstar*",
        "known_devices": [
          "ZigStar Coordinators"
        ],
        "pid": "7523",
        "vid": "1A86"
      },
      {
        "description": "*conbee*",
        "known_devices": [
          "Conbee II"
        ],
        "pid": "0030",
        "vid": "1CF1"
      },
      {
        "description": "*conbee*",
        "known_devices": [
          "Conbee III"
        ],
        "pid": "6015",
        "vid": "0403"
      },
      {
        "description": "*zigbee*",
        "known_devices": [
          "Nortek HUSBZB-1"
        ],
        "pid": "8A2A",
        "vid": "10C4"
      },
      {
        "description": "*zigate*",
        "known_devices": [
          "ZiGate+"
        ],
        "pid": "6015",
        "vid": "0403"
      },
      {
        "description": "*zigate*",
        "known_devices": [
          "ZiGate"
        ],
        "pid": "EA60",
        "vid": "10C4"
      },
      {
        "description": "*bv 2010/10*",
        "known_devices": [
          "Bitron Video AV2010/10"
        ],
        "pid": "8B34",
        "vid": "10C4"
      },
      {
        "description": "*sonoff*max*",
        "known_devices": [
          "SONOFF Dongle Max MG24"
        ],
        "pid": "EA60",
        "vid": "10C4"
      },
      {
        "description": "*sonoff*lite*mg21*",
        "known_devices": [
          "sonoff zigbee dongle lite mg21"
        ],
        "pid": "EA60",
        "vid": "10C4"
      }
    ],
    "zeroconf": [
      {
        "name": "tube*",
        "type": "_esphomelib._tcp.local."
      },
      {
        "name": "*zigate*",
        "type": "_zigate-zigbee-gateway._tcp.local."
      },
      {
        "name": "*zigstar*",
        "type": "_zigstar_gw._tcp.local."
      },
      {
        "name": "uzg-01*",
        "type": "_uzg-01._tcp.local."
      },
      {
        "name": "slzb-06*",
        "type": "_slzb-06._tcp.local."
      },
      {
        "name": "xzg*",
        "type": "_xzg._tcp.local."
      },
      {
        "name": "czc*",
        "type": "_czc._tcp.local."
      },
      {
        "name": "*",
        "type": "_zigbee-coordinator._tcp.local."
      }
    ],
    "is_built_in": true,
    "overwrites_built_in": false
  },
  "setup_times": {
    "null": {
      "setup": 9.03330510482192e-05
    },
    "01JEDWNW42RSX0G8XY1EQPRR00": {
      "wait_import_platforms": -0.01799302303697914,
      "wait_base_component": -0.0005492060445249081,
      "config_entry_setup": 5.663394168950617
    }
  },
  "data": {
    "version": 1,
    "ieee": "**REDACTED**",
    "nwk": "0xD8DC",
    "manufacturer": "ubisys",
    "model": "H1",
    "friendly_manufacturer": "ubisys",
    "friendly_model": "H1",
    "name": "ubisys H1",
    "quirk_applied": true,
    "quirk_class": "zigpy.quirks.v2.CustomDeviceV2",
    "exposes_features": [],
    "manufacturer_code": 4338,
    "power_source": "Battery or Unknown",
    "lqi": null,
    "rssi": null,
    "last_seen": "2025-12-22T18:49:41.479549+00:00",
    "available": true,
    "device_type": "EndDevice",
    "active_coordinator": false,
    "node_descriptor": {
      "logical_type": "EndDevice",
      "complex_descriptor_available": false,
      "user_descriptor_available": false,
      "reserved": 0,
      "aps_flags": 0,
      "frequency_band": 8,
      "mac_capability_flags": 128,
      "manufacturer_code": 4338,
      "maximum_buffer_size": 127,
      "maximum_incoming_transfer_size": 242,
      "server_mask": 11264,
      "maximum_outgoing_transfer_size": 242,
      "descriptor_capability_field": 0
    },
    "endpoints": {
      "1": {
        "profile_id": 260,
        "device_type": {
          "name": "THERMOSTAT",
          "id": 769
        },
        "in_clusters": [
          {
            "cluster_id": "0x0000",
            "endpoint_attribute": "basic",
            "attributes": [
              {
                "id": "0x0004",
                "name": "manufacturer",
                "zcl_type": "string",
                "value": "ubisys"
              },
              {
                "id": "0x0005",
                "name": "model",
                "zcl_type": "string",
                "value": "H1"
              }
            ]
          },
          {
            "cluster_id": "0x0001",
            "endpoint_attribute": "power",
            "attributes": [
              {
                "id": "0x0021",
                "name": "battery_percentage_remaining",
                "zcl_type": "uint8",
                "value": 200
              },
              {
                "id": "0x0033",
                "name": "battery_quantity",
                "zcl_type": "uint8",
                "value": 2
              },
              {
                "id": "0x0031",
                "name": "battery_size",
                "zcl_type": "enum8",
                "value": 3
              },
              {
                "id": "0x0020",
                "name": "battery_voltage",
                "zcl_type": "uint8",
                "value": 34
              }
            ]
          },
          {
            "cluster_id": "0x0003",
            "endpoint_attribute": "identify",
            "attributes": []
          },
          {
            "cluster_id": "0x0004",
            "endpoint_attribute": "groups",
            "attributes": []
          },
          {
            "cluster_id": "0x0005",
            "endpoint_attribute": "scenes",
            "attributes": []
          },
          {
            "cluster_id": "0x000a",
            "endpoint_attribute": "time",
            "attributes": []
          },
          {
            "cluster_id": "0x0020",
            "endpoint_attribute": "poll_control",
            "attributes": [
              {
                "id": "0x0003",
                "name": "fast_poll_timeout",
                "zcl_type": "uint16",
                "value": 120
              }
            ]
          },
          {
            "cluster_id": "0x0201",
            "endpoint_attribute": "thermostat",
            "attributes": [
              {
                "id": "0x0006",
                "name": "abs_max_cool_setpoint_limit",
                "zcl_type": "int16",
                "unsupported": true
              },
              {
                "id": "0x0004",
                "name": "abs_max_heat_setpoint_limit",
                "zcl_type": "int16",
                "value": 3000
              },
              {
                "id": "0x0005",
                "name": "abs_min_cool_setpoint_limit",
                "zcl_type": "int16",
                "unsupported": true
              },
              {
                "id": "0x0003",
                "name": "abs_min_heat_setpoint_limit",
                "zcl_type": "int16",
                "value": 700
              },
              {
                "id": "0x401e",
                "name": "alternate_backup_heating_demand",
                "zcl_type": "uint8",
                "value": 0
              },
              {
                "id": "0x401d",
                "name": "backup_heating_demand",
                "zcl_type": "uint8",
                "value": 25
              },
              {
                "id": "0x001b",
                "name": "ctrl_sequence_of_oper",
                "zcl_type": "enum8",
                "value": 2
              },
              {
                "id": "0x4015",
                "name": "detect_open_window",
                "zcl_type": "map8",
                "value": 0
              },
              {
                "id": "0x4022",
                "name": "integral_factor",
                "zcl_type": "int16",
                "value": 500
              },
              {
                "id": "0x0000",
                "name": "local_temperature",
                "zcl_type": "int16",
                "value": 2150
              },
              {
                "id": "0x0010",
                "name": "local_temperature_calibration",
                "zcl_type": "int8",
                "value": 2
              },
              {
                "id": "0x0018",
                "name": "max_cool_setpoint_limit",
                "zcl_type": "int16",
                "unsupported": true
              },
              {
                "id": "0x0016",
                "name": "max_heat_setpoint_limit",
                "zcl_type": "int16",
                "unsupported": true
              },
              {
                "id": "0x0017",
                "name": "min_cool_setpoint_limit",
                "zcl_type": "int16",
                "unsupported": true
              },
              {
                "id": "0x0015",
                "name": "min_heat_setpoint_limit",
                "zcl_type": "int16",
                "value": 0
              },
              {
                "id": "0x0002",
                "name": "occupancy",
                "zcl_type": "map8",
                "value": 1
              },
              {
                "id": "0x0011",
                "name": "occupied_cooling_setpoint",
                "zcl_type": "int16",
                "unsupported": true
              },
              {
                "id": "0x0012",
                "name": "occupied_heating_setpoint",
                "zcl_type": "int16",
                "value": 2200
              },
              {
                "id": "0x4018",
                "name": "open_window_detection_period",
                "zcl_type": "uint16",
                "value": 5
              },
              {
                "id": "0x4017",
                "name": "open_window_sensitivity",
                "zcl_type": "uint16",
                "value": 150
              },
              {
                "id": "0x4016",
                "name": "open_window_state",
                "zcl_type": "map8",
                "value": 0
              },
              {
                "id": "0x4019",
                "name": "open_window_timeout",
                "zcl_type": "uint16",
                "value": 1800
              },
              {
                "id": "0x0007",
                "name": "pi_cooling_demand",
                "zcl_type": "uint8",
                "unsupported": true
              },
              {
                "id": "0x0008",
                "name": "pi_heating_demand",
                "zcl_type": "uint8",
                "value": 31
              },
              {
                "id": "0x4020",
                "name": "proportional_gain",
                "zcl_type": "int16",
                "value": 2
              },
              {
                "id": "0x4021",
                "name": "proportional_shift",
                "zcl_type": "int8",
                "value": 4
              },
              {
                "id": "0x4013",
                "name": "remote_temperature",
                "zcl_type": "int16",
                "value": -32768
              },
              {
                "id": "0x4014",
                "name": "remote_temperature_valid_duration",
                "zcl_type": "uint16",
                "value": 3600
              },
              {
                "id": "0x001e",
                "name": "running_mode",
                "zcl_type": "enum8",
                "value": 4
              },
              {
                "id": "0x0029",
                "name": "running_state",
                "zcl_type": "map16",
                "unsupported": true
              },
              {
                "id": "0x401c",
                "name": "season",
                "zcl_type": "bool",
                "value": 0
              },
              {
                "id": "0x0030",
                "name": "setpoint_change_source",
                "zcl_type": "enum8",
                "unsupported": true
              },
              {
                "id": "0x001c",
                "name": "system_mode",
                "zcl_type": "enum8",
                "value": 4
              },
              {
                "id": "0x4010",
                "name": "temperature_offset",
                "zcl_type": "int8",
                "value": 2
              },
              {
                "id": "0x0013",
                "name": "unoccupied_cooling_setpoint",
                "zcl_type": "int16",
                "unsupported": true
              },
              {
                "id": "0x0014",
                "name": "unoccupied_heating_setpoint",
                "zcl_type": "int16",
                "value": 1600
              }
            ]
          },
          {
            "cluster_id": "0xfc57",
            "endpoint_attribute": "manufacturer_specific",
            "attributes": []
          }
        ],
        "out_clusters": [
          {
            "cluster_id": "0x0003",
            "endpoint_attribute": "identify",
            "attributes": []
          },
          {
            "cluster_id": "0x000a",
            "endpoint_attribute": "time",
            "attributes": []
          },
          {
            "cluster_id": "0x0019",
            "endpoint_attribute": "ota",
            "attributes": [
              {
                "id": "0x0002",
                "name": "current_file_version",
                "zcl_type": "uint32",
                "value": 25166944
              }
            ]
          },
          {
            "cluster_id": "0x0201",
            "endpoint_attribute": "thermostat",
            "attributes": []
          },
          {
            "cluster_id": "0x0402",
            "endpoint_attribute": "temperature",
            "attributes": []
          },
          {
            "cluster_id": "0x0405",
            "endpoint_attribute": "humidity",
            "attributes": []
          },
          {
            "cluster_id": "0x0406",
            "endpoint_attribute": "occupancy",
            "attributes": []
          }
        ]
      }
    },
    "original_signature": {},
    "zha_lib_entities": {
      "binary_sensor": [
        {
          "info_object": {
            "fallback_name": "Open window detection status",
            "unique_id": "**REDACTED**",
            "migrate_unique_ids": [],
            "platform": "binary_sensor",
            "class_name": "BinarySensor",
            "translation_key": "open_window_detection_status",
            "translation_placeholders": null,
            "device_class": null,
            "state_class": null,
            "entity_category": "diagnostic",
            "entity_registry_enabled_default": true,
            "enabled": true,
            "primary": false,
            "cluster_handlers": [
              {
                "class_name": "ThermostatClusterHandler",
                "generic_id": "cluster_handler_0x0201",
                "endpoint_id": 1,
                "cluster": {
                  "id": 513,
                  "name": "ThermostatCluster",
                  "type": "server"
                },
                "id": "1:0x0201",
                "unique_id": "**REDACTED**",
                "status": "INITIALIZED",
                "value_attribute": "local_temperature"
              }
            ],
            "device_ieee": "**REDACTED**",
            "endpoint_id": 1,
            "available": true,
            "group_id": null,
            "attribute_name": "open_window_state"
          },
          "state": {
            "class_name": "BinarySensor",
            "available": true,
            "state": false
          }
        }
      ],
      "button": [
        {
          "info_object": {
            "fallback_name": null,
            "unique_id": "**REDACTED**",
            "migrate_unique_ids": [],
            "platform": "button",
            "class_name": "IdentifyButton",
            "translation_key": null,
            "translation_placeholders": null,
            "device_class": "identify",
            "state_class": null,
            "entity_category": "diagnostic",
            "entity_registry_enabled_default": true,
            "enabled": true,
            "primary": false,
            "cluster_handlers": [
              {
                "class_name": "IdentifyClusterHandler",
                "generic_id": "cluster_handler_0x0003",
                "endpoint_id": 1,
                "cluster": {
                  "id": 3,
                  "name": "Identify",
                  "type": "server"
                },
                "id": "1:0x0003",
                "unique_id": "**REDACTED**",
                "status": "INITIALIZED",
                "value_attribute": null
              }
            ],
            "device_ieee": "**REDACTED**",
            "endpoint_id": 1,
            "available": true,
            "group_id": null,
            "command": "identify",
            "args": [
              5
            ],
            "kwargs": {}
          },
          "state": {
            "class_name": "IdentifyButton",
            "available": true
          }
        }
      ],
      "climate": [
        {
          "info_object": {
            "fallback_name": null,
            "unique_id": "**REDACTED**",
            "migrate_unique_ids": [],
            "platform": "climate",
            "class_name": "Thermostat",
            "translation_key": "thermostat",
            "translation_placeholders": null,
            "device_class": null,
            "state_class": null,
            "entity_category": null,
            "entity_registry_enabled_default": true,
            "enabled": true,
            "primary": true,
            "cluster_handlers": [
              {
                "class_name": "ThermostatClusterHandler",
                "generic_id": "cluster_handler_0x0201",
                "endpoint_id": 1,
                "cluster": {
                  "id": 513,
                  "name": "ThermostatCluster",
                  "type": "server"
                },
                "id": "1:0x0201",
                "unique_id": "**REDACTED**",
                "status": "INITIALIZED",
                "value_attribute": "local_temperature"
              }
            ],
            "device_ieee": "**REDACTED**",
            "endpoint_id": 1,
            "available": true,
            "group_id": null,
            "max_temp": 30.0,
            "min_temp": 0.0,
            "supported_features": 385,
            "fan_modes": null,
            "preset_modes": [],
            "hvac_modes": [
              "off",
              "heat"
            ]
          },
          "state": {
            "class_name": "Thermostat",
            "available": true,
            "current_temperature": 21.5,
            "outdoor_temperature": null,
            "target_temperature": 22.0,
            "target_temperature_high": null,
            "target_temperature_low": null,
            "hvac_action": "heating",
            "hvac_mode": "heat",
            "preset_mode": "none",
            "fan_mode": "auto",
            "system_mode": "[4]/heat",
            "occupancy": 1,
            "occupied_cooling_setpoint": null,
            "occupied_heating_setpoint": 2200,
            "pi_heating_demand": 31,
            "pi_cooling_demand": null,
            "unoccupied_cooling_setpoint": null,
            "unoccupied_heating_setpoint": 1600
          },
          "extra_state_attributes": [
            "occupancy",
            "occupied_cooling_setpoint",
            "occupied_heating_setpoint",
            "pi_cooling_demand",
            "pi_heating_demand",
            "system_mode",
            "unoccupied_cooling_setpoint",
            "unoccupied_heating_setpoint"
          ]
        }
      ],
      "number": [
        {
          "info_object": {
            "fallback_name": "Alternate Backup Heating Demand",
            "unique_id": "**REDACTED**",
            "migrate_unique_ids": [],
            "platform": "number",
            "class_name": "NumberConfigurationEntity",
            "translation_key": "alternate_backup_heating_demand",
            "translation_placeholders": null,
            "device_class": null,
            "state_class": null,
            "entity_category": "config",
            "entity_registry_enabled_default": false,
            "enabled": true,
            "primary": false,
            "cluster_handlers": [
              {
                "class_name": "ThermostatClusterHandler",
                "generic_id": "cluster_handler_0x0201",
                "endpoint_id": 1,
                "cluster": {
                  "id": 513,
                  "name": "ThermostatCluster",
                  "type": "server"
                },
                "id": "1:0x0201",
                "unique_id": "**REDACTED**",
                "status": "INITIALIZED",
                "value_attribute": "local_temperature"
              }
            ],
            "device_ieee": "**REDACTED**",
            "endpoint_id": 1,
            "available": true,
            "group_id": null,
            "mode": "auto",
            "native_max_value": 100,
            "native_min_value": 0,
            "native_step": 1.0,
            "native_unit_of_measurement": "%"
          },
          "state": {
            "class_name": "NumberConfigurationEntity",
            "available": true,
            "state": 0
          }
        },
        {
          "info_object": {
            "fallback_name": "Backup Heating Demand",
            "unique_id": "**REDACTED**",
            "migrate_unique_ids": [],
            "platform": "number",
            "class_name": "NumberConfigurationEntity",
            "translation_key": "backup_heating_demand",
            "translation_placeholders": null,
            "device_class": null,
            "state_class": null,
            "entity_category": "config",
            "entity_registry_enabled_default": false,
            "enabled": true,
            "primary": false,
            "cluster_handlers": [
              {
                "class_name": "ThermostatClusterHandler",
                "generic_id": "cluster_handler_0x0201",
                "endpoint_id": 1,
                "cluster": {
                  "id": 513,
                  "name": "ThermostatCluster",
                  "type": "server"
                },
                "id": "1:0x0201",
                "unique_id": "**REDACTED**",
                "status": "INITIALIZED",
                "value_attribute": "local_temperature"
              }
            ],
            "device_ieee": "**REDACTED**",
            "endpoint_id": 1,
            "available": true,
            "group_id": null,
            "mode": "auto",
            "native_max_value": 100,
            "native_min_value": 0,
            "native_step": 1.0,
            "native_unit_of_measurement": "%"
          },
          "state": {
            "class_name": "NumberConfigurationEntity",
            "available": true,
            "state": 25
          }
        },
        {
          "info_object": {
            "fallback_name": "Integral Factor",
            "unique_id": "**REDACTED**",
            "migrate_unique_ids": [],
            "platform": "number",
            "class_name": "NumberConfigurationEntity",
            "translation_key": "integral_factor",
            "translation_placeholders": null,
            "device_class": null,
            "state_class": null,
            "entity_category": "config",
            "entity_registry_enabled_default": false,
            "enabled": true,
            "primary": false,
            "cluster_handlers": [
              {
                "class_name": "ThermostatClusterHandler",
                "generic_id": "cluster_handler_0x0201",
                "endpoint_id": 1,
                "cluster": {
                  "id": 513,
                  "name": "ThermostatCluster",
                  "type": "server"
                },
                "id": "1:0x0201",
                "unique_id": "**REDACTED**",
                "status": "INITIALIZED",
                "value_attribute": "local_temperature"
              }
            ],
            "device_ieee": "**REDACTED**",
            "endpoint_id": 1,
            "available": true,
            "group_id": null,
            "mode": "auto",
            "native_max_value": 100.0,
            "native_min_value": 0.0,
            "native_step": 1.0,
            "native_unit_of_measurement": null
          },
          "state": {
            "class_name": "NumberConfigurationEntity",
            "available": true,
            "state": 500
          }
        },
        {
          "info_object": {
            "fallback_name": "Open window event duration",
            "unique_id": "**REDACTED**",
            "migrate_unique_ids": [],
            "platform": "number",
            "class_name": "NumberConfigurationEntity",
            "translation_key": "open_window_event_duration",
            "translation_placeholders": null,
            "device_class": null,
            "state_class": null,
            "entity_category": "config",
            "entity_registry_enabled_default": true,
            "enabled": true,
            "primary": false,
            "cluster_handlers": [
              {
                "class_name": "ThermostatClusterHandler",
                "generic_id": "cluster_handler_0x0201",
                "endpoint_id": 1,
                "cluster": {
                  "id": 513,
                  "name": "ThermostatCluster",
                  "type": "server"
                },
                "id": "1:0x0201",
                "unique_id": "**REDACTED**",
                "status": "INITIALIZED",
                "value_attribute": "local_temperature"
              }
            ],
            "device_ieee": "**REDACTED**",
            "endpoint_id": 1,
            "available": true,
            "group_id": null,
            "mode": "auto",
            "native_max_value": 100.0,
            "native_min_value": 0.0,
            "native_step": 1.0,
            "native_unit_of_measurement": "min"
          },
          "state": {
            "class_name": "NumberConfigurationEntity",
            "available": true,
            "state": 5
          }
        },
        {
          "info_object": {
            "fallback_name": "Open window detection threshold",
            "unique_id": "**REDACTED**",
            "migrate_unique_ids": [],
            "platform": "number",
            "class_name": "NumberConfigurationEntity",
            "translation_key": "open_window_detection_threshold",
            "translation_placeholders": null,
            "device_class": "temperature",
            "state_class": null,
            "entity_category": "config",
            "entity_registry_enabled_default": true,
            "enabled": true,
            "primary": false,
            "cluster_handlers": [
              {
                "class_name": "ThermostatClusterHandler",
                "generic_id": "cluster_handler_0x0201",
                "endpoint_id": 1,
                "cluster": {
                  "id": 513,
                  "name": "ThermostatCluster",
                  "type": "server"
                },
                "id": "1:0x0201",
                "unique_id": "**REDACTED**",
                "status": "INITIALIZED",
                "value_attribute": "local_temperature"
              }
            ],
            "device_ieee": "**REDACTED**",
            "endpoint_id": 1,
            "available": true,
            "group_id": null,
            "mode": "auto",
            "native_max_value": 100.0,
            "native_min_value": 0.0,
            "native_step": 1.0,
            "native_unit_of_measurement": "\u00b0C"
          },
          "state": {
            "class_name": "NumberConfigurationEntity",
            "available": true,
            "state": 1.5
          }
        },
        {
          "info_object": {
            "fallback_name": "Open window detection guard period",
            "unique_id": "**REDACTED**",
            "migrate_unique_ids": [],
            "platform": "number",
            "class_name": "NumberConfigurationEntity",
            "translation_key": "open_window_detection_guard_period",
            "translation_placeholders": null,
            "device_class": null,
            "state_class": null,
            "entity_category": "config",
            "entity_registry_enabled_default": true,
            "enabled": true,
            "primary": false,
            "cluster_handlers": [
              {
                "class_name": "ThermostatClusterHandler",
                "generic_id": "cluster_handler_0x0201",
                "endpoint_id": 1,
                "cluster": {
                  "id": 513,
                  "name": "ThermostatCluster",
                  "type": "server"
                },
                "id": "1:0x0201",
                "unique_id": "**REDACTED**",
                "status": "INITIALIZED",
                "value_attribute": "local_temperature"
              }
            ],
            "device_ieee": "**REDACTED**",
            "endpoint_id": 1,
            "available": true,
            "group_id": null,
            "mode": "auto",
            "native_max_value": 100.0,
            "native_min_value": 0.0,
            "native_step": 1.0,
            "native_unit_of_measurement": "min"
          },
          "state": {
            "class_name": "NumberConfigurationEntity",
            "available": true,
            "state": 30.0
          }
        },
        {
          "info_object": {
            "fallback_name": "Proportional Gain (Kp)",
            "unique_id": "**REDACTED**",
            "migrate_unique_ids": [],
            "platform": "number",
            "class_name": "NumberConfigurationEntity",
            "translation_key": "proportional_gain",
            "translation_placeholders": null,
            "device_class": null,
            "state_class": null,
            "entity_category": "config",
            "entity_registry_enabled_default": false,
            "enabled": true,
            "primary": false,
            "cluster_handlers": [
              {
                "class_name": "ThermostatClusterHandler",
                "generic_id": "cluster_handler_0x0201",
                "endpoint_id": 1,
                "cluster": {
                  "id": 513,
                  "name": "ThermostatCluster",
                  "type": "server"
                },
                "id": "1:0x0201",
                "unique_id": "**REDACTED**",
                "status": "INITIALIZED",
                "value_attribute": "local_temperature"
              }
            ],
            "device_ieee": "**REDACTED**",
            "endpoint_id": 1,
            "available": true,
            "group_id": null,
            "mode": "auto",
            "native_max_value": 100.0,
            "native_min_value": 0.0,
            "native_step": 1.0,
            "native_unit_of_measurement": null
          },
          "state": {
            "class_name": "NumberConfigurationEntity",
            "available": true,
            "state": 2
          }
        },
        {
          "info_object": {
            "fallback_name": "Proportional Shift (N)",
            "unique_id": "**REDACTED**",
            "migrate_unique_ids": [],
            "platform": "number",
            "class_name": "NumberConfigurationEntity",
            "translation_key": "proportional_shift",
            "translation_placeholders": null,
            "device_class": null,
            "state_class": null,
            "entity_category": "config",
            "entity_registry_enabled_default": false,
            "enabled": true,
            "primary": false,
            "cluster_handlers": [
              {
                "class_name": "ThermostatClusterHandler",
                "generic_id": "cluster_handler_0x0201",
                "endpoint_id": 1,
                "cluster": {
                  "id": 513,
                  "name": "ThermostatCluster",
                  "type": "server"
                },
                "id": "1:0x0201",
                "unique_id": "**REDACTED**",
                "status": "INITIALIZED",
                "value_attribute": "local_temperature"
              }
            ],
            "device_ieee": "**REDACTED**",
            "endpoint_id": 1,
            "available": true,
            "group_id": null,
            "mode": "auto",
            "native_max_value": 100.0,
            "native_min_value": 0.0,
            "native_step": 1.0,
            "native_unit_of_measurement": null
          },
          "state": {
            "class_name": "NumberConfigurationEntity",
            "available": true,
            "state": 4
          }
        },
        {
          "info_object": {
            "fallback_name": "External temperature sensor value",
            "unique_id": "**REDACTED**",
            "migrate_unique_ids": [],
            "platform": "number",
            "class_name": "NumberConfigurationEntity",
            "translation_key": "external_temperature_sensor_value",
            "translation_placeholders": null,
            "device_class": "temperature",
            "state_class": null,
            "entity_category": "config",
            "entity_registry_enabled_default": true,
            "enabled": true,
            "primary": false,
            "cluster_handlers": [
              {
                "class_name": "ThermostatClusterHandler",
                "generic_id": "cluster_handler_0x0201",
                "endpoint_id": 1,
                "cluster": {
                  "id": 513,
                  "name": "ThermostatCluster",
                  "type": "server"
                },
                "id": "1:0x0201",
                "unique_id": "**REDACTED**",
                "status": "INITIALIZED",
                "value_attribute": "local_temperature"
              }
            ],
            "device_ieee": "**REDACTED**",
            "endpoint_id": 1,
            "available": true,
            "group_id": null,
            "mode": "auto",
            "native_max_value": 100.0,
            "native_min_value": 0.0,
            "native_step": 1.0,
            "native_unit_of_measurement": "\u00b0C"
          },
          "state": {
            "class_name": "NumberConfigurationEntity",
            "available": true,
            "state": -32768
          }
        },
        {
          "info_object": {
            "fallback_name": "External temperature sensor valid duration",
            "unique_id": "**REDACTED**",
            "migrate_unique_ids": [],
            "platform": "number",
            "class_name": "NumberConfigurationEntity",
            "translation_key": "external_temperature_sensor_valid_duration",
            "translation_placeholders": null,
            "device_class": null,
            "state_class": null,
            "entity_category": "config",
            "entity_registry_enabled_default": true,
            "enabled": true,
            "primary": false,
            "cluster_handlers": [
              {
                "class_name": "ThermostatClusterHandler",
                "generic_id": "cluster_handler_0x0201",
                "endpoint_id": 1,
                "cluster": {
                  "id": 513,
                  "name": "ThermostatCluster",
                  "type": "server"
                },
                "id": "1:0x0201",
                "unique_id": "**REDACTED**",
                "status": "INITIALIZED",
                "value_attribute": "local_temperature"
              }
            ],
            "device_ieee": "**REDACTED**",
            "endpoint_id": 1,
            "available": true,
            "group_id": null,
            "mode": "auto",
            "native_max_value": 100.0,
            "native_min_value": 0.0,
            "native_step": 1.0,
            "native_unit_of_measurement": "min"
          },
          "state": {
            "class_name": "NumberConfigurationEntity",
            "available": true,
            "state": 60.0
          }
        },
        {
          "info_object": {
            "fallback_name": "Temperature offset",
            "unique_id": "**REDACTED**",
            "migrate_unique_ids": [],
            "platform": "number",
            "class_name": "NumberConfigurationEntity",
            "translation_key": "temperature_offset",
            "translation_placeholders": null,
            "device_class": "temperature",
            "state_class": null,
            "entity_category": "config",
            "entity_registry_enabled_default": true,
            "enabled": true,
            "primary": false,
            "cluster_handlers": [
              {
                "class_name": "ThermostatClusterHandler",
                "generic_id": "cluster_handler_0x0201",
                "endpoint_id": 1,
                "cluster": {
                  "id": 513,
                  "name": "ThermostatCluster",
                  "type": "server"
                },
                "id": "1:0x0201",
                "unique_id": "**REDACTED**",
                "status": "INITIALIZED",
                "value_attribute": "local_temperature"
              }
            ],
            "device_ieee": "**REDACTED**",
            "endpoint_id": 1,
            "available": true,
            "group_id": null,
            "mode": "auto",
            "native_max_value": 10,
            "native_min_value": -10,
            "native_step": 1,
            "native_unit_of_measurement": "\u00b0C"
          },
          "state": {
            "class_name": "NumberConfigurationEntity",
            "available": true,
            "state": 2
          }
        }
      ],
      "sensor": [
        {
          "info_object": {
            "fallback_name": null,
            "unique_id": "**REDACTED**",
            "migrate_unique_ids": [],
            "platform": "sensor",
            "class_name": "LQISensor",
            "translation_key": "lqi",
            "translation_placeholders": null,
            "device_class": null,
            "state_class": "measurement",
            "entity_category": "diagnostic",
            "entity_registry_enabled_default": false,
            "enabled": true,
            "primary": false,
            "cluster_handlers": [
              {
                "class_name": "BasicClusterHandler",
                "generic_id": "cluster_handler_0x0000",
                "endpoint_id": 1,
                "cluster": {
                  "id": 0,
                  "name": "Basic",
                  "type": "server"
                },
                "id": "1:0x0000",
                "unique_id": "**REDACTED**",
                "status": "INITIALIZED",
                "value_attribute": null
              }
            ],
            "device_ieee": "**REDACTED**",
            "endpoint_id": 1,
            "available": true,
            "group_id": null,
            "suggested_display_precision": null,
            "unit": null
          },
          "state": {
            "class_name": "LQISensor",
            "available": true,
            "state": null
          }
        },
        {
          "info_object": {
            "fallback_name": null,
            "unique_id": "**REDACTED**",
            "migrate_unique_ids": [],
            "platform": "sensor",
            "class_name": "RSSISensor",
            "translation_key": "rssi",
            "translation_placeholders": null,
            "device_class": "signal_strength",
            "state_class": "measurement",
            "entity_category": "diagnostic",
            "entity_registry_enabled_default": false,
            "enabled": true,
            "primary": false,
            "cluster_handlers": [
              {
                "class_name": "BasicClusterHandler",
                "generic_id": "cluster_handler_0x0000",
                "endpoint_id": 1,
                "cluster": {
                  "id": 0,
                  "name": "Basic",
                  "type": "server"
                },
                "id": "1:0x0000",
                "unique_id": "**REDACTED**",
                "status": "INITIALIZED",
                "value_attribute": null
              }
            ],
            "device_ieee": "**REDACTED**",
            "endpoint_id": 1,
            "available": true,
            "group_id": null,
            "suggested_display_precision": null,
            "unit": "dBm"
          },
          "state": {
            "class_name": "RSSISensor",
            "available": true,
            "state": null
          }
        },
        {
          "info_object": {
            "fallback_name": null,
            "unique_id": "**REDACTED**",
            "migrate_unique_ids": [],
            "platform": "sensor",
            "class_name": "Battery",
            "translation_key": null,
            "translation_placeholders": null,
            "device_class": "battery",
            "state_class": "measurement",
            "entity_category": "diagnostic",
            "entity_registry_enabled_default": true,
            "enabled": true,
            "primary": false,
            "cluster_handlers": [
              {
                "class_name": "PowerConfigurationClusterHandler",
                "generic_id": "cluster_handler_0x0001",
                "endpoint_id": 1,
                "cluster": {
                  "id": 1,
                  "name": "Power Configuration",
                  "type": "server"
                },
                "id": "1:0x0001",
                "unique_id": "**REDACTED**",
                "status": "INITIALIZED",
                "value_attribute": "battery_voltage"
              }
            ],
            "device_ieee": "**REDACTED**",
            "endpoint_id": 1,
            "available": true,
            "group_id": null,
            "suggested_display_precision": 0,
            "unit": "%"
          },
          "state": {
            "class_name": "Battery",
            "available": true,
            "state": 100.0,
            "battery_size": "AA",
            "battery_quantity": 2,
            "battery_voltage": 3.4
          },
          "extra_state_attributes": [
            "battery_quantity",
            "battery_size",
            "battery_voltage"
          ]
        },
        {
          "info_object": {
            "fallback_name": null,
            "unique_id": "**REDACTED**",
            "migrate_unique_ids": [],
            "platform": "sensor",
            "class_name": "ThermostatHVACAction",
            "translation_key": "hvac_action",
            "translation_placeholders": null,
            "device_class": null,
            "state_class": null,
            "entity_category": null,
            "entity_registry_enabled_default": true,
            "enabled": true,
            "primary": false,
            "cluster_handlers": [
              {
                "class_name": "ThermostatClusterHandler",
                "generic_id": "cluster_handler_0x0201",
                "endpoint_id": 1,
                "cluster": {
                  "id": 513,
                  "name": "ThermostatCluster",
                  "type": "server"
                },
                "id": "1:0x0201",
                "unique_id": "**REDACTED**",
                "status": "INITIALIZED",
                "value_attribute": "local_temperature"
              }
            ],
            "device_ieee": "**REDACTED**",
            "endpoint_id": 1,
            "available": true,
            "group_id": null,
            "suggested_display_precision": null,
            "unit": null
          },
          "state": {
            "class_name": "ThermostatHVACAction",
            "available": true,
            "state": "heating"
          }
        },
        {
          "info_object": {
            "fallback_name": null,
            "unique_id": "**REDACTED**",
            "migrate_unique_ids": [],
            "platform": "sensor",
            "class_name": "PiHeatingDemand",
            "translation_key": "pi_heating_demand",
            "translation_placeholders": null,
            "device_class": null,
            "state_class": "measurement",
            "entity_category": "diagnostic",
            "entity_registry_enabled_default": true,
            "enabled": true,
            "primary": false,
            "cluster_handlers": [
              {
                "class_name": "ThermostatClusterHandler",
                "generic_id": "cluster_handler_0x0201",
                "endpoint_id": 1,
                "cluster": {
                  "id": 513,
                  "name": "ThermostatCluster",
                  "type": "server"
                },
                "id": "1:0x0201",
                "unique_id": "**REDACTED**",
                "status": "INITIALIZED",
                "value_attribute": "local_temperature"
              }
            ],
            "device_ieee": "**REDACTED**",
            "endpoint_id": 1,
            "available": true,
            "group_id": null,
            "suggested_display_precision": 0,
            "unit": "%"
          },
          "state": {
            "class_name": "PiHeatingDemand",
            "available": true,
            "state": 31
          }
        },
        {
          "info_object": {
            "fallback_name": null,
            "unique_id": "**REDACTED**",
            "migrate_unique_ids": [],
            "platform": "sensor",
            "class_name": "SetpointChangeSourceTimestamp",
            "translation_key": "setpoint_change_source_timestamp",
            "translation_placeholders": null,
            "device_class": "timestamp",
            "state_class": null,
            "entity_category": "diagnostic",
            "entity_registry_enabled_default": true,
            "enabled": true,
            "primary": false,
            "cluster_handlers": [
              {
                "class_name": "ThermostatClusterHandler",
                "generic_id": "cluster_handler_0x0201",
                "endpoint_id": 1,
                "cluster": {
                  "id": 513,
                  "name": "ThermostatCluster",
                  "type": "server"
                },
                "id": "1:0x0201",
                "unique_id": "**REDACTED**",
                "status": "INITIALIZED",
                "value_attribute": "local_temperature"
              }
            ],
            "device_ieee": "**REDACTED**",
            "endpoint_id": 1,
            "available": true,
            "group_id": null,
            "suggested_display_precision": null,
            "unit": null
          },
          "state": {
            "class_name": "SetpointChangeSourceTimestamp",
            "available": true,
            "state": null
          }
        }
      ],
      "switch": [
        {
          "info_object": {
            "fallback_name": "Open window detection",
            "unique_id": "**REDACTED**",
            "migrate_unique_ids": [],
            "platform": "switch",
            "class_name": "ConfigurableAttributeSwitch",
            "translation_key": "window_detection",
            "translation_placeholders": null,
            "device_class": null,
            "state_class": null,
            "entity_category": "config",
            "entity_registry_enabled_default": true,
            "enabled": true,
            "primary": false,
            "cluster_handlers": [
              {
                "class_name": "ThermostatClusterHandler",
                "generic_id": "cluster_handler_0x0201",
                "endpoint_id": 1,
                "cluster": {
                  "id": 513,
                  "name": "ThermostatCluster",
                  "type": "server"
                },
                "id": "1:0x0201",
                "unique_id": "**REDACTED**",
                "status": "INITIALIZED",
                "value_attribute": "local_temperature"
              }
            ],
            "device_ieee": "**REDACTED**",
            "endpoint_id": 1,
            "available": true,
            "group_id": null,
            "attribute_name": "detect_open_window",
            "invert_attribute_name": null,
            "force_inverted": false,
            "off_value": 0,
            "on_value": 1
          },
          "state": {
            "class_name": "ConfigurableAttributeSwitch",
            "available": true,
            "state": false,
            "inverted": false
          }
        },
        {
          "info_object": {
            "fallback_name": "Summer Mode",
            "unique_id": "**REDACTED**",
            "migrate_unique_ids": [],
            "platform": "switch",
            "class_name": "ConfigurableAttributeSwitch",
            "translation_key": "summer_mode",
            "translation_placeholders": null,
            "device_class": null,
            "state_class": null,
            "entity_category": "config",
            "entity_registry_enabled_default": false,
            "enabled": true,
            "primary": false,
            "cluster_handlers": [
              {
                "class_name": "ThermostatClusterHandler",
                "generic_id": "cluster_handler_0x0201",
                "endpoint_id": 1,
                "cluster": {
                  "id": 513,
                  "name": "ThermostatCluster",
                  "type": "server"
                },
                "id": "1:0x0201",
                "unique_id": "**REDACTED**",
                "status": "INITIALIZED",
                "value_attribute": "local_temperature"
              }
            ],
            "device_ieee": "**REDACTED**",
            "endpoint_id": 1,
            "available": true,
            "group_id": null,
            "attribute_name": "season",
            "invert_attribute_name": null,
            "force_inverted": false,
            "off_value": 0,
            "on_value": 1
          },
          "state": {
            "class_name": "ConfigurableAttributeSwitch",
            "available": true,
            "state": false,
            "inverted": false
          }
        }
      ],
      "update": [
        {
          "info_object": {
            "fallback_name": null,
            "unique_id": "**REDACTED**",
            "migrate_unique_ids": [],
            "platform": "update",
            "class_name": "FirmwareUpdateEntity",
            "translation_key": null,
            "translation_placeholders": null,
            "device_class": "firmware",
            "state_class": null,
            "entity_category": "config",
            "entity_registry_enabled_default": true,
            "enabled": true,
            "primary": false,
            "cluster_handlers": [
              {
                "class_name": "OtaClientClusterHandler",
                "generic_id": "cluster_handler_0x0019_client",
                "endpoint_id": 1,
                "cluster": {
                  "id": 25,
                  "name": "Ota",
                  "type": "client"
                },
                "id": "1:0x0019_client",
                "unique_id": "**REDACTED**",
                "status": "INITIALIZED",
                "value_attribute": null
              }
            ],
            "device_ieee": "**REDACTED**",
            "endpoint_id": 1,
            "available": true,
            "group_id": null,
            "supported_features": 7
          },
          "state": {
            "class_name": "FirmwareUpdateEntity",
            "available": true,
            "installed_version": "0x01800460",
            "in_progress": false,
            "update_percentage": null,
            "latest_version": null,
            "release_summary": null,
            "release_notes": null,
            "release_url": null
          }
        }
      ]
    },
    "neighbors": [],
    "routes": []
  },
  "issues": []
}

Checklist

  • The changes are tested and work correctly
  • pre-commit checks pass / the code has been formatted using Black
  • Tests have been added to verify that the new code works
  • Device diagnostics data has been attached

@codecov
Copy link

codecov bot commented Dec 22, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 92.32%. Comparing base (35d1fc1) to head (db989be).

Additional details and impacted files
@@            Coverage Diff             @@
##              dev    #4595      +/-   ##
==========================================
+ Coverage   92.28%   92.32%   +0.04%     
==========================================
  Files         371      372       +1     
  Lines       12158    12227      +69     
==========================================
+ Hits        11220    11289      +69     
  Misses        938      938              

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@TheJulianJES TheJulianJES added needs review This PR should be reviewed soon, as it generally looks good. priority: medium This should be addressed or looked at soon manufacturer This request was made by the device's manufacturer labels Dec 23, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

manufacturer This request was made by the device's manufacturer needs review This PR should be reviewed soon, as it generally looks good. priority: medium This should be addressed or looked at soon

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants