question-mark
Stuck on an issue?

Lightrun Answers was designed to reduce the constant googling that comes with debugging 3rd party libraries. It collects links to all the places you might be looking at while hunting down a tough bug.

And, if you’re still stuck at the end, we’re happy to hop on a call to see how we can help out.

[Device Support Request] Insta GmbH Nexentro Blinds Actuator Mini

See original GitHub issue

Is your feature request related to a problem? Please describe. I bought a few “Nexentro Blinds Actuator Mini” devices made by “Insta GmbH”. Those are mounted behind existing blind switches and enable the blinds to be controlled both by the old manual switches and by Zigbee (and by a config app that uses Bluetooth).

What works:

  • cover.close_cover
  • cover.open_cover
  • cover.stop_cover
  • cover.set_cover_position
  • Cover position attribute Note: Initially only one of my devices reported that correctly. The other ones always reported position as 100 and state as open. This fixed itself after I used the “reconfigure device” command on the device page.

What works unreliably:

  • Cover state Sometimes the open/close/stop cover services don’t change the state of all devices when executed for all at once (e.g. with entity_id: all). The actual commands are correctly sent to all devices, it’s just the state shown in HA which isn’t updated for all.

What doesn’t work:

  • Nothing related to tilt works. Tilt position is not shown and tilt related cover services don’t do anything. The attribute “supported_features” is reported as 15. I think that should be 255 for devices that support tilt. But: I can use the attribute “current_position_tilt_percentage” (0x0009) in the cluster “WindowCovering” (0x0102 in endpoint 6) to get the tilt value! So the device seems to report it correctly, but ZHA isn’t using it? Update: ZHA actually doesn’t support tilt for covers at all. So this is not something that would be fixed in a quirk. See comments below for more information.
  • Cover state only reports “opening” or “closing” when triggerd by HA commands, never when triggered by the device itself (by pressing the manual switch buttons). But the cover position attribute does change correctly. And I do see zha_events being triggered when the device starts/stops the blinds. See examples below.
  • It looks like the device is identified as a window. At least it’s shown with a window icon.

Describe the solution you’d like All cover services should work. State and all attributes should be reported correctly.

Device signature

{
  "node_descriptor": "NodeDescriptor(logical_type=<LogicalType.Router: 1>, complex_descriptor_available=0, user_descriptor_available=0, reserved=0, aps_flags=0, frequency_band=<FrequencyBand.Freq2400MHz: 8>, mac_capability_flags=<MACCapabilityFlags.AllocateAddress|RxOnWhenIdle|MainsPowered|FullFunctionDevice: 142>, manufacturer_code=4474, maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264, maximum_outgoing_transfer_size=82, descriptor_capability_field=<DescriptorCapability.NONE: 0>, *allocate_address=True, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=False, *is_full_function_device=True, *is_mains_powered=True, *is_receiver_on_when_idle=True, *is_router=True, *is_security_capable=False)",
  "endpoints": {
    "6": {
      "profile_id": 260,
      "device_type": "0x0202",
      "in_clusters": [
        "0x0000",
        "0x0003",
        "0x0004",
        "0x0005",
        "0x0102"
      ],
      "out_clusters": [
        "0x0003",
        "0x0019"
      ]
    },
    "7": {
      "profile_id": 260,
      "device_type": "0x0203",
      "in_clusters": [
        "0x0000",
        "0x0003"
      ],
      "out_clusters": [
        "0x0003",
        "0x0004",
        "0x0019",
        "0x0102"
      ]
    },
    "242": {
      "profile_id": 41440,
      "device_type": "0x0061",
      "in_clusters": [],
      "out_clusters": [
        "0x0021"
      ]
    }
  },
  "manufacturer": "Insta GmbH",
  "model": "Generic UP Device",
  "class": "zigpy.device.Device"
}

ZHA add device log

Click to show
New device 0x1d12 (5c:02:72:ff:fe:bd:51:c4) joined the network
[0x1d12] Scheduling initialization
Received frame on uninitialized device <Device model=None manuf=None nwk=0x1D12 ieee=5c:02:72:ff:fe:bd:51:c4 is_initialized=False> from ep 0 to ep 0, cluster 19: b'\x81\x12\x1d\xc4Q\xbd\xfe\xffr\x02\\\x8e'
[0x1d12:zdo] ZDO request ZDOCmd.Device_annce: [0x1D12, 5c:02:72:ff:fe:bd:51:c4, 142]
Tries remaining: 3
[0x1d12] Requesting 'Node Descriptor'
Tries remaining: 2
[0x1d12] Extending timeout for 0x69 request
Received frame on uninitialized device <Device model=None manuf=None nwk=0x1D12 ieee=5c:02:72:ff:fe:bd:51:c4 is_initialized=False> from ep 0 to ep 0, cluster 32770: b'i\x00\x12\x1d\x01@\x8ez\x11RR\x00\x00,R\x00\x00'
[0x1d12] Got Node Descriptor: NodeDescriptor(logical_type=<LogicalType.Router: 1>, complex_descriptor_available=0, user_descriptor_available=0, reserved=0, aps_flags=0, frequency_band=<FrequencyBand.Freq2400MHz: 8>, mac_capability_flags=<MACCapabilityFlags.AllocateAddress|RxOnWhenIdle|MainsPowered|FullFunctionDevice: 142>, manufacturer_code=4474, maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264, maximum_outgoing_transfer_size=82, descriptor_capability_field=<DescriptorCapability.NONE: 0>, *allocate_address=True, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=False, *is_full_function_device=True, *is_mains_powered=True, *is_receiver_on_when_idle=True, *is_router=True, *is_security_capable=False)
[0x1d12] Discovering endpoints
Tries remaining: 3
Received frame on uninitialized device <Device model=None manuf=None nwk=0x1D12 ieee=5c:02:72:ff:fe:bd:51:c4 is_initialized=False> from ep 0 to ep 0, cluster 32773: b'k\x00\x12\x1d\x03\x06\x07\xf2'
[0x1d12] Discovered endpoints: [6, 7, 242]
[0x1d12] Initializing endpoints [<Endpoint id=6 in=[] out=[] status=<Status.NEW: 0>>, <Endpoint id=7 in=[] out=[] status=<Status.NEW: 0>>, <Endpoint id=242 in=[] out=[] status=<Status.NEW: 0>>]
[0x1d12:6] Discovering endpoint information
Tries remaining: 3
Received frame on uninitialized device <Device model=None manuf=None nwk=0x1D12 ieee=5c:02:72:ff:fe:bd:51:c4 is_initialized=False> from ep 0 to ep 0, cluster 32772: b'm\x00\x12\x1d\x16\x06\x04\x01\x02\x02\x01\x05\x00\x00\x03\x00\x04\x00\x05\x00\x02\x01\x02\x03\x00\x19\x00'
[0x1d12:6] Discovered endpoint information: SizePrefixedSimpleDescriptor(endpoint=6, profile=260, device_type=514, device_version=1, input_clusters=[0, 3, 4, 5, 258], output_clusters=[3, 25])
[0x1d12:7] Discovering endpoint information
Tries remaining: 3
Received frame on uninitialized device <Device model=None manuf=None nwk=0x1D12 ieee=5c:02:72:ff:fe:bd:51:c4 is_initialized=False> from ep 0 to ep 0, cluster 32772: b'o\x00\x12\x1d\x14\x07\x04\x01\x03\x02\x01\x02\x00\x00\x03\x00\x04\x03\x00\x04\x00\x19\x00\x02\x01'
[0x1d12:7] Discovered endpoint information: SizePrefixedSimpleDescriptor(endpoint=7, profile=260, device_type=515, device_version=1, input_clusters=[0, 3], output_clusters=[3, 4, 25, 258])
[0x1d12:242] Discovering endpoint information
Tries remaining: 3
Received frame on uninitialized device <Device model=None manuf=None nwk=0x1D12 ieee=5c:02:72:ff:fe:bd:51:c4 is_initialized=False> from ep 0 to ep 0, cluster 32772: b'q\x00\x12\x1d\n\xf2\xe0\xa1a\x00\x01\x00\x01!\x00'
[0x1d12:242] Discovered endpoint information: SizePrefixedSimpleDescriptor(endpoint=242, profile=41440, device_type=97, device_version=1, input_clusters=[], output_clusters=[33])
[0x1d12:6:0x0000] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=115 command_id=Command.Read_Attributes_rsp>
[0x1d12] Read model 'Generic UP Device' and manufacturer 'Insta GmbH' from <Endpoint id=6 in=[basic:0x0000, identify:0x0003, groups:0x0004, scenes:0x0005, window_covering:0x0102] out=[identify:0x0003, ota:0x0019] status=<Status.ZDO_INIT: 1>>
[0x1d12] Discovered basic device information for <Device model='Generic UP Device' manuf='Insta GmbH' nwk=0x1D12 ieee=5c:02:72:ff:fe:bd:51:c4 is_initialized=True>
Device is initialized <Device model='Generic UP Device' manuf='Insta GmbH' nwk=0x1D12 ieee=5c:02:72:ff:fe:bd:51:c4 is_initialized=True>
Checking quirks for Insta GmbH Generic UP Device (5c:02:72:ff:fe:bd:51:c4)
Considering <class 'zhaquirks.xbee.xbee_io.XBeeSensor'>
Fail because endpoint list mismatch: {232, 230} {242, 6, 7}
Considering <class 'zhaquirks.xbee.xbee3_io.XBee3Sensor'>
Fail because endpoint list mismatch: {232, 230} {242, 6, 7}
Considering <class 'zhaquirks.smartthings.tag_v4.SmartThingsTagV4'>
Fail because endpoint list mismatch: {1} {242, 6, 7}
Considering <class 'zhaquirks.smartthings.multi.SmartthingsMultiPurposeSensor'>
Fail because endpoint list mismatch: {1} {242, 6, 7}
Considering <class 'zhaquirks.netvox.z308e3ed.Z308E3ED'>
Fail because endpoint list mismatch: {1} {242, 6, 7}
Considering <class 'zhaquirks.gledopto.soposhgu10.SoposhGU10'>
Fail because endpoint list mismatch: {11, 13} {242, 6, 7}
Considering <class 'bellows.zigbee.application.EZSPCoordinator'>
Fail because endpoint list mismatch: {1} {242, 6, 7}
'button' component -> 'ZHAIdentifyButton' using ['identify']
'cover' component -> 'ZhaCover' using ['window_covering']
'sensor' component -> 'RSSISensor' using ['basic']
'sensor' component -> 'LQISensor' using ['basic']
'button' component -> 'ZHAIdentifyButton' using ['identify']
'sensor' component -> 'RSSISensor' using ['basic']
'sensor' component -> 'LQISensor' using ['basic']
device - 0x1D12:5c:02:72:ff:fe:bd:51:c4 entering async_device_initialized - is_new_join: True
device - 0x1D12:5c:02:72:ff:fe:bd:51:c4 has joined the ZHA zigbee network
[0x1D12](Generic UP Device): started configuration
[0x1D12:ZDO](Generic UP Device): 'async_configure' stage succeeded
Error handling '_save_attribute' event with (5c:02:72:ff:fe:bd:51:c4, 6, 0, 4, 'Insta GmbH') params: FOREIGN KEY constraint failed
[0x1D12:6:0x0003]: finished channel configuration
[0x1D12:6:0x0000]: finished channel configuration
[0x1D12:6:0x0019]: finished channel configuration
[0x1D12:7:0x0003]: finished channel configuration
[0x1D12:7:0x0000]: finished channel configuration
[0x1D12:7:0x0019]: finished channel configuration
Error handling '_save_attribute' event with (5c:02:72:ff:fe:bd:51:c4, 6, 0, 5, 'Generic UP Device') params: FOREIGN KEY constraint failed
[0x1D12:6:0x0102]: bound 'window_covering' cluster: Status.SUCCESS
[0x1D12:7:0x0102]: bound 'window_covering' cluster: Status.SUCCESS
[0x1D12:7:0x0102]: finished channel configuration
[0x1D12:7:0x0003]: 'async_configure' stage succeeded
[0x1D12:7:0x0000]: 'async_configure' stage succeeded
[0x1D12:7:0x0102]: 'async_configure' stage succeeded
[0x1D12:7:0x0019]: 'async_configure' stage succeeded
[0x1d12:6:0x0102] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=121 command_id=Command.Configure_Reporting_rsp>
[0x1D12:6:0x0102]: Successfully configured reporting for '{'current_position_lift_percentage': (0, 900, 1)}' on 'window_covering' cluster: [ConfigureReportingResponseRecord(status=0)]
[0x1D12:6:0x0102]: finished channel configuration
[0x1D12:6:0x0102]: 'async_configure' stage succeeded
[0x1D12:6:0x0003]: 'async_configure' stage succeeded
[0x1D12:6:0x0000]: 'async_configure' stage succeeded
[0x1D12:6:0x0019]: 'async_configure' stage succeeded
[0x1D12](Generic UP Device): completed configuration
[0x1D12](Generic UP Device): stored in registry: ZhaDeviceEntry(name='Insta GmbH Generic UP Device', ieee='5c:02:72:ff:fe:bd:51:c4', last_seen=1645871956.2753153)
[0x1D12](Generic UP Device): started initialization
[0x1D12:ZDO](Generic UP Device): 'async_initialize' stage succeeded
[0x1D12:6:0x0102]: initializing channel: from_cache: False
[0x1D12:6:0x0003]: initializing channel: from_cache: False
[0x1D12:6:0x0003]: finished channel initialization
[0x1D12:6:0x0000]: initializing channel: from_cache: False
[0x1D12:6:0x0000]: finished channel initialization
[0x1D12:6:0x0019]: initializing channel: from_cache: False
[0x1D12:6:0x0019]: finished channel initialization
[0x1D12:7:0x0003]: initializing channel: from_cache: False
[0x1D12:7:0x0003]: finished channel initialization
[0x1D12:7:0x0000]: initializing channel: from_cache: False
[0x1D12:7:0x0000]: finished channel initialization
[0x1D12:7:0x0102]: initializing channel: from_cache: False
[0x1D12:7:0x0102]: finished channel initialization
[0x1D12:7:0x0019]: initializing channel: from_cache: False
[0x1D12:7:0x0019]: finished channel initialization
[0x1D12:7:0x0003]: 'async_initialize' stage succeeded
[0x1D12:7:0x0000]: 'async_initialize' stage succeeded
[0x1D12:7:0x0102]: 'async_initialize' stage succeeded
[0x1D12:7:0x0019]: 'async_initialize' stage succeeded
[0x1d12:6:0x0102] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=123 command_id=Command.Read_Attributes_rsp>
[0x1D12:6:0x0102]: Attribute report 'Window Covering'[current_position_lift_percentage] = 0
[0x1D12:6:0x0102]: finished channel initialization
[0x1D12:6:0x0102]: 'async_initialize' stage succeeded
[0x1D12:6:0x0003]: 'async_initialize' stage succeeded
[0x1D12:6:0x0000]: 'async_initialize' stage succeeded
[0x1D12:6:0x0019]: 'async_initialize' stage succeeded
[0x1D12](Generic UP Device): power source: Mains
[0x1D12](Generic UP Device): completed initialization
[0x1d12:6:0x0102] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=125 command_id=Command.Read_Attributes_rsp>
[0x1D12:6:0x0102]: Attribute report 'Window Covering'[current_position_lift_percentage] = 0
[0x1D12:6:0x0102]: read current position: 0
polling current state
read pos=0
[0x1d12:zdo] ZDO request ZDOCmd.Match_Desc_req: [0xFFFD, 49246, [258], []]
[0x1d12:zdo] ZDO request ZDOCmd.Match_Desc_req: [0xFFFD, 260, [258], []]
[0x1d12:zdo] ZDO request ZDOCmd.Match_Desc_req: [0xFFFD, 49246, [258], []]
[0x1d12:zdo] ZDO request ZDOCmd.Match_Desc_req: [0xFFFD, 260, [258], []]

HA log https://gist.github.com/cremor/ba36e802502f72a4945a95e5cc55f196 (too long to embed in issue)

Example zha_events When I close/stop/open the blinds via the manual buttons, the following zha_events are received (but HA doesn’t update the entity states).

Click to show
{
    "event_type": "zha_event",
    "data": {
        "device_ieee": "5c:02:72:ff:fe:bd:50:88",
        "unique_id": "5c:02:72:ff:fe:bd:50:88:7:0x0102",
        "device_id": "51b7890b4fd8e23b7748ca1153199aa4",
        "endpoint_id": 7,
        "cluster_id": 258,
        "command": "down_close",
        "args": []
    },
    "origin": "LOCAL",
    "time_fired": "2022-02-26T14:24:07.625340+00:00",
    "context": {
        "id": "6c749470685dfed00d198a3b4da7fce7",
        "parent_id": null,
        "user_id": null
    }
}
{
    "event_type": "zha_event",
    "data": {
        "device_ieee": "5c:02:72:ff:fe:bd:50:88",
        "unique_id": "5c:02:72:ff:fe:bd:50:88:7:0x0102",
        "device_id": "51b7890b4fd8e23b7748ca1153199aa4",
        "endpoint_id": 7,
        "cluster_id": 258,
        "command": "stop",
        "args": []
    },
    "origin": "LOCAL",
    "time_fired": "2022-02-26T14:24:11.775924+00:00",
    "context": {
        "id": "22f0d715b5d9c41fe6f9184b33fde322",
        "parent_id": null,
        "user_id": null
    }
}
{
    "event_type": "zha_event",
    "data": {
        "device_ieee": "5c:02:72:ff:fe:bd:50:88",
        "unique_id": "5c:02:72:ff:fe:bd:50:88:7:0x0102",
        "device_id": "51b7890b4fd8e23b7748ca1153199aa4",
        "endpoint_id": 7,
        "cluster_id": 258,
        "command": "up_open",
        "args": []
    },
    "origin": "LOCAL",
    "time_fired": "2022-02-26T14:24:13.059192+00:00",
    "context": {
        "id": "b18490e2add2d7c56f91ba2b5e184873",
        "parent_id": null,
        "user_id": null
    }
}

Additional context

Picture of the device:

Issue Analytics

  • State:open
  • Created 2 years ago
  • Comments:7 (3 by maintainers)

github_iconTop GitHub Comments

1reaction
Heddacommented, Sep 23, 2022

Temporary workaround until there is native tilt support for cover in ZHA could be to experiment with automations using ZHA toolkit and/or dumpfheimer framework for generic exposure of device configuration attributes. See -> zigpy/zigpy#934 and/or https://github.com/mdeweerd/zha-toolkit + https://community.home-assistant.io/t/zha-toolkit-toolkit-providing-low-and-high-level-zigbee-commands-through-zha-zigpy/373346 but that is probably more work than extending zha component cover support.

Again, be sure to check out a the related zigpy development discussion here -> https://github.com/zigpy/zigpy/discussions/934

Developers there discuss ideas to expose more generic device configuration attributes in an easy way for ZHA UI/GUI.

1reaction
cremorcommented, Mar 18, 2022

Thanks to the documentation of zha-toolkit I now figured out how to set the tilt position. (Btw, I would have figured this out way earlier if home-assistant/frontend#10633 would have been fixed already.)

The following script works:

alias: Set cover tilt position
mode: single
icon: mdi:boom-gate-up
fields:
  entity:
    name: Entity
    required: true
    selector:
      entity:
        domain: cover
  value:
    name: Value
    required: true
    selector:
      number:
        min: 0
        max: 100
sequence:
  - service: zha.issue_zigbee_cluster_command
    data:
      ieee: '{{ (device_attr(entity, "identifiers") | list).0.1 }}'
      endpoint_id: 6
      cluster_id: 258
      command: 8
      command_type: server
      args:
        - '{{ 100 - value }}'

(Getting the IEEE would be easier/nicer with zha-toolkit, but that’s fine for me now.)

Endpoint, cluster and command ids are the ones from the Zigbee standard, so nothing device or vendor specific is needed. Zigpy also already supports those as a go_to_tilt_percentage command: https://github.com/zigpy/zigpy/blob/0c4b9a8a25c5eef5b008d66c2e56aae3f8d5e769/zigpy/zcl/clusters/closures.py#L568 It’s just ZHA which is not using the functionality provided by Zigpy.

Read more comments on GitHub >

github_iconTop Results From Across the Web

Zigbee Blinds Actuator Mini - Insta GmbH
Blinds actuator for control of electrical blinds, shutters or awning in a Zigbee 3.0 system. The device provides two inputs for connecting blind...
Read more >
NEXENTRO Zigbee Blinds Actuator Mini - WATT24
NEXENTRO blind actuator for controlling electrical blinds or shutters in a Zigbee 3.0 system. It can be operated in an existing Zigbee universe...
Read more >
Insta Nexentro Blinds Actuator Mini 57008000 Zigbee ...
If the device is following Zigbee standards it is possible it will work with other gateway solutions, it is just not confirmed as...
Read more >
Does ZHA not support tilt for covers/blinds? - Zigbee
Hi, I'm trying to correctly add a cover/blinds device to ZHA. ... request: [Device Support Request] Insta GmbH Nexentro Blinds Actuator Mini ......
Read more >
Installation - NEXENTRO
If you tend to be all thumbs, then please call an electrician to have everything ... Conversion of a blinds push-button with the...
Read more >

github_iconTop Related Medium Post

No results found

github_iconTop Related StackOverflow Question

No results found

github_iconTroubleshoot Live Code

Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free

github_iconTop Related Reddit Thread

No results found

github_iconTop Related Hackernoon Post

No results found

github_iconTop Related Tweet

No results found

github_iconTop Related Dev.to Post

No results found

github_iconTop Related Hashnode Post

No results found