[Device Support Request] Insta GmbH Nexentro Blinds Actuator Mini
See original GitHub issueIs 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
- Manufacturer device page (contains links to data sheet, Zigbee certification and device manual): https://www.insta.de/product-solutions/nexentro/zigbee_blinds_actuator_mini
- Zigbee compliance docs and cluster descriptions: https://www.insta.de/files/Insta/media/product_docs/Zertifikate/57008000_picsnexentrozigbeeblindsactuatormini.zip Source: https://www.nexentro.de/help/#open-source
- Entry in Zigbee Device Compatibility Repository: https://zigbee.blakadder.com/Insta_57008000.html
- Zigbee2MQTT device page: https://www.zigbee2mqtt.io/devices/57008000.html
- deCONZ thread: https://forum.phoscon.de/t/insta-nexentro-blinds-actuator-mini/687
Picture of the device:
Issue Analytics
- State:
- Created 2 years ago
- Comments:7 (3 by maintainers)
Top GitHub Comments
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.
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:
(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.