iBlinds is light instead of cover?

I paired my new iBlinds via z-wave and home assistant added switch and light entities instead of a cover entity. Does anyone know how to fix that?

Take a look at the configuration > customizations menu. From their you should be able to set the device class. IF that doesn’t work you can modify the customization.yaml file.

Unless I’m not understanding the docs, the “device class” appears to be a subset for certain types of entity. For example, a cover entity can have a specific class like “awning” or “blind”, but it already has to be a cover entity. My entities are “light” and “switch”, which seems really strange and doesn’t appear to be configurable.

If the UI won’t give you the correct option, try editing the customize.yaml file. Not exactly the same, but the entry should be something like this.

cover.garage_door_audi:
  hidden: false
  device_class: garage

That’s the trouble…I don’t have a cover entity to configure. When I added the device to z-wave it gave me a light entity and a switch entity: light.xxxx and switch.xxxx (and sensor.xxxx for battery level). There probably shouldn’t be a switch entity, and the light entity should be a cover entity. I don’t know why it added the entities this way when I joined the device to the z-wave network, nor do I know how to fix the light entity to be a cover entity instead.

What does the XML look like for this device? Look in the file zwcfg*.xml in your config directory. If you haven’t restarted HA since adding the node, you’ll either need to do so, or in the z-wave config panel click on “SAVE CONFIG”.

Although I’m comfortable making edits to zwcfg, I’m not up to speed on the command class settings.

Here is the XML for the iBlinds node:

	<Node id="50" name="" location="" basic="4" generic="17" specific="0" roletype="7" devicetype="6400" nodetype="0" type="Multilevel Switch" listening="false" frequentListening="true" beaming="true" routing="true" max_baud_rate="40000" version="4" query_stage="Complete">
		<Manufacturer id="287" name="HAB Home Intelligence LLC">
			<Product type="3" id="d" name="iBlinds" />
		</Manufacturer>
		<CommandClasses>
			<CommandClass id="32" name="COMMAND_CLASS_BASIC" version="1" request_flags="4" mapping="38">
				<Instance index="1" />
			</CommandClass>
			<CommandClass id="37" name="COMMAND_CLASS_SWITCH_BINARY" version="1" request_flags="4" innif="true">
				<Instance index="1" />
				<Value type="bool" genre="user" instance="1" index="0" label="Switch" units="" read_only="false" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="0" value="False" />
			</CommandClass>
			<CommandClass id="38" name="COMMAND_CLASS_SWITCH_MULTILEVEL" version="4" getsupported="false" innif="true">
				<Instance index="1" />
				<Value type="byte" genre="user" instance="1" index="0" label="Level" units="" read_only="false" write_only="false" verify_changes="false" poll_intensity="0" min="1" max="255" value="2" />
				<Value type="button" genre="user" instance="1" index="1" label="Bright" units="" read_only="false" write_only="true" verify_changes="false" poll_intensity="0" min="0" max="0" />
				<Value type="button" genre="user" instance="1" index="2" label="Dim" units="" read_only="false" write_only="true" verify_changes="false" poll_intensity="0" min="0" max="0" />
				<Value type="bool" genre="system" instance="1" index="3" label="Ignore Start Level" units="" read_only="false" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="0" value="True" />
				<Value type="byte" genre="system" instance="1" index="4" label="Start Level" units="" read_only="false" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="255" value="0" />
			</CommandClass>
			<CommandClass id="90" name="COMMAND_CLASS_DEVICE_RESET_LOCALLY" version="1" request_flags="4" innif="true">
				<Instance index="1" />
			</CommandClass>
			<CommandClass id="94" name="COMMAND_CLASS_ZWAVEPLUS_INFO" version="1" request_flags="4" innif="true">
				<Instance index="1" />
				<Value type="byte" genre="system" instance="1" index="0" label="ZWave+ Version" units="" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="255" value="1" />
				<Value type="short" genre="system" instance="1" index="1" label="InstallerIcon" units="" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="-32768" max="32767" value="6400" />
				<Value type="short" genre="system" instance="1" index="2" label="UserIcon" units="" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="-32768" max="32767" value="6400" />
			</CommandClass>
			<CommandClass id="112" name="COMMAND_CLASS_CONFIGURATION" version="1" request_flags="4" innif="true">
				<Instance index="1" />
			</CommandClass>
			<CommandClass id="114" name="COMMAND_CLASS_MANUFACTURER_SPECIFIC" version="1" request_flags="4" innif="true">
				<Instance index="1" />
			</CommandClass>
			<CommandClass id="115" name="COMMAND_CLASS_POWERLEVEL" version="1" request_flags="4" innif="true">
				<Instance index="1" />
				<Value type="list" genre="system" instance="1" index="0" label="Powerlevel" units="dB" read_only="false" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="0" vindex="0" size="1">
					<Item label="Normal" value="0" />
					<Item label="-1dB" value="1" />
					<Item label="-2dB" value="2" />
					<Item label="-3dB" value="3" />
					<Item label="-4dB" value="4" />
					<Item label="-5dB" value="5" />
					<Item label="-6dB" value="6" />
					<Item label="-7dB" value="7" />
					<Item label="-8dB" value="8" />
					<Item label="-9dB" value="9" />
				</Value>
				<Value type="byte" genre="system" instance="1" index="1" label="Timeout" units="seconds" read_only="false" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="255" value="0" />
				<Value type="button" genre="system" instance="1" index="2" label="Set Powerlevel" units="" read_only="false" write_only="true" verify_changes="false" poll_intensity="0" min="0" max="0" />
				<Value type="byte" genre="system" instance="1" index="3" label="Test Node" units="" read_only="false" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="255" value="0" />
				<Value type="list" genre="system" instance="1" index="4" label="Test Powerlevel" units="dB" read_only="false" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="0" vindex="0" size="1">
					<Item label="Normal" value="0" />
					<Item label="-1dB" value="1" />
					<Item label="-2dB" value="2" />
					<Item label="-3dB" value="3" />
					<Item label="-4dB" value="4" />
					<Item label="-5dB" value="5" />
					<Item label="-6dB" value="6" />
					<Item label="-7dB" value="7" />
					<Item label="-8dB" value="8" />
					<Item label="-9dB" value="9" />
				</Value>
				<Value type="short" genre="system" instance="1" index="5" label="Frame Count" units="" read_only="false" write_only="false" verify_changes="false" poll_intensity="0" min="-32768" max="32767" value="0" />
				<Value type="button" genre="system" instance="1" index="6" label="Test" units="" read_only="false" write_only="true" verify_changes="false" poll_intensity="0" min="0" max="0" />
				<Value type="button" genre="system" instance="1" index="7" label="Report" units="" read_only="false" write_only="true" verify_changes="false" poll_intensity="0" min="0" max="0" />
				<Value type="list" genre="system" instance="1" index="8" label="Test Status" units="" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="0" vindex="0" size="1">
					<Item label="Failed" value="0" />
					<Item label="Success" value="1" />
					<Item label="In Progress" value="2" />
				</Value>
				<Value type="short" genre="system" instance="1" index="9" label="Acked Frames" units="" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="-32768" max="32767" value="0" />
			</CommandClass>
			<CommandClass id="128" name="COMMAND_CLASS_BATTERY" version="1" request_flags="4" innif="true">
				<Instance index="1" />
				<Value type="byte" genre="user" instance="1" index="0" label="Battery Level" units="%" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="255" value="100" />
			</CommandClass>
			<CommandClass id="133" name="COMMAND_CLASS_ASSOCIATION" version="1" request_flags="4" innif="true">
				<Instance index="1" />
				<Associations num_groups="1">
					<Group index="1" max_associations="1" label="Group 1" auto="true">
						<Node id="1" />
					</Group>
				</Associations>
			</CommandClass>
			<CommandClass id="134" name="COMMAND_CLASS_VERSION" version="1" request_flags="4" innif="true">
				<Instance index="1" />
				<Value type="string" genre="system" instance="1" index="0" label="Library Version" units="" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="0" value="3" />
				<Value type="string" genre="system" instance="1" index="1" label="Protocol Version" units="" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="0" value="4.33" />
				<Value type="string" genre="system" instance="1" index="2" label="Application Version" units="" read_only="true" write_only="false" verify_changes="false" poll_intensity="0" min="0" max="0" value="1.65" />
			</CommandClass>
		</CommandClasses>
	</Node>

I think the problem is in the first line, specific="0". It causes HA to believe your window blind controller is just a dimmer switch. If you want to try a hack to see if it works, you can change that value to specific="6". First you’d want to stop HA, then edit the file (make a backup), then restart.

Thanks, I’ll give that a try and report my result.

@freshcoast, that fixed the entities! I now have 2 cover entities, one for the switch and one for the multilevel-switch.

Any chance you can point me to a resource where you got that knowledge from?

HA discovers entities by looking at a combination of the Node’s generic device type, specific type, and its command classes. For example, in order for a roller-shutter cover to be discovered, the node needs to satisfy the following:

  • Generic device type is GENERIC_TYPE_SWITCH_MULTILEVEL (17) or GENERIC_TYPE_ENTRY_CONTROL (64)
  • One of several specific types (not including 0)
  • And support command class SWITCH_MULTILEVEL

Your iBlinds device matches the GENERIC_TYPE_SWITCH_MULTILEVEL, and it supports class SWITCH_MULTILEVEL, but a specific type of 0 (NOT_USED) does not match the cover schema. Instead, that combination matches the light schema, which allows a NOT_USED specific type.

I found your device on the Z-Wave Products DB. It says it is certified with Z-Wave Device Type: Window Covering - Endpoint Aware. All Z-Wave Plus devices have defined role types. If you look in the spec, SDS11847 - Z-Wave Plus Device Type Specification, you’ll see in section 4.34 that a Window Covering Endpoint Aware device type has identifiers GENERIC_TYPE_SWITCH_MULTILEVEL and SPECIFIC_TYPE_CLASS_B_MOTOR_CONTROL. The B Motor Control specific type happens to be value 6, which is why I suggested it. The spec also says that Multilevel Switch is one of the required supported command classes.

The switch is weird, it exists because HA is using the same discovery schema but with command class BINARY_SWITCH, it thinks that’s for garage doors. Note that it’s not a requirement for window covers. The cover entity that matches the multilevel switch is probably more useful?

My question is why is the device reporting specific type 0? I would guess it’s a bug or design issue with the product. I’m not aware of any OZW bugs that would cause this, after all, it works for 99% of devices. You might try contacting the manufacturer and see if they’ll confirm the problem.

Finally, what is a permanent solution? Most device quirks can be address by defining an XML config file, however I am doubtful that is possible for this case. HA already implements a variety of “workarounds”, that force domain discovery for some devies, so this one might be a candidate for that. I can try and post a workaround.

If you want to try it, I wrote up a possible (untested) workaround. It’s based off of HA 0.104.2. In order to test it, you would need to download the modified code, install it as a custom component, and revert your zwcfg*.xml so that it is back to specific="0". That latter part isn’t technically necessary, but you couldn’t tell if it’s working otherwise.

Otherwise, as long as you have the modified zwcfg*.xml file your cover entities will be retained. Just keep an occasional backup in case the file is lost or corrupted.

Thanks for that very thorough reply…exactly what I needed! I’m very technical, but OZW and HA are definite gaps for me at the moment and I have a lot of catching up to do.

Does OZW generate the XML in zwcfg purely based on data received from the device when it is paired, or is there an XML master device template it uses as a reference? I’ve had other devices that needed zwcfg tweaks, such as my Aeotec 4-button remote and I’ve been wondering for a while what’s going on under the covers and how it’s wrong so often.

I looked at the commit for your workaround. It’s my first time taking a peek at the HA source. It’s been on my list for a while but other priorities have been keeping me busy. Interesting that there is a workaround.py already. I’ll give it a try as soon as I can, but might take me a few days.

Things like product name and config parameters are set with the device config XML file. Most everything else is discovered when the node is added. Some quirks or compatibility issues can be addressed in the config file. The OZW Wiki explains more, including how to add a device file.

Thanks for clarification on OZW and the link.

Your workaround didn’t seem to work. My blind stopped having switch and dimmer entities, but it does not have a cover entity either. I’m guessing it detected the right device since the old entities are missing, but it didn’t create the cover entity for some reason.