Schneider Electric Shutter quirk?

I was trying to avoid doing this but got an email this morning from Schneider Electric saying that the app and the hub will be turned off in October. I have about 10 of these to do.

I’ve added 1 shutter to my HA but the controls are all wrong. This is just a standard up/down shutter control. I think I need a “quirk?” if so, where do I find one and how to download/install? I think I would also need to adjust the runtime of the device. Not sure what the -155%.

Appreciate advice/help.

Device info
1GANG/SHUTTER/1
by Schneider Electric
Firmware: 0x020410ff
Zigbee info

IEEE: 60:a4:23:ff:fe:8b:ed:3c
Nwk: 0x6364
Device Type: Router
LQI: 32
RSSI: Unknown
Last seen: 2024-04-19T12:45:22
Power source: Mains

Are you using ZHA? It should already have basic quirk available for these shutters: zha-device-handlers/zhaquirks/schneiderelectric/shutters.py at 0a0f6676d870b29ba704e43aeb08e208c086038c · zigpy/zha-device-handlers · GitHub

Specifically, SEWindowCovering which exposes extra attributes. You should be able to see them if you go to “Manage zigbee device” and look for SEWindowCovering cluster.

Note that this quirk was written before spec docs for some of the schneider devices were published, hence a few unknown attributes in the quirk.

Specifically, I’m guessing the spec for NHPB/SHUTTER/1 should be very similar to your version.

You can check if the existing quirk is enough for you. If not, you either try to write your own quirk with this new information (preferably contributing to upstream), or wait for someone to add the missing functionality from the spec.

I’m planning to buy shutter controls from Schneider too at some point, so might add everything from the spec when I’ll have for it, but not promises.

1 Like

Note that mentioned quirk was added to zha-quirks 0.0.112 which was added to home assistant 2024.3 (if my investigations are correct), so make sure you are running the latest version of home assistant.

1 Like

Hello

I created the quirk next
and it works for me

"""Quirks for Schneider Electric shutters."""

from zigpy.profiles import zha
from zigpy.quirks import CustomDevice
from zigpy.zcl.clusters.closures import WindowCovering
from zigpy.zcl.clusters.general import (
    Basic,
    Groups,
    Identify,
    LevelControl,
    OnOff,
    Ota,
    Scenes,
)
from zigpy.zcl.clusters.homeautomation import Diagnostic

from zhaquirks.const import (
    DEVICE_TYPE,
    ENDPOINTS,
    INPUT_CLUSTERS,
    MODELS_INFO,
    OUTPUT_CLUSTERS,
    PROFILE_ID,
)
from zhaquirks.schneiderelectric import (
    SE_MANUF_NAME,
    SEBasic,
    SESpecific,
    SEWindowCovering,
)


class NhpbShutter1(CustomDevice):
    """NHPB/SHUTTER/1 from Schneider Electric."""

    signature = {
        MODELS_INFO: [
            (SE_MANUF_NAME, "NHPB/SHUTTER/1"),
        ],
        ENDPOINTS: {
            # <SimpleDescriptor endpoint=5, profile=260, device_type=514,
            # device_version=0,
            # input_clusters=[0, 3, 4, 5, 258, 2821],
            # output_clusters=[25]>
            5: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: zha.DeviceType.WINDOW_COVERING_DEVICE,
                INPUT_CLUSTERS: [
                    Basic.cluster_id,
                    Identify.cluster_id,
                    Groups.cluster_id,
                    Scenes.cluster_id,
                    WindowCovering.cluster_id,
                    Diagnostic.cluster_id,
                ],
                OUTPUT_CLUSTERS: [Ota.cluster_id],
            },
            # <SimpleDescriptor endpoint=21, profile=260, device_type=260,
            # device_version=0,
            # input_clusters=[0, 3, 2821, 65303],
            # output_clusters=[3, 4, 5, 6, 8, 258]>
            21: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: zha.DeviceType.DIMMER_SWITCH,
                INPUT_CLUSTERS: [
                    Basic.cluster_id,
                    Identify.cluster_id,
                    Diagnostic.cluster_id,
                    SESpecific.cluster_id,
                ],
                OUTPUT_CLUSTERS: [
                    Identify.cluster_id,
                    Groups.cluster_id,
                    Scenes.cluster_id,
                    OnOff.cluster_id,
                    LevelControl.cluster_id,
                    WindowCovering.cluster_id,
                ],
            },
            242: {
                PROFILE_ID: 41440,
                DEVICE_TYPE: 97,
                INPUT_CLUSTERS: [],
                OUTPUT_CLUSTERS: [33],
            },
        },
    }

    replacement = {
        ENDPOINTS: {
            5: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: zha.DeviceType.WINDOW_COVERING_DEVICE,
                INPUT_CLUSTERS: [
                    SEBasic,
                    Identify.cluster_id,
                    Groups.cluster_id,
                    Scenes.cluster_id,
                    SEWindowCovering,
                    Diagnostic.cluster_id,
                ],
                OUTPUT_CLUSTERS: [Ota.cluster_id],
            },
            21: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: zha.DeviceType.DIMMER_SWITCH,
                INPUT_CLUSTERS: [
                    SEBasic,
                    Identify.cluster_id,
                    Diagnostic.cluster_id,
                    SESpecific,
                ],
                OUTPUT_CLUSTERS: [
                    Identify.cluster_id,
                    Groups.cluster_id,
                    Scenes.cluster_id,
                    OnOff.cluster_id,
                    LevelControl.cluster_id,
                    SEWindowCovering,
                ],
            },
            242: {
                PROFILE_ID: 41440,
                DEVICE_TYPE: 97,
                INPUT_CLUSTERS: [],
                OUTPUT_CLUSTERS: [33],
            },
        }
    }