Qubino Flush Shutter - no Slider

I have been trying hard to move over all my devices from an old installation over to a Smartthings hub, V2. I have around 15 blinds in my home, all connected to a Z-Wave controller using Zipato Micro Module Controller, except for 1, which is connected using a Qubino Flush Shutter device. Today I have been connecting the blinds, and the Zipato Micro Module Motor Controllers - to my surprise - worked like a charm, but the Qubino Flush Shutter is giving me a massive headache. I have tried everything I can imagine, yet nothing works… I have allowed it to take the stock DTH, but this appears without a slider. I also found a DTH on the community, on a post saying it was written by Smartthings - and I created a DTH using that code - it appears to be much the same as the stock DTH.

Primarily, I do not see the slider when I click on the device in the ST app… So I can only Open, Close, or Pause. However, those too are not working well, and by this I mean sometimes they work, sometimes not, . I performed a factory reset of the device, and so I suspected I needed to calibrate it again. I tried using the automated calibration, but no joy. Blind goes all the way up, then starts going down and never makes it all the way down, stopping say 1/3 of the way down, or 3/4 of the way down… I am baffled and have read a lot but can find no easy solution.

Has anyone come across anything similar using these devices? Anything you can suggest please?

EDIT:

This is the post from where I took SmartThings’s own DTH:

But as I said, still no slider appears even with this one… Even though the code clearly appears to support a slider.

I feel your pain…

Have a look here and read:

And then reach out to Qubino… I cannot give better advice, unfortunately.

Hi @GSzabados - thanks for answering.

I suspect that the slider was not being displayed because the DTH detected that the device did not finish the calibration. Despit what Qubino says on their website, Smartthings does have a stock DTH for this device, and so I really would expect it to work - and hence I was blaming my failure to complete calibration. That said, at one point the device stopped working completely for me, and I replaced it with a spare Zipato Micro Module Motor Controller device that I found in my home, performed the calibration with it, and worked like a charm, and to be frank I gave up on the Qubino for now since this seems to have worked. I will see whether I need to revive this later as I still have two motorised awnings that I need to look into automating.

In any case, many thanks for your reply, I might revive the topic later on - when I manage to find where the home automation devices that control the awnings are hidden, if those devices happen to be Qubino Flush Shutter (hopefully not, though!).

@martin.borg, there is a fine line between manufacturers, and that is the features what a device can render for the user. SmartThings’ approach to use the same device handler for everything what does the same makes this line disappear and renders the same device as useless as the others. I mean, compare a Qubino roller shutter with a Fibaro roller shutter, or Mob.iq (Mobius) roller shutter (probably you never heard about the last one, I have 10 of them). The first two has multiple options for venetian blinds and different type of switches and buttons and to swap directions. A device is not only about up and down or on and off, it is more about the options in this segment of the market. Blindly SmartThings doesn’t care about this.

These devices were working nicely in the Classic app. And it wasn’t hard to write a good device handler which would contain all the options. But this has changed a lot and the companies like Qubino hasn’t caught up with the new app and the recent changes.

This from the site, what I posted above.

The rest of the Qubino devices are in the integration process. When a new device will be officially integrated, we will notify you through our mailings, social media channels and update this article.

In the meantime, you should use custom handlers and the classic SmartThings App .

NOTE: By using these custom handlers, the Qubino devices may not work correctly or some of the functionalities may be missing

Here you can find custom handlers for the rest of Qubino products:

Just to make clear, there is no Classic app anymore. The suggested custom handlers hasn’t been updated since 2017. (I think that was the year what I read in one of them.) And the manufacturers are responsible for the integration for a quite long time now.
So, you might want to contact Qubino to update those handlers.

Otherwise, what kind of house do you live in where you just find a Zipato module and the other hidden controllers?

I’ve got my hand on a Qubino Roller Shutter, and I see what is the issue.

The old capability list had something called Window Shade Level, but I found it in one of the ST stock DHs:

capability "Switch Level" // until we get a Window Shade Level capability

There was a commit to revert the Window Shade Level capability changes in the stock DHs about 7 month ago:

But after digging around a bit, it turns out that there is a proposed Capability of Window Shade Level… And I believe I have found why the slider is not working. It is probably a tiny change in the DH, but I have found something else what might would make sense to change as well. That is something what I haven’t fixed yet.

I will post later on a DH if you want to try that Qubino Shutter by yourself. And if it is working, I can try to raise a PR to fix the DH in the SmartThings repo.

So, the story is that, Window Shade Level is a proposed capability, according the API.

{

    "id": "windowShadeLevel",

    "version": 1,

    "status": "proposed",

    "name": "Window Shade Level",

    "attributes": {

        "shadeLevel": {

            "schema": {

                "title": "IntegerPercent",

                "type": "object",

                "properties": {

                    "value": {

                        "type": "integer",

                        "minimum": 0,

                        "maximum": 100

                    },

                    "unit": {

                        "type": "string",

                        "enum": [

                            "%"

                        ],

                        "default": "%"

                    }

                },

                "additionalProperties": false,

                "required": [

                    "value"

                ]

            },

            "setter": "setShadeLevel",

            "enumCommands": []

        }

    },

    "commands": {

        "setShadeLevel": {

            "arguments": [

                {

                    "name": "shadeLevel",

                    "optional": false,

                    "schema": {

                        "type": "integer",

                        "minimum": 0,

                        "maximum": 100

                    }

                }

            ]

        }

    }

}

And if a DH uses it by default, then it is not rendered in the app. What a headache…

BUT, the Qubino Flush Shutter DH does render it as a slider, but why! I did an API request to see the representaionId and it turns out that the Qubino Flush Shutter DH has a vid value, what is not listed in the DH in the GitHub repo.

            "name": "Qubino Window Treatment",

            "label": "Qubino Window Treatment",

            "manufacturerName": "SmartThings",

            "presentationId": "SmartThings-smartthings-Qubino_Flush_Shutter",

            "deviceManufacturerCode": "0159-0003-0052",

So now DHs can have representations without defining the vid in the code??? No idea, another thing what hasn’t been documented (again)…

But the story doesn’t ends here, I modify the DH’s code to have some changes to see in live logging what is happening, what the device reports. And what, it turns out that the device-presentation is not working so well, I can try as hard as I can pull down the display to do a refresh, the refresh part of the code is not executed, and the device-presentation contains the refresh as well. Otherwise, I haven’t seen that many server errors before, when executing a direct connected DH.

{
    "manufacturerName": "SmartThings",
    "presentationId": "SmartThings-smartthings-Qubino_Flush_Shutter",
    "mnmn": "SmartThings",
    "vid": "SmartThings-smartthings-Qubino_Flush_Shutter",
    "version": "0.0.1",
    "dashboard": {
        "states": [
            {
                "label": "{{energy.value}}{{energy.unit}}",
                "capability": "energyMeter",
                "version": 1,
                "component": "main"
            },
            {
                "label": "{{windowShade.value}}",
                "alternatives": [
                    {
                        "key": "closed",
                        "value": "___PO_CODE_SMARTTHINGS_DREAM_SAC_SBODY_CLOSED",
                        "type": "inactive"
                    },
                    {
                        "key": "open",
                        "value": "___PO_CODE_SMARTTHINGS_DREAM_SAC_SBODY_OPEN",
                        "type": "active"
                    },
                    {
                        "key": "unknown",
                        "value": "___PO_CODE_SMARTTHINGS_DREAM_SAC_SBODY_UNKNOWN",
                        "type": "active"
                    },
                    {
                        "key": "opening",
                        "value": "___PO_CODE_SMARTTHINGS_DREAM_SAC_SBODY_OPENING_ING",
                        "type": "active"
                    },
                    {
                        "key": "closing",
                        "value": "___PO_CODE_SMARTTHINGS_DREAM_SAC_SBODY_CLOSING_ING",
                        "type": "inactive"
                    },
                    {
                        "key": "partially open",
                        "value": "___PO_CODE_SMARTTHINGS_DREAM_SAC_BODY_PARTIALLY_OPEN",
                        "type": "active"
                    },
                    {
                        "key": "pause",
                        "value": "___PO_CODE_SMARTTHINGS_DREAM_SAC_BUTTON_PAUSE_12",
                        "type": "inactive"
                    }
                ],
                "capability": "windowShade",
                "version": 1,
                "component": "main"
            },
            {
                "label": "{{shadeLevel.value}}",
                "capability": "windowShadeLevel",
                "version": 1,
                "component": "main"
            }
        ],
        "actions": [
            {
                "displayType": "pushButton",
                "pushButton": {
                    "command": "refresh"
                },
                "capability": "refresh",
                "version": 1,
                "component": "main"
            },
            {
                "displayType": "toggleSwitch",
                "toggleSwitch": {
                    "command": {
                        "on": "open",
                        "off": "close"
                    },
                    "state": {
                        "value": "windowShade.value",
                        "on": "open",
                        "off": "closed"
                    }
                },
                "capability": "windowShade",
                "version": 1,
                "component": "main"
            }
        ],
        "basicPlus": []
    },
    "detailView": [
        {
            "capability": "refresh",
            "version": 1,
            "label": "___PO_CODE_SMARTTHINGS_DREAM_SAC_BUTTON_REFRESH_8",
            "displayType": "pushButton",
            "pushButton": {
                "command": "refresh"
            },
            "state": null,
            "component": "main"
        },
        {
            "capability": "energyMeter",
            "version": 1,
            "label": "___PO_CODE_SMARTTHINGS_DREAM_SAC_HEADER_ENERGY_METER",
            "displayType": "slider",
            "slider": {
                "range": [
                    0,
                    999.9
                ],
                "step": null,
                "unit": "energy.unit",
                "value": "energy.value"
            },
            "state": null,
            "component": "main"
        },
        {
            "capability": "powerMeter",
            "version": 1,
            "label": "___PO_CODE_SMARTTHINGS_DREAM_SAC_TMBODY_POWER_METER",
            "displayType": "slider",
            "slider": {
                "range": [
                    0,
                    999.9
                ],
                "step": null,
                "unit": "power.unit",
                "value": "power.value"
            },
            "state": null,
            "component": "main"
        },
        {
            "capability": "windowShade",
            "version": 1,
            "label": "___PO_CODE_SMARTTHINGS_DREAM_SAC_HEADER_WINDOW_SHADE",
            "displayType": "list",
            "list": {
                "command": {
                    "alternatives": [
                        {
                            "key": "close",
                            "value": "___PO_CODE_SMARTTHINGS_DREAM_SAC_BUTTON_CLOSE_12",
                            "type": "active"
                        },
                        {
                            "key": "open",
                            "value": "___PO_CODE_SMARTTHINGS_DREAM_SAC_SBODY_OPEN",
                            "type": "active"
                        },
                        {
                            "key": "pause",
                            "value": "___PO_CODE_SMARTTHINGS_DREAM_SAC_BUTTON_PAUSE_12",
                            "type": "active"
                        }
                    ]
                },
                "state": {
                    "value": "windowShade.value",
                    "alternatives": [
                        {
                            "key": "closed",
                            "value": "___PO_CODE_SMARTTHINGS_DREAM_SAC_SBODY_CLOSED",
                            "type": "inactive"
                        },
                        {
                            "key": "open",
                            "value": "___PO_CODE_SMARTTHINGS_DREAM_SAC_SBODY_OPEN",
                            "type": "active"
                        },
                        {
                            "key": "unknown",
                            "value": "___PO_CODE_SMARTTHINGS_DREAM_SAC_SBODY_UNKNOWN",
                            "type": "active"
                        },
                        {
                            "key": "opening",
                            "value": "___PO_CODE_SMARTTHINGS_DREAM_SAC_SBODY_OPENING_ING",
                            "type": "active"
                        },
                        {
                            "key": "closing",
                            "value": "___PO_CODE_SMARTTHINGS_DREAM_SAC_SBODY_CLOSING_ING",
                            "type": "inactive"
                        },
                        {
                            "key": "partially open",
                            "value": "___PO_CODE_SMARTTHINGS_DREAM_SAC_BODY_PARTIALLY_OPEN",
                            "type": "active"
                        },
                        {
                            "key": "pause",
                            "value": "___PO_CODE_SMARTTHINGS_DREAM_SAC_BUTTON_PAUSE_12",
                            "type": "inactive"
                        }
                    ]
                }
            },
            "state": null,
            "component": "main"
        },
        {
            "capability": "windowShadeLevel",
            "version": 1,
            "label": "___PO_CODE_SMARTTHINGS_DREAM_SAC_HEADER_SHADE_LEVEL",
            "displayType": "slider",
            "slider": {
                "range": [
                    0,
                    100
                ],
                "step": null,
                "unit": null,
                "command": "setShadeLevel",
                "value": "shadeLevel.value"
            },
            "state": null,
            "component": "main"
        }
    ],
    "automation": {
        "conditions": [
            {
                "capability": "energyMeter",
                "version": 1,
                "label": "___PO_CODE_SMARTTHINGS_DREAM_SAC_HEADER_ENERGY_METER",
                "displayType": "numberField",
                "numberField": {
                    "value": "energy.value",
                    "unit": null
                },
                "exclusion": [],
                "component": "main"
            },
            {
                "capability": "powerMeter",
                "version": 1,
                "label": "___PO_CODE_SMARTTHINGS_DREAM_SAC_TMBODY_POWER_METER",
                "displayType": "numberField",
                "numberField": {
                    "value": "power.value",
                    "unit": null
                },
                "exclusion": [],
                "component": "main"
            },
            {
                "capability": "windowShade",
                "version": 1,
                "label": "___PO_CODE_SMARTTHINGS_DREAM_SAC_HEADER_WINDOW_SHADE",
                "displayType": "list",
                "list": {
                    "alternatives": [
                        {
                            "key": "closed",
                            "value": "___PO_CODE_SMARTTHINGS_DREAM_SAC_SBODY_CLOSED",
                            "type": "active"
                        },
                        {
                            "key": "open",
                            "value": "___PO_CODE_SMARTTHINGS_DREAM_SAC_SBODY_OPEN",
                            "type": "active"
                        },
                        {
                            "key": "partially open",
                            "value": "___PO_CODE_SMARTTHINGS_DREAM_SAC_BODY_PARTIALLY_OPEN",
                            "type": "active"
                        }
                    ],
                    "value": "windowShade.value"
                },
                "exclusion": [],
                "component": "main"
            },
            {
                "capability": "windowShadeLevel",
                "version": 1,
                "label": "___PO_CODE_SMARTTHINGS_DREAM_SAC_HEADER_SHADE_LEVEL",
                "displayType": "slider",
                "slider": {
                    "range": [
                        0,
                        100
                    ],
                    "step": null,
                    "unit": null,
                    "value": "shadeLevel.value"
                },
                "exclusion": [],
                "component": "main"
            }
        ],
        "actions": [
            {
                "capability": "refresh",
                "version": 1,
                "label": "___PO_CODE_SMARTTHINGS_DREAM_SAC_BUTTON_REFRESH_8",
                "displayType": "list",
                "list": {
                    "alternatives": [
                        {
                            "key": "refresh",
                            "value": "___PO_CODE_SMARTTHINGS_DREAM_SAC_BUTTON_REFRESH_8",
                            "type": "active"
                        }
                    ]
                },
                "component": "main",
                "exclusion": []
            },
            {
                "capability": "windowShade",
                "version": 1,
                "label": "___PO_CODE_SMARTTHINGS_DREAM_SAC_HEADER_WINDOW_SHADE",
                "displayType": "list",
                "list": {
                    "alternatives": [
                        {
                            "key": "close",
                            "value": "___PO_CODE_SMARTTHINGS_DREAM_SAC_BUTTON_CLOSE_12",
                            "type": "active"
                        },
                        {
                            "key": "open",
                            "value": "___PO_CODE_SMARTTHINGS_DREAM_SAC_SBODY_OPEN",
                            "type": "active"
                        }
                    ]
                },
                "component": "main",
                "exclusion": []
            },
            {
                "capability": "windowShadeLevel",
                "version": 1,
                "label": "___PO_CODE_SMARTTHINGS_DREAM_SAC_HEADER_SHADE_LEVEL",
                "displayType": "slider",
                "slider": {
                    "range": [
                        0,
                        100
                    ],
                    "step": null,
                    "unit": null,
                    "command": "setShadeLevel"
                },
                "component": "main",
                "exclusion": []
            }
        ]
    },
    "dpInfo": [
        {
            "os": "ios",
            "dpUri": "plugin://com.samsung.ios.plugin.stplugin/assets/files/index.html"
        },
        {
            "os": "android",
            "dpUri": "plugin://com.samsung.android.plugin.stplugin"
        },
        {
            "os": "web",
            "dpUri": "wwst://com.samsung.one.plugin.stplugin"
        }
    ]
}

What a hot mess… (the previously mentioned Window Shade Level commits have been reverted back in August 2020)

And here is some reference note to @steven.green, @dckirker and @PKacprowiczS

This is wrong! So wrong…

To be more precise I should add "whether blinds are going up or down or don’t move at all .
If power report has value != 0, closing/opening event is sent (based on state.shadeTarget and current shadeLevel difference). Otherwise, open/closed/partially open event is being created.

There is a Qubino Flush Shutter sitting in front of me on the table without any load connected to it. It reports randomly 14 to 30 Watts. I have no idea why, but it does.

Accoring to the manual of the Qubino Flush Shutter there is Parameter no. 76 - Motor operation detection:

Define the power consumption threshold at the end positions. Based on this value, the device will know, that the shutters reached the limit switches.

Values (size is 1 byte dec):

default value 30 = 30W
0 - The value 0 means that reaching a limit switch will not be detected.
1 - 127 = 1 - 127W

https://qubino.com/products/flush-shutter/flush-shutter-tech/

Maybe the assumption above should be corrected to power report has value more than Parameter 74, closing/opening event is sent (based on state.shadeTarget and current shadeLevel difference). Otherwise, open/closed/partially open event is being created.

The default value is 30W for Parameter 74, so it gives a lot of slack for setting up motors and limit switches and have faulty power consumption reports.

And one more thing, I don’t get SwitchMultilevelSets commands from the device when the motor starts moving by pressing the switch or pressing the buttons in the app. Only when the motor stops. So that might should be reconsidered as well.

My device is running firmware 7.0, and there are plenty other firmwares out there with different behaviors. Maybe the code should be backward compatible and tested with different firmwares as well.

zw:Ls type:1107 mfr:0159 prod:0003 model:0052 ver:7.00 zwv:4.38 lib:03 cc:5E,5A,73,98 sec:86,72,27,25,26,32,71,85,8E,59,70 secOut:26

So, a few things:

Window Shade Level was added to the device handlers, as mentioned earlier, by me, and then reverted because of a minor client bug (I am not going to go in to details). Those devices also have Switch Level and have been using that. The goal is to transition those devices to use Window Shade Level. It will be a systematic process with overlapping use, but showing one or the other (most of which will go unnoticed to the user).

The Qubino Flush Shutter, while having a DTH, is not yet WWST certified because of a blocking client bug (different than the previous one) that actually caused Window Shade Level to not have a slider, or show at all. This is in the stages of being resolved.

I have a PR that reverts the revert of my previous PR. So, moving to using Window Shade Level will continue. I’ll try to remember the check back in here when the changes that actually allow Window Shade Level to work in the client are available.

If an mnmn and vid isn’t defined in the metadata block or on the fingerprint in a Groovy DTH (cloud to cloud devices that use a Device Profile specify the mnmn and vid in the Device Profile) then an mnmn of “SmartThings” and a vid of the DTH name with the spaces replaced with underscores and prefixed with “SmartThings-smartthings-” is used. Hence why you see no mnmn and vid defined in the Qubino DTH but “SmartThings” and “SmartThings-smartthings-Qubino_Flush_Shutter” does show as the mnmn and vid. There are a lot of complexities on how this works that I am not really going to go in to. But, if metadata doesn’t exist for a device there is some built in logic to build a “generic default” based on the capabilities that a device defines. There are ways to play around with this. But, if you go from an implicit mnmn/vid (based on the DTH name) to an explicit mnmn/vid (your own custom one) and you want to go back to the implicit one you actually have to explicitly specify it to make sure that the old one is overridden in the typing and fingerprinting logic. (The use case would be if you took the Qubino DTH, dropped in the Switch Level capability, gave it the mnmn/vid of “nosuchmnmn”/“not-a-real-vid” to force no metadata to be returned and follow the default generic logic, and then wanted to switch back to the SmartThings/SmartThings-smartthings-Qubino_Flush_Shutter mnmn/vid you would have to explicitly set SmartThings/SmartThings-smartthings-Qubino_Flush_Shutter. Or change the DTH name, which should just update the implicit mnmn and vid.)

Regarding the intricacies of the behavior of the Qubino devices (and the various firmware)… They definitely are complex, from what I have seen. In a way, I am kind of glad I didn’t have to do the integration. I do think that there probably should be more flexibility with the DTH logic. That said… I am not sure that there are any resources at the moment to do such. :frowning:

2 Likes

Hi @dckirker , and thank you.

I might have written elsewhere (many times actually) that I am in the process of moving everything over from a previous installation to Smartthings… I have moved dozens of devices, some with problems, others not so much… But this is one of the toughest nuts to crack.

I had one blind operated through a Qubino Roller Shutter. After my attempts to connect it to Smartthings failed, I finally physically took off the Qubino device it and swapped it for an extra Zipato Motor Controller I had at home.

However, I do have 2 electric awnings that are ALSO operated through Qubino Roller Shutter devices. And I would really like to move them over from my old controller to Smartthings. Thing is, on my old controller, they work fine (it had loads of problems - but these Qubino shutter devices worked just fine). And I mean open, close, slider - everything works fine. I cannot move it to Smartthings and then lose the slider functionality. On the other hand, I don’t want it to be the last thing I have on the old (non-Snartthings) controller. I want to switch that old controller off.

So, just asking:

  1. Have there been any developments for this DTH? Does it now support a slider, please?

  2. Or is my only alternative to buy alternative motor controller devices and dump these Qubino Flush Shutter switches?

Any help would be appreciated.

Thanks in advance