Elektrische Gardinen mit homee via ioBroker, Node-RED und hih

Hallo homee Community,

ich möchte mit euch meine Lösung für per homee steuerbare elektrische Gardinenschienen teilen.

Bild

Um in unserem Wohnzimmer zwei Fenster (einmal 1,10m Breite und einmal eine Fenster-/Türenfront mit 3,5m Breite) mit motorisierten Gardinen zu versehen, war ich schon länger auf der Suche nach entsprechenden Lösungen. Der Markt ist leider unübersichtlich und vieles wird über den Fachhandel vertrieben, der nicht mal vollständige Produktinformationen auf seine Webseiten stellen kann / will.

ABALON Vorhangschiene
Wir haben uns dann letztlich - vor allem auch aus Kostengründen - für eine Lösung des Herstellers Abalon entschieden.

Die Sets gibt es mit unterschiedlichen Längen und auch ohne WLAN Option. Die WLAN Lösung erlaubt auch die Steuerung über eine mitgelieferte Fernbedienung (es gibt auch eine Multichannel Fernbedienung), der Motor erkennt manuelles Ziehen an der Gardine und führt die Fahrt dann zu Ende und es gibt eine Tuya Cloud basierte App (OEM China Cloud, mehr dazu später). Die im Set mitgelieferten Motoren haben die Bezeichnung BCM700D-TY01, dabei handelt es sich wohl um die neuste Generation des Herstellers.

Aufbau
Das gelieferte Set besteht auf den ersten Blick aus vielen Einzelteilen. Man kann die individuell benötigte Länge der Gardinenschienen mit den Schienenmodulen zusammensetzen und muss dann das Laufband entsprechend ablängen. Im Set sind neben 1 Meter Modulen auch 50cm, 20cm und 10cm Module enthalten. Die Gardine kann entweder mittig schließend oder einseitig schließend aufgebaut werden. Die Installation ist mit den mitgelieferten Teilen an der Decke oder an der Wand möglich. Der Motor kann entweder links oder rechts eingehängt werden und verschwindet inklusive Kabel perfekt hinter der Gardine. Er verfügt über einen Schuko Stecker und kann einfach mit einer Steckdose verbunden werden. Insgesamt macht die Lösung einen sehr soliden Eindruck.

Auf der Webseite des Herstellers finden sich neben den Anleitungen auch Videos zur Installation. Die Anleitung(en) halten leider qualitativ nicht mit dem Produkt mit, da teilweise das Englisch schwer verständlich bzw. Bilduntertitel falsch sind. Der deutschsprachige Support des Herstellers ist aber super schnell (Antworten innerhalb von ein bis zwei Stunden, auch am Wochenende), sehr kompetent und letztlich war der Zusammenbau auch dank der Videos einfacher als gedacht.

Tuya-Cloud Anbindung der Motoren
Tuya bietet Herstellern eine Cloud basierte IoT Plattform für ihre Produkte an inklusive Firmware, Cloud Dienst und App (vermutlich auch mit individuellen Branding, so dass man nirgendwo mehr den Namen Tuya liest). Als Referenzkunden werden von Tuya bekannte Marken / Händler wie Hama, REWE, Toom, Medion, LIDL, Blaupunkt und viele andere genannt. Vermutlich steckt in viel mehr Produkten eine Tuya Lösung drin als wir es wissen.

Die Tuya-basierte China Cloud Connection der Motoren war allerdings nicht das, was ich wollte. In der homee Community werden sicher die meisten so denken und ich erspare mir die Erläuterung dazu. Daher habe ich mich in das Thema Tasmota und dann auch Tuya-Convert eingelesen. Letztlich steckt in dem Motor ein ESP mit der Tuya Firmware drauf. Dabei übernimmt der ESP „nur“ die Kommunikation mit der Cloud und leitet die Befehle an eine s.g. MCU des Motors („control board control chip, interworking with a Tuya module over a serial Protocol“) weiter, die die eigentliche „Fachlogik“ inkl. Funkkommunikation für Fernbedienungen übernimmt. Ein Flashen der Firmware durch Öffnen des Gerätes und unter Einsatz des Lötkolbens um an die Anschlüsse des ESPs zu kommen war aber keine Option für mich. Hier kommt Tuya-Convert ins Spiel: Die Skripte von Tuya-Convert verwandeln z.B. einen Raspberry Pi zu einem Tuya-Provisionierungs-Server, der dann dem Tuya-Gerät eine Provisionierung mit einer neuen - und quelloffenen - Firmware anbietet. Es ist dabei also kein Schraubenzieher oder Lotkölben nötig. Der Gardinenmotor muss nur durch langes Drücken des einzigen vorhandenen Tasters in den Provisionierungsmodus / „SmartConfig“ Modus versetzt werden und connected sich dann mit dem Raspberry Pi per WLAN. Nachmachen auf eigene Gefahr. Weitere Informationen findet man hier:

Konfiguration des Tasmota Devices
Nachdem die Motoren auf die quelloffene Firmware Tasmota geflashed worden waren, ging es an die Konfiguration. Hierzu verbindet man sich erstmal mit dem von Tasmota bereitgestellten Hotspot und hinterlegt seine WLAN Daten, um des Device in das eigene Netzwerk zu bringen. Hier nach habe ich für die gerätespezifische Konfiguration bei diesem Forumseintrag aus dem home assistant Forum aufgesetzt. Dies hat den Motor grundsätzlich ansteuerbar gemacht, ich musste aber gewisse Probleme mit der dort beschriebenen Konfiguration feststellen. Konkretes Problem war, dass die Position beim manuellen Fahren (also durch Ziehen an der Gardine und Vollendung durch den Motor) auf 0% (offen) im Gegensatz zur 100% Stellung nicht zurückgemeldet wurde. Problem ist, dass der Motor sich gegenüber Tasmota wie ein Dimmer-Device ausgibt und die Dimmstufe 0% wegen der für eine Lampe ausreichende Meldung Power = aus nicht zusätzlich reported wird. Hier war einige Trickserei unter Berücksichtigung der Serial Communication mit der MCU mit den Tasmota Rules notwendig, um das gewünschte Ergebnis zu erzielen. Die konkrete Tasmota Konfiguration habe ich unten angefügt. Diese Konfiguration funktioniert jetzt seit drei Monaten zuverlässig und zwar bei prozentbasierter Ansteuerung, Befehlsansteuerung (auf, zu, stop) als auch manuellem Ziehen an der Gardine und per Fernbedienung.

ioBroker, Node-RED und hih
Die eigentliche Einbindung in homee erfolgte dann über das Gespann iobroker mit Node-RED, dem fantastischen homee-in-homee Plugin sowie dem iobroker Sonoff Adapter. Den Flow stelle ich unten bereit. Die Tasmota Devices kommunizieren per MQTT mit dem ioBroker, genauer gesagt mit dem Sonoff Adapter. Hier habe ich ergänzend zur Standardkonfiguration noch die Optionen „Automatische Erstellung von Zuständen“ für SENSOR, STATE und RESULT in den Einstellungen aktiviert. Anschließend wird in den Tasmota MQTT Einstellungen der ioBroker hinterlegt. Nach erfolgter Konfiguration erscheinen im ioBroker die entsprechenden Objekte. Durch setzen des Dimmer Values wird wiederum eine Fahrt auf eine bestimmte Position ausgelöst. Der Event Value nimmt die Befehl OPEN, CLOSE und STOP entgegen. Darauf basierend habe ich dann im Node-Red (als ioBroker Adapter installiert, damit man die Integration zum ioBroker bekommt) die Flows für die neuen homee Devices erstellt (Profil Schließer mit Positionsschalter). Die Konfiguration habe ich unten angefügt.

Integration in homee
Neben der Steuerung per Befehlstasten (Öffnen, Stop, Schließen) und der prozentbasierten Steuerung werden diverse nützliche Informationen (WLAN Signalstärke, Tasmota Firmware Version, template, IP Adresse, device datetime, DNS Name, uptime) an homee übertragen. Der Fehleralarm wird ausgelöst, wenn der heartbeat des Tasmota Devices ausbleibt. Das Reporting zurück an homee erfolgt am Ende der Ausführung; es gibt also keine Zwischenmeldungen während der Fahrt (wie man sie z.B. von Rollladenaktoren kennt), sondern immer erst nach Abschluss der Ausführung - dann aber instant und zuverlässig.


Fazit
Nach einigen Monaten Betrieb kann ich ein positives Zwischenfazit ziehen. Die Motoren laufen absolut sanft und fehlerfrei, die Anbindung funktioniert trotz der vielen Komponenten sehr zuverlässig. Sollte ein Motor mal kurzzeitig die Verbindung verlieren (z.B. Neustart von Netzwerkkomponenten), verbindet er sich umgehend erneut. Durch die Einbindung der Gardinen in Szenen via homeegramm hat man ein extrem großes Spektrum an Anwendungsmöglichkeiten.

Der hauptsächliche Aufwand bei der Umsetzung der Lösung kam durch die oben beschriebene „0%-Challenge“, die mir Stunden der Analyse und des Versuchens gekostet hat - aber das Problem ist jetzt gelöst. Zudem hatte ich zu Anfang regelmäßige Restarts der ESPs. Hier stellten sich fehlerhaft in der fritzBox hinterlegte Zeitserver als Ursache heraus (Trennzeichen falsch gesetzt), die sich die Tasmota Firmware durch die DHCP Konfiguration zieht und dann mit der Situation nach ca. 20 Minuten nicht mehr „umgehen“ kann (wobei dies wohl am zugrundeliegenden Arduino Framework liegt). Wenn man die Zeitserver richtig konfiguriert, gibt es kein Probleme.

Man muss natürlich festhalten, dass die vielen Schritte gewisses technisches Verständnis benötigen. Gerade beim Flashen sollte man genau verstehen was man tut und strukturiert vorgehen. Ich würde keinem blutigem Anfänger empfehlen sich an diese Lösung heranzutrauen. Wer aber schon den ein oder anderen Raspberry Pi aufgesetzt hat, unter einem ESP etwas versteht, im Idealfall bereits erste Schritte mit ioBroker und Node-RED hinter sich hat, wird hier sicher keine zu großen Schwierigkeiten bei der Umsetzung haben. Und wenn es dann doch noch Fragen gibt, versuche ich gern zu helfen und die Beschreibung zu ergänzen.

Weitere nützliche Quellen:

24 „Gefällt mir“

Konfigurationen
Tasmota Konfiguration (muss natürlich angepasst werden):

  Power1 1
  PowerRetain 1
  PowerOnState 4
  Template {"BASE":54}
  Template {"FLAG":0}
  Template {"GPIO":[0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 107, 0]}
  Template {"NAME":"Zemismart_Curt"}
  TuyaMCU 1,11
  TuyaMCU 11,1
  TuyaMCU 21,101
  DimmerRange 1,100
  Fade 0
  Speed 1
  SetOption4 0
  SetOption56 1
  SetOption57 1
  TelePeriod 60
  Topic wohnzimmer_sued_curtains
  GroupTopic tasmotas
  FullTopic %prefix%/%topic%/
  MqttClient wohnzimmer-sued-curtains
  Rule1 on System#Init do Rule2 on endon on Event#OPEN do TuyaSend4 102,01 endon on Event#STOP do TuyaSend4 102,02 endon on Event#CLOSE do TuyaSend4 102,00 endon on TuyaReceived#Data=55AA00070008650200040000000079 do backlog Rule2 Off; DIMMER 0; Rule2 On endon on POWER1#state!=1 do backlog DIMMER 0; POWER1 1 endon
  Rule2 on Dimmer#state=0 do Event OPEN endon
  Rule1 1
  Rule2 1
  FriendlyName1 wohnzimmer-sued-curtains

Node-RED flow:

[
    {
        "id": "af83c89a.6526f",
        "type": "tab",
        "label": "Gardinen Flow",
        "disabled": false,
        "info": ""
    },
    {
        "id": "dc52398f.1237f",
        "type": "homeeDevice",
        "z": "af83c89a.6526f",
        "virtual-homee": "",
        "name": "Gardine Wohnzimmer Süd",
        "nodeId": "68",
        "showNodeId": true,
        "profile": "2002",
        "icon": "nodeicon_horizontalsectionaldoor",
        "attributes": [
            {
                "instance": 0,
                "minimum": 0,
                "maximum": 4,
                "current_value": 0,
                "target_value": 0,
                "last_value": 0,
                "unit": "n%2Fa",
                "step_value": 1,
                "editable": 1,
                "state": 1,
                "last_changed": 12345555,
                "changed_by": 1,
                "changed_by_id": 0,
                "based_on": 1,
                "data": "",
                "id": 680,
                "type": 135,
                "node_id": 68
            },
            {
                "instance": 0,
                "minimum": 0,
                "maximum": 100,
                "current_value": 0,
                "target_value": 0,
                "last_value": 0,
                "unit": "n%2Fa",
                "step_value": 1,
                "editable": 1,
                "state": 1,
                "last_changed": 12345555,
                "changed_by": 1,
                "changed_by_id": 0,
                "based_on": 1,
                "data": "",
                "id": 681,
                "type": 15,
                "node_id": 68
            },
            {
                "state": 1,
                "instance": 1,
                "minimum": 0,
                "maximum": 0,
                "current_value": 0,
                "target_value": 0,
                "last_value": 0,
                "data": "",
                "unit": "text",
                "step_value": 1,
                "editable": 0,
                "last_changed": 1602785734,
                "changed_by": 1,
                "changed_by_id": 0,
                "based_on": 1,
                "options": [],
                "id": 121,
                "type": 44,
                "node_id": 68
            },
            {
                "state": 1,
                "instance": 0,
                "minimum": 0,
                "maximum": 4,
                "current_value": 0,
                "target_value": 0,
                "last_value": 0,
                "data": "",
                "unit": "n%2Fa",
                "step_value": 1,
                "editable": 0,
                "last_changed": 1602786455,
                "changed_by": 1,
                "changed_by_id": 0,
                "based_on": 1,
                "options": [],
                "id": 122,
                "type": 33,
                "node_id": 68
            },
            {
                "state": 1,
                "instance": 1,
                "minimum": 0,
                "maximum": 0,
                "current_value": 0,
                "target_value": 0,
                "last_value": 0,
                "data": "",
                "unit": "text",
                "step_value": 1,
                "editable": 0,
                "last_changed": 1602793731,
                "changed_by": 1,
                "changed_by_id": 0,
                "based_on": 1,
                "options": [],
                "id": 72,
                "type": 84,
                "node_id": 68
            },
            {
                "state": 1,
                "instance": 2,
                "minimum": 0,
                "maximum": 0,
                "current_value": 0,
                "target_value": 0,
                "last_value": 0,
                "data": "",
                "unit": "text",
                "step_value": 1,
                "editable": 0,
                "last_changed": 1602794184,
                "changed_by": 1,
                "changed_by_id": 0,
                "based_on": 1,
                "options": [],
                "id": 73,
                "type": 84,
                "node_id": 68
            },
            {
                "state": 1,
                "instance": 3,
                "minimum": 0,
                "maximum": 0,
                "current_value": 0,
                "target_value": 0,
                "last_value": 0,
                "data": "",
                "unit": "text",
                "step_value": 1,
                "editable": 0,
                "last_changed": 1602878982,
                "changed_by": 1,
                "changed_by_id": 0,
                "based_on": 1,
                "options": [],
                "id": 74,
                "type": 84,
                "node_id": 68
            },
            {
                "state": 1,
                "instance": 0,
                "minimum": 0,
                "maximum": 1,
                "current_value": 0,
                "target_value": 0,
                "last_value": 0,
                "data": "",
                "unit": "n%2Fa",
                "step_value": 1,
                "editable": 0,
                "last_changed": 1602948728,
                "changed_by": 1,
                "changed_by_id": 0,
                "based_on": 1,
                "options": [],
                "id": 75,
                "type": 70,
                "node_id": 68
            },
            {
                "state": 1,
                "instance": 2,
                "minimum": 0,
                "maximum": 0,
                "current_value": 0,
                "target_value": 0,
                "last_value": 0,
                "data": "",
                "unit": "text",
                "step_value": 1,
                "editable": 0,
                "last_changed": 1602949723,
                "changed_by": 1,
                "changed_by_id": 0,
                "based_on": 1,
                "options": [],
                "id": 76,
                "type": 44,
                "node_id": 68
            },
            {
                "state": 1,
                "instance": 0,
                "minimum": 0,
                "maximum": 0,
                "current_value": 0,
                "target_value": 0,
                "last_value": 0,
                "data": "",
                "unit": "text",
                "step_value": 1,
                "editable": 0,
                "last_changed": 1602785734,
                "changed_by": 1,
                "changed_by_id": 0,
                "based_on": 1,
                "options": [],
                "id": 77,
                "type": 104,
                "node_id": 68
            }
        ],
        "statusTemplate": "",
        "x": 1290,
        "y": 420,
        "wires": [
            [
                "774ccd6b.eab03c",
                "9cc12df7.01d4d8"
            ]
        ]
    },
    {
        "id": "15016999.be701e",
        "type": "ioBroker in",
        "z": "af83c89a.6526f",
        "name": "wohnzimmer-sued-curtains INFO  Version 1",
        "topic": "sonoff.0.wohnzimmer-sued-curtains.INFO.Version",
        "payloadType": "value",
        "onlyack": false,
        "func": "rbe",
        "gap": "",
        "fireOnStart": "true",
        "x": 600,
        "y": 340,
        "wires": [
            [
                "623852fa.c09a4c"
            ]
        ]
    },
    {
        "id": "6f90dac8.75fb84",
        "type": "ioBroker in",
        "z": "af83c89a.6526f",
        "name": "wohnzimmer-sued-curtains Wifi  Signal",
        "topic": "sonoff.0.wohnzimmer-sued-curtains.Wifi_Signal",
        "payloadType": "value",
        "onlyack": true,
        "func": "rbe",
        "gap": "",
        "fireOnStart": "true",
        "x": 610,
        "y": 520,
        "wires": [
            [
                "6ee7f8c5.21883"
            ]
        ]
    },
    {
        "id": "6ee7f8c5.21883",
        "type": "function",
        "z": "af83c89a.6526f",
        "name": "Set RSSI Quality",
        "func": "var level=parseInt(msg.payload);\n\n// Verbindungsqualität von dbm in 0-4 umrechnen\nif (level > 90) {\n   level = 0\n}\nelse if (level > 80) {\n    level = 1\n}\nelse if (level > 60) {\n    level = 2\n}\nelse if (level > 40) {\n    level = 3\n}\nelse {\n    level = 4\n}\nmsg.payload = {\"attribute\":{ \"id\":122, \"value\": level}};\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "x": 910,
        "y": 520,
        "wires": [
            [
                "dc52398f.1237f"
            ]
        ]
    },
    {
        "id": "623852fa.c09a4c",
        "type": "function",
        "z": "af83c89a.6526f",
        "name": "Convert Version String",
        "func": "var firmware = msg.payload;\n\nreturn {\n    payload: {\"attribute\": {\"id\": 121, \"value\": 0, \"data\": firmware}}\n}",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "x": 920,
        "y": 340,
        "wires": [
            [
                "dc52398f.1237f"
            ]
        ]
    },
    {
        "id": "579c4329.a6fb2c",
        "type": "ioBroker in",
        "z": "af83c89a.6526f",
        "name": "wohnzimmer-sued-curtains  Dimmer",
        "topic": "sonoff.0.wohnzimmer-sued-curtains.Dimmer",
        "payloadType": "value",
        "onlyack": true,
        "func": "all",
        "gap": "",
        "fireOnStart": "true",
        "x": 620,
        "y": 280,
        "wires": [
            [
                "aca19148.32ca4",
                "e4b6c1ec.93932"
            ]
        ]
    },
    {
        "id": "774ccd6b.eab03c",
        "type": "switch",
        "z": "af83c89a.6526f",
        "name": "Switch Attribute of Change",
        "property": "payload.attributeId",
        "propertyType": "msg",
        "rules": [
            {
                "t": "eq",
                "v": "680",
                "vt": "str"
            },
            {
                "t": "eq",
                "v": "681",
                "vt": "str"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 1600,
        "y": 420,
        "wires": [
            [
                "28810107.796396"
            ],
            [
                "a16f834f.b0063"
            ]
        ]
    },
    {
        "id": "aca19148.32ca4",
        "type": "function",
        "z": "af83c89a.6526f",
        "name": "Convert Dimmer String",
        "func": "var dimmer = parseInt(msg.payload);\n\nreturn {\n    payload: {\"attribute\": {\"id\": 681, \"value\": dimmer}}\n}",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "x": 920,
        "y": 280,
        "wires": [
            [
                "dc52398f.1237f"
            ]
        ]
    },
    {
        "id": "aff1c794.c991d",
        "type": "ioBroker out",
        "z": "af83c89a.6526f",
        "name": "wohnzimmer-sued-curtains  Dimmer",
        "topic": "sonoff.0.wohnzimmer-sued-curtains.Dimmer",
        "ack": "false",
        "autoCreate": "false",
        "stateName": "",
        "role": "",
        "payloadType": "",
        "readonly": "",
        "stateUnit": "",
        "stateMin": "",
        "stateMax": "",
        "x": 2230,
        "y": 500,
        "wires": []
    },
    {
        "id": "a16f834f.b0063",
        "type": "function",
        "z": "af83c89a.6526f",
        "name": "convert Dim Value to Int",
        "func": "var dimmer = parseInt(msg.payload.targetValue);\nreturn{payload:dimmer}",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "x": 1870,
        "y": 500,
        "wires": [
            [
                "aff1c794.c991d",
                "4e207da7.e262a4"
            ]
        ]
    },
    {
        "id": "e4b6c1ec.93932",
        "type": "function",
        "z": "af83c89a.6526f",
        "name": "Set Status based on Dimmer Value",
        "func": "var dimmer = parseInt(msg.payload);\n\nif (dimmer === 0){status = 0}\nelse if (dimmer === 100){status = 1}\nelse {status = 2}\n\nreturn {\n    payload: {\"attribute\": {\"id\": 680, \"value\": status}}\n}",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "x": 940,
        "y": 220,
        "wires": [
            [
                "dc52398f.1237f"
            ]
        ]
    },
    {
        "id": "28810107.796396",
        "type": "function",
        "z": "af83c89a.6526f",
        "name": "Set Event Value for Command",
        "func": "if      (msg.payload.targetValue === 0){status = \"OPEN\"}\nelse if (msg.payload.targetValue === 1){status = \"CLOSE\"}\nelse if (msg.payload.targetValue === 2){status = \"STOP\"}\n\n\nreturn{payload:status}",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "x": 1890,
        "y": 400,
        "wires": [
            [
                "11fe174c.610771",
                "4e207da7.e262a4"
            ]
        ]
    },
    {
        "id": "53577a4f.ba897c",
        "type": "ioBroker in",
        "z": "af83c89a.6526f",
        "name": "",
        "topic": "sonoff.0.wohnzimmer-sued-curtains.Time",
        "payloadType": "value",
        "onlyack": true,
        "func": "rbe",
        "gap": "",
        "fireOnStart": "true",
        "x": 620,
        "y": 400,
        "wires": [
            [
                "4a582101.164728"
            ]
        ]
    },
    {
        "id": "4a582101.164728",
        "type": "function",
        "z": "af83c89a.6526f",
        "name": "Convert MAC String",
        "func": "var firmware = msg.payload;\n\nreturn {\n    payload: {\"attribute\": {\"id\": 73, \"value\": 0, \"data\": firmware}}\n}",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "x": 920,
        "y": 400,
        "wires": [
            [
                "dc52398f.1237f"
            ]
        ]
    },
    {
        "id": "cee9776e.e573b",
        "type": "function",
        "z": "af83c89a.6526f",
        "name": "Convert IP String",
        "func": "var firmware = msg.payload;\n\nreturn {\n    payload: {\"attribute\": {\"id\": 72, \"value\": 0, \"data\": firmware}}\n}",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "x": 910,
        "y": 460,
        "wires": [
            [
                "dc52398f.1237f"
            ]
        ]
    },
    {
        "id": "4c2204c.6d4a97c",
        "type": "ioBroker in",
        "z": "af83c89a.6526f",
        "name": "wohnzimmer-sued-curtains INFO  IPAddress 1",
        "topic": "sonoff.0.wohnzimmer-sued-curtains.INFO.IPAddress",
        "payloadType": "value",
        "onlyack": true,
        "func": "rbe",
        "gap": "",
        "fireOnStart": "true",
        "x": 590,
        "y": 460,
        "wires": [
            [
                "cee9776e.e573b"
            ]
        ]
    },
    {
        "id": "df25223f.ae0558",
        "type": "function",
        "z": "af83c89a.6526f",
        "name": "Convert Hostname String",
        "func": "var firmware = msg.payload;\n\nreturn {\n    payload: {\"attribute\": {\"id\": 74, \"value\": 0, \"data\": firmware}}\n}",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "x": 930,
        "y": 580,
        "wires": [
            [
                "dc52398f.1237f"
            ]
        ]
    },
    {
        "id": "11fe174c.610771",
        "type": "ioBroker out",
        "z": "af83c89a.6526f",
        "name": "wohnzimmer-sued-curtains  Event ",
        "topic": "sonoff.0.wohnzimmer-sued-curtains.Event",
        "ack": "false",
        "autoCreate": "false",
        "stateName": "",
        "role": "",
        "payloadType": "",
        "readonly": "",
        "stateUnit": "",
        "stateMin": "",
        "stateMax": "",
        "x": 2220,
        "y": 400,
        "wires": []
    },
    {
        "id": "529917e4.ccfad",
        "type": "ioBroker in",
        "z": "af83c89a.6526f",
        "name": "wohnzimmer-sued-curtains  UptimeSec",
        "topic": "sonoff.0.wohnzimmer-sued-curtains.UptimeSec",
        "payloadType": "value",
        "onlyack": "",
        "func": "rbe",
        "gap": "",
        "fireOnStart": "true",
        "x": 370,
        "y": 760,
        "wires": [
            [
                "6dce9b33.ac02d4"
            ]
        ]
    },
    {
        "id": "6dce9b33.ac02d4",
        "type": "trigger",
        "z": "af83c89a.6526f",
        "name": "Set Error after Timeout",
        "op1": "0",
        "op2": "1",
        "op1type": "num",
        "op2type": "num",
        "duration": "210",
        "extend": true,
        "units": "s",
        "reset": "",
        "bytopic": "all",
        "topic": "topic",
        "outputs": 1,
        "x": 660,
        "y": 760,
        "wires": [
            [
                "f11eb83a.d47c5"
            ]
        ]
    },
    {
        "id": "f11eb83a.d47c5",
        "type": "function",
        "z": "af83c89a.6526f",
        "name": "Transmit Error Status",
        "func": "var valueStatus = msg.payload;\nreturn {\n    payload: {\"attribute\": {\"id\": 75, \"value\": valueStatus}}\n}",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "x": 920,
        "y": 760,
        "wires": [
            [
                "dc52398f.1237f"
            ]
        ]
    },
    {
        "id": "32722553.9015c2",
        "type": "ioBroker in",
        "z": "af83c89a.6526f",
        "name": "wohnzimmer-sued-curtains INFO  Module 1",
        "topic": "sonoff.0.wohnzimmer-sued-curtains.INFO.Module",
        "payloadType": "value",
        "onlyack": "",
        "func": "rbe",
        "gap": "",
        "fireOnStart": "true",
        "x": 600,
        "y": 640,
        "wires": [
            [
                "f63f0ef8.616b88"
            ]
        ]
    },
    {
        "id": "f63f0ef8.616b88",
        "type": "function",
        "z": "af83c89a.6526f",
        "name": "Convert Version String",
        "func": "var firmware = msg.payload;\n\nreturn {\n    payload: {\"attribute\": {\"id\": 76, \"value\": 0, \"data\": firmware}}\n}",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "x": 920,
        "y": 640,
        "wires": [
            [
                "dc52398f.1237f"
            ]
        ]
    },
    {
        "id": "7d20c4ae.187bac",
        "type": "comment",
        "z": "af83c89a.6526f",
        "name": "Set timeout as defined in Tasmota device + x sec",
        "info": "If no status update from Tasmota device was sent, error is raised to homee. \nThis setup expects all 60 seconds a status update from tasmota device. Default setting in tasmota is 300 sec but can be adjusted in the logging configuration. ",
        "x": 780,
        "y": 800,
        "wires": []
    },
    {
        "id": "20f5f651.86a28a",
        "type": "ioBroker in",
        "z": "af83c89a.6526f",
        "name": "wohnzimmer-sued-curtains  Uptime",
        "topic": "sonoff.0.wohnzimmer-sued-curtains.Uptime",
        "payloadType": "value",
        "onlyack": "",
        "func": "rbe",
        "gap": "",
        "fireOnStart": "true",
        "x": 620,
        "y": 700,
        "wires": [
            [
                "e3bced9c.32582"
            ]
        ]
    },
    {
        "id": "e3bced9c.32582",
        "type": "function",
        "z": "af83c89a.6526f",
        "name": "Convert Uptime String",
        "func": "var valueSet = msg.payload\n\n\nreturn {\n    payload: {\"attribute\": {\"id\": 77, \"value\": 0, \"data\": valueSet}}\n}\n\n",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "x": 920,
        "y": 700,
        "wires": [
            [
                "dc52398f.1237f"
            ]
        ]
    },
    {
        "id": "4e207da7.e262a4",
        "type": "debug",
        "z": "af83c89a.6526f",
        "name": "Command to homee",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 2180,
        "y": 560,
        "wires": []
    },
    {
        "id": "9cc12df7.01d4d8",
        "type": "debug",
        "z": "af83c89a.6526f",
        "name": "Feedback from homee",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 1740,
        "y": 280,
        "wires": []
    },
    {
        "id": "5c3f20ab.01416",
        "type": "comment",
        "z": "af83c89a.6526f",
        "name": "Wohnzimmer Süd",
        "info": "",
        "x": 420,
        "y": 160,
        "wires": []
    },
    {
        "id": "b5ee3167.163d",
        "type": "ioBroker in",
        "z": "af83c89a.6526f",
        "name": "wohnzimmer-sued-curtains INFO  Hostname 1",
        "topic": "sonoff.0.wohnzimmer-sued-curtains.INFO.Hostname",
        "payloadType": "value",
        "onlyack": true,
        "func": "rbe",
        "gap": "",
        "fireOnStart": "true",
        "x": 590,
        "y": 580,
        "wires": [
            [
                "df25223f.ae0558"
            ]
        ]
    }
]
17 „Gefällt mir“

Das ist doch mal was! :+1: Du solltest den Beinamen „WAF“ bekommen. Das kommt bestimmt bei vielen sehr gut an.

2 „Gefällt mir“

Tolles Projekt. Ich finde du hast das gut gelöst und sehr schön beschrieben :+1: Immer wieder schön zu sehen was mit dem Plugin möglich ist.

8 „Gefällt mir“

Hallo,
bin den Schritten gefolgt und konnte es mit den ABALON Vorhängen nachbauen, herzlichsten Dank! Ohne diese Anleitung hätte ich den Schritt nicht gewagt.

Allerdings funktionierte bei meiner Version das flashen per Tuya-Convert leider nicht, daher muss ich den Motor öffnen und direkt am TYWE1S-IPEX Chip Kontakte anlöten und seriell flashen. Hat aber geklappt :wink:

@MFV Weißt du ob man irgendwie die aktuelle Position auslesen und per MQTT publishen kann? RESULT.Dimmer hat immer die Soll-Position, ich hätte zusätzlich aber auch gerne die Ist-Position.

Moin,

an erster Stelle besten Dank an den Verfasser für die Arbeit und das zur Verfügung stellen!

Eine Rückmeldung der aktuellen position würde mir auch gefallen!

Gruß
David

Hallo,

gibt es irgendwo eine verständliche Doku zu diesem Thema?

ich habe das Flashen überstanden und die elektrische Vorhangstange ist auch IP-Technisch mit Tasmota erreichbar.

Wo ich mir jetzt echt schwer tue ist, wie ich den Motor ansteuern kann.

Danke für eure Hilfe

Es ist oben eigentlich alles von mir dokumentiert, um es zum Laufen zu bekommen.
Wo hakt es denn? Ich gehe mal davon aus, dass Tasmota und Node Red jetzt kein Neuland für dich sind.

Ich bin kein Profi. Node Red und Tasmota kenne ich schon. Das Flaschen ist auch kein Problem.

Aber ich scheitere gerade daran, wie ich den Motor ansteuern soll.

Kannst du denn den Motor über die tasmota weboberfläche schalten?

Kommt darauf an welches Gerät ich in der GUI auswähle. Bis jetzt habe ich es nur geschafft dass er immer nur schließt.

Weiß noch nicht was ich genau einstellen muss. Bin da auch noch am lernen….

Hast du denn die oben dokumentierte Konfiguration nach dem Flashen in Tasmota hinterlegt?
Klingt so als ob du gar keine Gerätekonfiguration vorgenommen hast.

cooles Projekt. Danke!
Hat schon jemand den z-Wave Motorentyp von Abalon in Betrieb genommen und mit Homee verbunden?
Abalon Motorschienen-Kit für Vorhänge - Abalontracks