Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. bshb - Rollladensteuerung mit yhka Homekit

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    bshb - Rollladensteuerung mit yhka Homekit

    This topic has been deleted. Only users with topic management privileges can see it.
    • S
      sascho @mickym last edited by sascho

      @mickym

      Hi!

      also ich konnte den Hardware Reset am KLF200 jetzt machen und die Velux Nodes funktionieren - so lala. Ich habe die Beobachtung gemacht, dass ich immer nur einen Befehl geben kann, dann warten muss bis sich der Status aktualisiert hat und dann den nächsten Befehl geben kann. Auch das klappt nicht immer und es erscheinen diese Fehler im Log:
      96fca521-0b46-47ce-ad4c-e40d29571278-image.png

      Ich habe jetzt nur noch die Hoffnung, die Anzahl der Nodes durch die Verwendung von Szenen für das Target und die All Values Node für die Current Values zu reduzieren.

      Kannst du spontan sagen, wie ich so einen Payload zerlege und in Datenpunkt ausgebe?

      4d589ae8-5101-4b4c-8e78-bd6370f319b2-image.png

      Wenn das alles nicht hilft, muss ich wohl zurück auf den Adapter gehen und mir mit der Reboot Funktionalität behelfen :-(.

      mickym 1 Reply Last reply Reply Quote 0
      • mickym
        mickym Most Active @sascho last edited by mickym

        @sascho

        1. Mit der Catch Node - kannst Du, wenn Du weißt welche Velux Nodes diesen Fehler produzieren (ist das die Statusabfrage) ggf. abfangen. Einfach eine Catch Node rausziehen, dann zu überwachende Nodes auswählen und das msg.error Objekt analysieren.

        a4769785-46ad-4341-b07b-f6bf4e9ccce1-image.png
        2. Wenn Du ein Objekt hast, hängt nun davon ab, ob Du wirklich alles in Datenpunkte schreiben willst oder nur einzelne Daten.

        2.1 Wenn Dich nur eine einzelne Eigenschaft interessiert zum Beispiel velocity - dann setzt Du die msg.payload auf msg.payload.velocity

        345332b6-227e-4cab-b0ae-35921d79a158-image.png

        2.2. Wenn Du jede Eigenschaft als eigene payload haben willst hängst Du eine split Node dran

        9b3869c2-85af-4bcb-9a69-b6cf91d2080a-image.png

        2.3. Wenn Du das ganze Objekt in einen Datenpunkt schreiben willst, wandelst Du es in einen JSON String um und beim Auslesen wieder in ein Objekt

        6d295706-44c9-44c6-a37c-29c2b26a84c4-image.png

        und so wandelst Du es wieder in ein Objekt zurück:

        5b2ebf9c-e4d6-4af0-b153-72df09be9cee-image.png

        2.4. Auch wenn es mit der neuen Adminversion zum Beginn wohl einige Fehlermeldungen (gabs dann doch nicht) - dann nimmst Du meinen Subflow, der hier genau beschrieben ist: https://forum.iobroker.net/topic/43856/json-string-oder-java-object-in-iobroker-struktur

        Dort ist auch die genaue Bedienung beschrieben - hier nur die Kurzfassung:

        Im NodeRed Adapter musst Du die Erstellung von Fremdobjekten zulassen:

        94e12676-d81f-49ae-8607-9fe563a0f3e5-image.png

        Das Anlegen macht die iobroker Out Node in dem Du das einstellst:

        3f28fc36-536e-4ad7-9ffd-f5596eca14c2-image.png

        Wider Erwarten gabs bei mir im Log keine Fehlermeldung:

        Mit diesem Flow

        1044367b-1fab-4291-829b-3e1489a73007-image.png

        erzeugst Du dann automatisch die Objektstruktur als einzelne Datenpunkte im iobroker:

        5a178074-81bc-42b7-abf6-4be32d8b0676-image.png

        [
           {
               "id": "c3403a60.92fbb8",
               "type": "subflow",
               "name": "JSON or Obj to IOBroker",
               "info": "# Creates an IOBroker tree\n\nThis node creates an IOBroker tree out of an Java-Object or JSON String.\n\nThe object tree will be created under 0_userdata.0\nIn addition to the JSON-String or Java Object as `msg.payload` it is necessary to specify a `msg.top` properity in addition to the msg-Object.\n\nThe object tree will be created under 0_userdata.0\n\nExisting `msg.topic` entries will be deleted.\nAn iobroker-out node has to be appended to this subflow node. It is not part of the subflow itself. No topic should be specified in the iobroker out node.\n\nIs no `msg.top` property is defined, then you will get an error in the following iobroker-out node (key or topic does not exist) - if you append a debug node to the subflow node you will get the message: \n> Please define msg.top as root for the object structure \n\n# Erstellt einen Objektbaum im ioBroker\n\nDiese Node erstellt einen Objektbaum im ioBroker aus einem JAVA Objekt bzw. einem JSON String. \n\nDer Baum wird in jedem Fall unter 0_userdata.0 erstellt und zwar unter dem Topic der in` msg.top` mitgegeben wurde. In der `msg.payload` befindet sich dann der JSON String oder das entsprechende Objekt.\n\nExistierende `msg.topic `Einträge werden gelöscht.\nEin entsprechende iobroker-out Node muss an den Flow angehängt werden. Sie ist nicht Bestandteil des Subflows. In dieser iobroker-out Node darf kein Topic angegeben werden. \n\nFalls in keine Angabe in msg.top definiert wurde, wird man in der darauffolgenden iobroker-out node den Fehler erhalten, dass kein key oder topic definiert ist. Falls eine debug Node an den Subflow angehängt wirde erhält man folgende Ausgabe:\n> Please define msg.top as root for the object structure ",
               "category": "parser",
               "in": [
                   {
                       "x": 60,
                       "y": 160,
                       "wires": [
                           {
                               "id": "94876630.f71748"
                           }
                       ]
                   }
               ],
               "out": [
                   {
                       "x": 2280,
                       "y": 260,
                       "wires": [
                           {
                               "id": "74b0b536.02371c",
                               "port": 0
                           },
                           {
                               "id": "ab9b1e85.eea2a",
                               "port": 0
                           }
                       ]
                   }
               ],
               "env": [],
               "meta": {},
               "color": "#E2D96E",
               "icon": "node-red/batch.svg"
           },
           {
               "id": "eea737e7.7e8fb8",
               "type": "split",
               "z": "c3403a60.92fbb8",
               "name": "split object",
               "splt": "\\n",
               "spltType": "str",
               "arraySplt": 1,
               "arraySpltType": "len",
               "stream": false,
               "addname": "key",
               "x": 1170,
               "y": 160,
               "wires": [
                   [
                       "dc473616.c2b508"
                   ]
               ]
           },
           {
               "id": "dc473616.c2b508",
               "type": "change",
               "z": "c3403a60.92fbb8",
               "name": "add key to topic",
               "rules": [
                   {
                       "t": "set",
                       "p": "stateName",
                       "pt": "msg",
                       "to": "key",
                       "tot": "msg"
                   },
                   {
                       "t": "set",
                       "p": "topic",
                       "pt": "msg",
                       "to": "topic  & '.' & key",
                       "tot": "jsonata"
                   },
                   {
                       "t": "change",
                       "p": "topic",
                       "pt": "msg",
                       "from": " ",
                       "fromt": "str",
                       "to": "_",
                       "tot": "str"
                   }
               ],
               "action": "",
               "property": "",
               "from": "",
               "to": "",
               "reg": false,
               "x": 1360,
               "y": 160,
               "wires": [
                   [
                       "78697695.9a72c8"
                   ]
               ]
           },
           {
               "id": "78697695.9a72c8",
               "type": "switch",
               "z": "c3403a60.92fbb8",
               "name": "is type?",
               "property": "payload",
               "propertyType": "msg",
               "rules": [
                   {
                       "t": "istype",
                       "v": "array",
                       "vt": "array"
                   },
                   {
                       "t": "istype",
                       "v": "object",
                       "vt": "object"
                   },
                   {
                       "t": "else"
                   }
               ],
               "checkall": "true",
               "repair": false,
               "outputs": 3,
               "x": 1540,
               "y": 160,
               "wires": [
                   [
                       "d839cef8.577f1"
                   ],
                   [
                       "eea737e7.7e8fb8"
                   ],
                   [
                       "bdfdae99.f4d9d"
                   ]
               ]
           },
           {
               "id": "d839cef8.577f1",
               "type": "split",
               "z": "c3403a60.92fbb8",
               "name": "split array",
               "splt": "\\n",
               "spltType": "str",
               "arraySplt": 1,
               "arraySpltType": "len",
               "stream": false,
               "addname": "",
               "x": 580,
               "y": 280,
               "wires": [
                   [
                       "36327f2d.8efc3"
                   ]
               ]
           },
           {
               "id": "36327f2d.8efc3",
               "type": "change",
               "z": "c3403a60.92fbb8",
               "name": "add index to topic",
               "rules": [
                   {
                       "t": "set",
                       "p": "topic",
                       "pt": "msg",
                       "to": "topic  & '.' & parts.index",
                       "tot": "jsonata"
                   }
               ],
               "action": "",
               "property": "",
               "from": "",
               "to": "",
               "reg": false,
               "x": 770,
               "y": 280,
               "wires": [
                   [
                       "d8f58d9b.b6a1"
                   ]
               ]
           },
           {
               "id": "74b0b536.02371c",
               "type": "change",
               "z": "c3403a60.92fbb8",
               "name": "finalize msg.topic",
               "rules": [
                   {
                       "t": "set",
                       "p": "top",
                       "pt": "msg",
                       "to": "'0_userdata.0.' & top",
                       "tot": "jsonata"
                   },
                   {
                       "t": "set",
                       "p": "topic",
                       "pt": "msg",
                       "to": "top & topic",
                       "tot": "jsonata"
                   }
               ],
               "action": "",
               "property": "",
               "from": "",
               "to": "",
               "reg": false,
               "x": 1970,
               "y": 240,
               "wires": [
                   []
               ]
           },
           {
               "id": "4cdee7cb.910c38",
               "type": "switch",
               "z": "c3403a60.92fbb8",
               "name": "is type?",
               "property": "payload",
               "propertyType": "msg",
               "rules": [
                   {
                       "t": "istype",
                       "v": "json",
                       "vt": "json"
                   },
                   {
                       "t": "istype",
                       "v": "object",
                       "vt": "object"
                   },
                   {
                       "t": "istype",
                       "v": "array",
                       "vt": "array"
                   },
                   {
                       "t": "else"
                   }
               ],
               "checkall": "true",
               "repair": false,
               "outputs": 4,
               "x": 400,
               "y": 160,
               "wires": [
                   [
                       "c1c41535.17d3b8"
                   ],
                   [
                       "eea737e7.7e8fb8"
                   ],
                   [
                       "d839cef8.577f1"
                   ],
                   [
                       "d8f58d9b.b6a1"
                   ]
               ]
           },
           {
               "id": "c1c41535.17d3b8",
               "type": "json",
               "z": "c3403a60.92fbb8",
               "name": "",
               "property": "payload",
               "action": "",
               "pretty": false,
               "x": 570,
               "y": 120,
               "wires": [
                   [
                       "3ccd67db.375058"
                   ]
               ]
           },
           {
               "id": "bdfdae99.f4d9d",
               "type": "switch",
               "z": "c3403a60.92fbb8",
               "name": "is msg.top != null",
               "property": "top",
               "propertyType": "msg",
               "rules": [
                   {
                       "t": "nnull"
                   },
                   {
                       "t": "null"
                   }
               ],
               "checkall": "true",
               "repair": false,
               "outputs": 2,
               "x": 1750,
               "y": 280,
               "wires": [
                   [
                       "74b0b536.02371c"
                   ],
                   [
                       "7ba7dc21.fdb214"
                   ]
               ]
           },
           {
               "id": "7ba7dc21.fdb214",
               "type": "change",
               "z": "c3403a60.92fbb8",
               "name": "payload = warning",
               "rules": [
                   {
                       "t": "set",
                       "p": "payload",
                       "pt": "msg",
                       "to": "Please define msg.top as root for the object structure",
                       "tot": "str"
                   },
                   {
                       "t": "delete",
                       "p": "topic",
                       "pt": "msg"
                   }
               ],
               "action": "",
               "property": "",
               "from": "",
               "to": "",
               "reg": false,
               "x": 1970,
               "y": 300,
               "wires": [
                   [
                       "ab9b1e85.eea2a"
                   ]
               ]
           },
           {
               "id": "ab9b1e85.eea2a",
               "type": "rbe",
               "z": "c3403a60.92fbb8",
               "name": "",
               "func": "rbe",
               "gap": "",
               "start": "",
               "inout": "out",
               "septopics": true,
               "property": "payload",
               "x": 2130,
               "y": 300,
               "wires": [
                   []
               ]
           },
           {
               "id": "94876630.f71748",
               "type": "change",
               "z": "c3403a60.92fbb8",
               "name": "",
               "rules": [
                   {
                       "t": "delete",
                       "p": "topic",
                       "pt": "msg"
                   }
               ],
               "action": "",
               "property": "",
               "from": "",
               "to": "",
               "reg": false,
               "x": 210,
               "y": 160,
               "wires": [
                   [
                       "4cdee7cb.910c38"
                   ]
               ]
           },
           {
               "id": "3ccd67db.375058",
               "type": "switch",
               "z": "c3403a60.92fbb8",
               "name": "is array?",
               "property": "payload",
               "propertyType": "msg",
               "rules": [
                   {
                       "t": "istype",
                       "v": "array",
                       "vt": "array"
                   },
                   {
                       "t": "else"
                   }
               ],
               "checkall": "true",
               "repair": false,
               "outputs": 2,
               "x": 700,
               "y": 120,
               "wires": [
                   [
                       "d839cef8.577f1"
                   ],
                   [
                       "eea737e7.7e8fb8"
                   ]
               ]
           },
           {
               "id": "80dde279.c28ec",
               "type": "comment",
               "z": "c3403a60.92fbb8",
               "name": "Array",
               "info": "",
               "x": 400,
               "y": 280,
               "wires": []
           },
           {
               "id": "95ee816e.68a16",
               "type": "comment",
               "z": "c3403a60.92fbb8",
               "name": "object",
               "info": "",
               "x": 1140,
               "y": 100,
               "wires": []
           },
           {
               "id": "d8f58d9b.b6a1",
               "type": "switch",
               "z": "c3403a60.92fbb8",
               "name": "is type?",
               "property": "payload",
               "propertyType": "msg",
               "rules": [
                   {
                       "t": "istype",
                       "v": "object",
                       "vt": "object"
                   },
                   {
                       "t": "istype",
                       "v": "array",
                       "vt": "array"
                   },
                   {
                       "t": "else"
                   }
               ],
               "checkall": "true",
               "repair": false,
               "outputs": 3,
               "x": 960,
               "y": 280,
               "wires": [
                   [
                       "eea737e7.7e8fb8"
                   ],
                   [
                       "d839cef8.577f1"
                   ],
                   [
                       "bdfdae99.f4d9d"
                   ]
               ]
           },
           {
               "id": "661bcbd9.33b4c4",
               "type": "inject",
               "z": "175d7b92.c54684",
               "name": "",
               "props": [
                   {
                       "p": "payload"
                   }
               ],
               "repeat": "",
               "crontab": "",
               "once": false,
               "onceDelay": 0.1,
               "topic": "",
               "payload": "{\"velocity\":0,\"velocityTag\":\"DEFAULT\",\"velocityText\":\"The node operates by its default velocity\"}",
               "payloadType": "json",
               "x": 350,
               "y": 780,
               "wires": [
                   [
                       "6fddd77b.2cd208"
                   ]
               ]
           },
           {
               "id": "b4882230.f2297",
               "type": "subflow:c3403a60.92fbb8",
               "z": "175d7b92.c54684",
               "name": "",
               "x": 750,
               "y": 780,
               "wires": [
                   [
                       "e98362f0.0721b"
                   ]
               ]
           },
           {
               "id": "6fddd77b.2cd208",
               "type": "change",
               "z": "175d7b92.c54684",
               "name": "msg.top = velux",
               "rules": [
                   {
                       "t": "set",
                       "p": "top",
                       "pt": "msg",
                       "to": "velux",
                       "tot": "str"
                   }
               ],
               "action": "",
               "property": "",
               "from": "",
               "to": "",
               "reg": false,
               "x": 520,
               "y": 780,
               "wires": [
                   [
                       "b4882230.f2297"
                   ]
               ]
           },
           {
               "id": "e98362f0.0721b",
               "type": "ioBroker out",
               "z": "175d7b92.c54684",
               "name": "",
               "topic": "",
               "ack": "true",
               "autoCreate": "true",
               "stateName": "",
               "role": "",
               "payloadType": "",
               "readonly": "",
               "stateUnit": "",
               "stateMin": "",
               "stateMax": "",
               "x": 980,
               "y": 780,
               "wires": []
           }
        ]
        

        Ergänzung: Die Fehlermeldung im Log gabs wahrscheinlich nicht, weil es direkt nach 0_userdata.0 angelegt wurde.

        Du kannst aber erst mal selbst keine Datenpunkte seit dem neuen Admin anlegen, weil NodeRed leider keine Objekte im iobroker anlegen kann.

        Du siehst das fehlende Objekt im neuen admin an dem fehlenden Stiftsymbol

        885ddba4-daa0-4606-b344-5ad632c01cd0-image.png

        Du musst dann auf der Ebene 0_userdata.0 den Punkt velux nochmals manuell anlegen, damit alles regelkonform ist:

        77002fac-e816-41d3-a39a-8583335bf14c-image.png

        Dann kannst auch manuell in diesem "Verzeichnis" wieder neue Datenpunkte anlegen:

        0c02597e-dc6b-4ddb-87a8-a43ad495d739-image.png

        Wenn Du auf den Adapter zurückgehst um das Log zu analysieren, dann sag nochmal Bescheid, denn ich hab noch was an der ChangeNode geändert und wie gesagt eine andere Tailnode verwendet.

        S 1 Reply Last reply Reply Quote 0
        • S
          sascho @mickym last edited by

          @mickym

          Also, ich habe mal alles auf die All Value Nodes umgebaut - über die Change Variante. Gefühlt hat das schon mal etwas gebracht. Es kommen weniger Fehlermeldung ins Log:
          51b8d861-aa7e-49c9-922c-e91eea081e49-image.png

          Allerdings habe ich beobachtet, dass wenn ich Fensterpaare ansteuere, dass die Status Nodes kurz offline sind, und erst nach 2-3 Minuten wieder einen Status berichten. Ich vermute stark, dass in diesem Moment die Fehlermeldungen generiert werden. Vermutlich kann das KLF200 wirklich nur 2 Befehle gleichzeitig verarbeiten. Ich bekomme später des KLR200 und versuche dann mal die Target Befehle über Szenen abzubilden. Evtl. reduziert das die Probleme weiter.

          Wie ich die Catch Node verwenden kann ist mir aber nicht klar.

          Ich habe sie mit ins Flow Fenster kopiert.. Sollte sie das Debug Fenster beladen?

          ![54766800-8a13-47f2-b9da-90fe02c324a7-image.png]

          cc1b84a1-a2d8-4cf0-8752-830c3a14970f-image.png (/assets/uploads/files/1630158935738-54766800-8a13-47f2-b9da-90fe02c324a7-image.png)

          bb81e70c-5c4f-49dd-bdb5-e4f4dbfee1cc-image.png

          mickym 2 Replies Last reply Reply Quote 0
          • mickym
            mickym Most Active @sascho last edited by mickym

            @sascho Nein die Catch Node ist dazu da, um Fehler abzufangen oder ggf. darauf zu reagieren.

            Wie gesagt ich würde es aber nicht mit allen Nodes machen, sondern dafür ausgewählte Velux Nodes von Dir verwenden.

            Ich versuche Dir das für Dein Beispiel, so am Besten wie möglich zu illustrieren. Da ich wie gesagt keine KLF 200 und keine Velux-Fenster habe, behelfe ich mich momentan mit einer Function Node - die in diesem Beispiel zum Beispiel eine Velux API Node sein könnte, um den Status abzufragen oder auch um das Target zu setzen .

            Doch zuerst noch mal die Catch Node.

            Man kann entweder alle Nodes in einem Flow überwachen oder nur spezielle. Für spezielle kann man die über eine Liste auswählen, da die ziemlich lange ist, kann man das aber auch über die Schaltfläche Nodes auswählen machen, wie ich versucht habe in folgendem Video darzustellen:

            Catch Node zur Fehlerbehandlung.mp4

            So und hier nun der Flow und was ich mit dieser Catch Node erreichen kann.

            screen.png

            Die FunctionNode simuliert eine Velux Node, die ich mit einer Zufallszahl füttere, wenn diese größer als 0,5 ist - spukt die Node einen Fehler aus, wenn die Zufallszahl kleiner 0,5 ist, dann ist alles OK.

            Den Fehler, den die Funktion Node ausstößt, ist in etwa der den Du im Log gepostet hast und das sieht im Beipielflow im Log dann so aus:

            d1ac1fb5-5277-44b6-966a-a46814f566b2-image.png

            wenn ich diese nicht mit der Catch Node abfange.

            Der Vorteil ist natürlich nicht nur, dass ich den Fehler statt im Log im Debug Fenster habe, sondern dass ich damit nun eigene Flows starten kann, die durch den Fehler in der Velux Node getriggert werden können.

            Du siehst wenn Du in der function Node also ein Fehler erzeugt wird (das würde ja Deiner Velux Node entsprechen), dann triggert die Catch Node mit der Error-Objekt

            8216c084-c32c-4747-b655-d2af69e0f37b-image.png

            Dieses kann man nun zwar einfach im Debug Fenster ausgeben lassen oder man lässt einen sinnvollen Flow starten. In meinem Beispielflow filtere ich also nur die Fehlermeldung mit dem timeout aus - man kann natürlich generell einfach alles durchlassen, was einen Fehler erzeugt.

            9597162e-4755-4855-b291-d432f9353691-image.png

            Wichtig ist aber, dass ich über die nachfolgende Change Node nun eine Flowvariable "timeout" auf true setzen kann:

            ae213010-9035-4a04-821e-b713478e033c-image.png

            Solange dies gesetzt ist - wird oben der Flow blockiert bis die timeout Variable wieder false ist.

            5d622698-6550-4166-8d4e-6ea726878006-image.png

            Sprich so kann man nur Werte setzen wenn die timeout-Variable false ist.

            Arbeit die Velux Node richtig (in dem Beispiel die Function Node und liegt keine Fehlersituation vor), dann wird timeout auf false gesetzt.

            Ich geh einfach mal davon aus, dass die Velux Node im Fehlerfall bislang auch nichts mehr ausspukt und nur wenn alles OK ist, wird auch was aus der Node ausgegeben.

            96423900-ecfb-4dd5-9229-da3adaa04c65-image.png 1e082a83-6dd8-4fd1-a5c4-d5779d5329f0-image.png

            Hier mal der Beispielflow zum Import:

            [
               {
                   "id": "70cf0aeb.94bae4",
                   "type": "function",
                   "z": "dce8fa20.2e93c8",
                   "name": "Simuliert Velux Node und erzeugt Zufallsfehler",
                   "func": "if (msg.payload > 0.5) {\n    node.error('Error: timeout GW_COMMAND_SEND_CFM',msg);\n    return null;\n}\nreturn msg;",
                   "outputs": 1,
                   "noerr": 0,
                   "initialize": "",
                   "finalize": "",
                   "libs": [],
                   "x": 640,
                   "y": 3820,
                   "wires": [
                       [
                           "55bbd00a.85697",
                           "3cc096df.4ed41a"
                       ]
                   ]
               },
               {
                   "id": "aed24250.60e72",
                   "type": "change",
                   "z": "dce8fa20.2e93c8",
                   "name": "random 0 bis 1",
                   "rules": [
                       {
                           "t": "set",
                           "p": "payload",
                           "pt": "msg",
                           "to": "$random()\t",
                           "tot": "jsonata"
                       }
                   ],
                   "action": "",
                   "property": "",
                   "from": "",
                   "to": "",
                   "reg": false,
                   "x": 340,
                   "y": 3820,
                   "wires": [
                       [
                           "70cf0aeb.94bae4"
                       ]
                   ]
               },
               {
                   "id": "6b165b15.9486d4",
                   "type": "inject",
                   "z": "dce8fa20.2e93c8",
                   "name": "setze Rolladen auf 40",
                   "props": [
                       {
                           "p": "payload"
                       }
                   ],
                   "repeat": "",
                   "crontab": "",
                   "once": false,
                   "onceDelay": 0.1,
                   "topic": "",
                   "payload": "40",
                   "payloadType": "num",
                   "x": 180,
                   "y": 3680,
                   "wires": [
                       [
                           "81199e61.31b9",
                           "aed24250.60e72"
                       ]
                   ]
               },
               {
                   "id": "55bbd00a.85697",
                   "type": "debug",
                   "z": "dce8fa20.2e93c8",
                   "name": "",
                   "active": true,
                   "tosidebar": true,
                   "console": false,
                   "tostatus": false,
                   "complete": "false",
                   "statusVal": "",
                   "statusType": "auto",
                   "x": 970,
                   "y": 3820,
                   "wires": []
               },
               {
                   "id": "1f8cc5bb.da0f8a",
                   "type": "debug",
                   "z": "dce8fa20.2e93c8",
                   "name": "msg.error Objekt",
                   "active": true,
                   "tosidebar": true,
                   "console": false,
                   "tostatus": false,
                   "complete": "error",
                   "targetType": "msg",
                   "statusVal": "",
                   "statusType": "auto",
                   "x": 550,
                   "y": 3980,
                   "wires": []
               },
               {
                   "id": "7cecf902.b29378",
                   "type": "switch",
                   "z": "dce8fa20.2e93c8",
                   "name": "",
                   "property": "error.message",
                   "propertyType": "msg",
                   "rules": [
                       {
                           "t": "cont",
                           "v": "timeout GW_COMMAND_SEND_CFM",
                           "vt": "str"
                       }
                   ],
                   "checkall": "true",
                   "repair": false,
                   "outputs": 1,
                   "x": 530,
                   "y": 4060,
                   "wires": [
                       [
                           "5e8ff0c7.7bd35"
                       ]
                   ]
               },
               {
                   "id": "5e8ff0c7.7bd35",
                   "type": "change",
                   "z": "dce8fa20.2e93c8",
                   "name": "",
                   "rules": [
                       {
                           "t": "set",
                           "p": "payload",
                           "pt": "msg",
                           "to": "true",
                           "tot": "bool"
                       },
                       {
                           "t": "set",
                           "p": "timeout",
                           "pt": "flow",
                           "to": "true",
                           "tot": "bool"
                       }
                   ],
                   "action": "",
                   "property": "",
                   "from": "",
                   "to": "",
                   "reg": false,
                   "x": 720,
                   "y": 4060,
                   "wires": [
                       [
                           "4c05b28d.a48e1c"
                       ]
                   ]
               },
               {
                   "id": "4c05b28d.a48e1c",
                   "type": "debug",
                   "z": "dce8fa20.2e93c8",
                   "name": "Timeout Fehler Entdeckt",
                   "active": true,
                   "tosidebar": true,
                   "console": false,
                   "tostatus": false,
                   "complete": "payload",
                   "targetType": "msg",
                   "statusVal": "",
                   "statusType": "auto",
                   "x": 980,
                   "y": 4060,
                   "wires": []
               },
               {
                   "id": "3cc096df.4ed41a",
                   "type": "change",
                   "z": "dce8fa20.2e93c8",
                   "name": "",
                   "rules": [
                       {
                           "t": "set",
                           "p": "timeout",
                           "pt": "flow",
                           "to": "false",
                           "tot": "bool"
                       }
                   ],
                   "action": "",
                   "property": "",
                   "from": "",
                   "to": "",
                   "reg": false,
                   "x": 990,
                   "y": 3780,
                   "wires": [
                       []
                   ]
               },
               {
                   "id": "81199e61.31b9",
                   "type": "switch",
                   "z": "dce8fa20.2e93c8",
                   "name": "timeout = false",
                   "property": "timeout",
                   "propertyType": "flow",
                   "rules": [
                       {
                           "t": "false"
                       }
                   ],
                   "checkall": "true",
                   "repair": false,
                   "outputs": 1,
                   "x": 420,
                   "y": 3680,
                   "wires": [
                       [
                           "a705ab3f.628828",
                           "aed24250.60e72"
                       ]
                   ]
               },
               {
                   "id": "a705ab3f.628828",
                   "type": "debug",
                   "z": "dce8fa20.2e93c8",
                   "name": "Velux node setze target auf ...",
                   "active": true,
                   "tosidebar": true,
                   "console": false,
                   "tostatus": false,
                   "complete": "payload",
                   "targetType": "msg",
                   "statusVal": "",
                   "statusType": "auto",
                   "x": 720,
                   "y": 3680,
                   "wires": []
               },
               {
                   "id": "87ba9ec9.74a74",
                   "type": "catch",
                   "z": "dce8fa20.2e93c8",
                   "name": "",
                   "scope": [
                       "70cf0aeb.94bae4"
                   ],
                   "uncaught": false,
                   "x": 320,
                   "y": 3980,
                   "wires": [
                       [
                           "1f8cc5bb.da0f8a",
                           "7cecf902.b29378"
                       ]
                   ]
               }
            ]
            

            Noch was zur Catch Node - falls Du nicht alle Nodes überwachst gibt die Zahl hinter der Node an (wenn Du keinen Namen vergibst) wieviel Nodes von der Catch Node überwacht werden.

            In dem msg.error Objekt, das die Catch Node zurückgibt, ist neben der Fehlermeldung die source interessant:
            Damit kannst Du anhand des Namens oder auch der ID, die Node identifizieren, welche den Fehler geworfen hat. Dies ist dann wichtig, wenn Du mehrere Nodes mit einer Catch Node überwachst.

            Wenn Du die ID über die Schaltfläche in die Zwischenablage kopierst:

            56777fcd-1cbd-4c93-8f86-f7fa612798e3-image.png

            Dann kannst Du diese Node über diese ID im Info-Fenster einfach suchen:

            e9bcc30c-4043-4003-b38c-358397cc9cfe-image.png

            Mit etwas Programmierung in einer Function Node - könnte man sich damit auch eine Befehlsqueue aufbauen, die nur bei korrektem Fehlerstatus die Velux Nodes mit Befehlen versieht.

            mickym 1 Reply Last reply Reply Quote 0
            • mickym
              mickym Most Active @mickym last edited by

              @sascho

              In Anlehnung an das vorherige Posting könntest Du auch versuchen mit einer Velux Node verschiedene Fenster zu steuern und mal schauen ob das geht.

              Ich habe das mal mit dem topic und Inject Nodes versucht - und das kannst ja auch mal probieren, halt mit Deinen IDs

              9b40e23e-236e-46e9-a5df-c267308c1956-image.png

              216d7b0d-90cd-42f6-a62b-d50f906b5d49-image.png

              ob Du so Deine verschiedenen Fenster / Rolläden mit einer Velux Node steuern kannst.

              1 Reply Last reply Reply Quote 0
              • mickym
                mickym Most Active @sascho last edited by mickym

                @sascho So nun habe ich mal so eine Befehlsqueue realisiert:

                Wenn Du über die Inject Nodes wie im vorherigen Post Deine Fenster/Jalousien steuern kannst, dann wäre der nächste Schritt so eine Befehlsqueue mittels einer function Node zu realisieren. Man könnte das ggf. auch ohne function Node machen, aber dann wäre der Flow sehr unübersichtlich.

                e0c7e9f6-7acc-4d5e-9043-44374d44dd52-image.png

                Die blaue Gruppe - in der ich den Fehler der Velux Nodes nur simuliere, kannst Du dann natürlich weglassen. Ich habe in der Simulationsnode - die Fehlerhäufigkeit mal auf 30% eingestellt, so dass 30% einen Fehler erzeugen.

                Wenn Du im Flow die function Node "Befehlsqueue" markierst (orange Linie) und dann auf die Kontextdaten gehst und die Daten aktualisierst, dann siehst Du das die Befehlsqueue quasi leer ist.

                Nun drücke ich die Inject-Nodes nach der Reihe der IDs (also 1,2,3,4,1,2, ...)

                Wenn ein Fehler auftritt, bei mir gleich beim ID 1, dann siehst Du in der trigger Node das 1 Nachricht ansteht und diese nach einer Minute die Befehlsqueue erneut triggert.

                In der Queue ist immer noch der eine Befehl - der also wegen des Fehlers noch nicht abgesetzt werden konnte.

                29a4eb5e-f608-4cb9-a885-04239542ebf8-image.png

                Das passiert dann solange - bis die Velux Node (wieder verfügbar ist):

                3a3ac74b-0138-41cf-88b0-cfefefae9859-image.png

                Hier ein Beispiel wo die erste ID funktionierte, ID 2 und 3 jedoch nicht - da Velux Node nicht bereit.
                In der Befehlsqueue wurden die beiden zwischengespeichert:

                d2d899d1-63e0-4c2f-a5f5-54da4e294acb-image.png

                Alle Minuten wird nun versucht - die noch voll Queue abzuarbeiten bis die Velux Node verfügbar ist - dann wird die Queue geleert:

                58bfc2ed-35b2-432b-92fa-5a63cf5c45e9-image.png

                Hier wieder mal der View zum Spielen und Lernen. 😉

                [{"id":"928423187ddebeb8","type":"inject","z":"5191e3c.a1ef01c","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"velux:write:id:1","payload":"0","payloadType":"num","x":140,"y":2160,"wires":[["1174c3d4591443f0"]]},{"id":"271ceb4ffe85fc0c","type":"inject","z":"5191e3c.a1ef01c","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"velux:write:id:2","payload":"0","payloadType":"num","x":140,"y":2220,"wires":[["1174c3d4591443f0"]]},{"id":"acdfc9e792f998a3","type":"inject","z":"5191e3c.a1ef01c","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"velux:write:id:3","payload":"100","payloadType":"num","x":130,"y":2280,"wires":[["1174c3d4591443f0"]]},{"id":"2aad88c9786daebb","type":"inject","z":"5191e3c.a1ef01c","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"velux:write:id:4","payload":"50","payloadType":"num","x":130,"y":2340,"wires":[["1174c3d4591443f0"]]},{"id":"1174c3d4591443f0","type":"function","z":"5191e3c.a1ef01c","name":"Befehlsqueue","func":"var queue = context.get('queue') || [];\nvar isError = false;\n\nmsg.OK = msg.OK || false;\n\nif (msg.payload !== undefined) queue.push(msg);\nif (msg.error !== undefined) isError = true;\nif (msg.OK) {\n    // node.warn('msg.OK recieved');\n    queue.shift();\n    // node.warn(queue);\n    isError = false;\n}\ncontext.set('queue',queue);\n\n// if (msg.OK) return null; \n\n// node.warn('isError: ' + isError);\n// node.warn('msg.OK: ' + msg.OK);\n\nif (queue.length > 0 && !isError ) {\n    return [queue[0],null];\n}\n    else if (isError) {\n    return [null,msg];\n}\n    \n","outputs":2,"noerr":0,"initialize":"","finalize":"","libs":[],"x":420,"y":2240,"wires":[["e373e8c42f89a886","aed24250.60e72"],["9123ef8b7bd2ad6a","56618fd026f5c1b1"]]},{"id":"e373e8c42f89a886","type":"Velux Nodes","z":"5191e3c.a1ef01c","nodevalue":"","topic":"","x":650,"y":2080,"wires":[["6493512466028bf9","7361ce697612a791"]]},{"id":"6493512466028bf9","type":"debug","z":"5191e3c.a1ef01c","name":"Velux Node Simulation","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1280,"y":2080,"wires":[]},{"id":"85ad53e3176273fe","type":"catch","z":"5191e3c.a1ef01c","name":"","scope":["70cf0aeb.94bae4"],"uncaught":false,"x":170,"y":2440,"wires":[["1174c3d4591443f0"]]},{"id":"7361ce697612a791","type":"change","z":"5191e3c.a1ef01c","name":"","rules":[{"t":"delete","p":"payload","pt":"msg"},{"t":"delete","p":"topic","pt":"msg"},{"t":"set","p":"OK","pt":"msg","to":"true","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":890,"y":2240,"wires":[["1174c3d4591443f0","c0a741f73c2a7530"]]},{"id":"56618fd026f5c1b1","type":"debug","z":"5191e3c.a1ef01c","name":"error","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":650,"y":2300,"wires":[]},{"id":"9123ef8b7bd2ad6a","type":"trigger","z":"5191e3c.a1ef01c","name":"","op1":"","op2":"true","op1type":"nul","op2type":"bool","duration":"1","extend":false,"overrideDelay":false,"units":"min","reset":"","bytopic":"all","topic":"topic","outputs":1,"x":670,"y":2360,"wires":[["8ff0b78f263a84ce"]]},{"id":"c0a741f73c2a7530","type":"change","z":"5191e3c.a1ef01c","name":"","rules":[{"t":"set","p":"reset","pt":"msg","to":"","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1120,"y":2240,"wires":[["9123ef8b7bd2ad6a"]]},{"id":"8ff0b78f263a84ce","type":"change","z":"5191e3c.a1ef01c","name":"","rules":[{"t":"delete","p":"payload","pt":"msg"},{"t":"delete","p":"topic","pt":"msg"},{"t":"delete","p":"error","pt":"msg"},{"t":"set","p":"OK","pt":"msg","to":"false","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":450,"y":2420,"wires":[["1174c3d4591443f0"]]},{"id":"3e49536e2c3f9b25","type":"group","z":"5191e3c.a1ef01c","name":"Simuliere VeluxNode","style":{"label":true,"color":"#000000","fill":"#3f93cf"},"nodes":["aed24250.60e72","70cf0aeb.94bae4"],"x":534,"y":2119,"w":612,"h":82},{"id":"aed24250.60e72","type":"change","z":"5191e3c.a1ef01c","g":"3e49536e2c3f9b25","name":"random 0 bis 1","rules":[{"t":"set","p":"rnd","pt":"msg","to":"$random()\t","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":640,"y":2160,"wires":[["70cf0aeb.94bae4"]]},{"id":"70cf0aeb.94bae4","type":"function","z":"5191e3c.a1ef01c","g":"3e49536e2c3f9b25","name":"Simuliert Velux Node und erzeugt Zufallsfehler","func":"if (msg.rnd > 0.7) {\n    msg = {};\n    node.error('Error: timeout GW_COMMAND_SEND_CFM',msg);\n    return null;\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":940,"y":2160,"wires":[["6493512466028bf9","7361ce697612a791"]]}]
                

                Der untere Teil der function Node (Befehlsqueue) wird also ausgeführt, wenn die Velux Node im Fehlerzustand ist, ansonsten werden die Befehle nacheinander an die Velux Node über den oberen Ausgang der function Node gesendet.

                Du kannst natürlich meine ganzen Debug Nachrichten aus der function Node rauslöschen, so dass der reine Code der function Node nun so aussieht:

                var queue = context.get('queue') || [];
                var isError = false;
                msg.OK = msg.OK || false;
                
                if (msg.payload !== undefined) queue.push(msg);
                if (msg.error !== undefined) isError = true;
                if (msg.OK) {
                    queue.shift();
                    isError = false;
                }
                context.set('queue',queue);
                if (queue.length > 0 && !isError ) {
                    return [queue[0],null];
                }
                    else if (isError) {
                    return [null,msg];
                }
                
                S 1 Reply Last reply Reply Quote 0
                • S
                  sascho @mickym last edited by sascho

                  @mickym

                  Wow! Jetzt bin ich völlig erschlagen. Ich muss mir das erst mal morgen alles in Ruhe ansehen. Tausend Dank schon mal vorweg! Ich glaube, ich muss Dir mal einen Präsentkorb schicken, bei dem ganzen Aufwand, den Du hier für mich betreibst!

                  Ich habe gerade das KLR200 in Betrieb genommen, und im KLF200 4 Szenen zu einem Fensterpaar angelernt:
                  1317055c-0909-4360-894f-0d6f49d76f95-image.png

                  Mit der Scene Node und einer Inject Node kann ich die 4 Szenen ansteuern. Es funktioniert sehr gut.

                  69e8da04-755e-4ccc-be3d-9ff02b1d10fe-image.png

                  b5a7e9da-73a3-4280-95e0-ffd1cf7336c7-image.png

                  11fce081-f398-4b93-8a33-a37da80817fd-image.png

                  Die Kür wäre jetzt, wenn ich nur eine Velux Scene Node benötigen würde, indem ich den Szenenindex in der Nachricht mitgebe. Laut diesem Node Guide wäre das doch möglich:
                  4b49a4be-3579-49f4-aba1-ec6145777089-image.png
                  Was muss ich denn da im Topic mitgeben? Ich bekomme nur Fehler gerade.

                  c03983e8-acf3-4f1c-b729-933927580cd8-image.png

                  Das geht doch in die Richtung, wie Du es oben aufgebaut hast - hinter die Dachfenster Funktionen hängen, die dann die Velux Scene Node anspricht.

                  Btw. Die Scene Node sendet auch Status Meldungen - einige während die Fenster laufen... Evtl. könnte ich mir da die Current, und Remaining/Run Status Meldungen abfangen und so auf die Velux Nodes komplett verzichten 🙂

                  e1e6cb95-d55c-4431-8efa-9be667492765-image.png

                  mickym 1 Reply Last reply Reply Quote 0
                  • mickym
                    mickym Most Active @sascho last edited by mickym

                    @sascho Also die Szene IDs sind ja eindeutig. Im Prinzip brauchst Du in den Velux Scenes Node gar nichts eintragen.

                    Du gibst einfach die ID in das topic im Inject Node ein und fütterst damit die Scenes Node:

                    5463c08e-310b-4fa2-97aa-6637d50cbfea-image.png

                    Die Zahl hinter der ID ist die Szene ID und nicht die Node ID - wie bei der Velux Node Node. 😉

                    Aber nicht msg 😉 msg.topic =msg.velux... , sondern natürlich als String :

                    Sowas geht nicht:

                    7e7a1d6b-f87e-4aba-a311-6dddcb380389-image.png

                    Ein Objekt kann keine Doppelpunkte enthalten und Du hast ja in Deiner Inject kein msg.velux Objekt definiert. - Also einfach die Velux Node mit einem msg.topic als normalen String füttern.

                    Es macht ausserdem in dem unteren Flow keinen Sinn in der Debug Node eine msg.payload abzugreifen, wenn es keine msg.payload gibt

                    3869cfc9-c1ac-42f8-96ea-1d488f8259fc-image.png

                    Dann ist es besser Du stellst die Debug Node auf das gesamte Nachrichten objekt um:

                    0881f14b-bfba-4751-8e7a-49e61af1d38f-image.png

                    9f236a0a-5988-4cb1-89a1-bc6b4b6311d2-image.png

                    S 1 Reply Last reply Reply Quote 0
                    • S
                      sascho @mickym last edited by

                      @mickym

                      Also, irgendwie funktioniert es noch nicht. Ich habe die Inject Node auf String umgestellt und den Scene Index 0 und 1 probiert. Darauf reagiert die Velux Scene Node nicht:

                      2c83c173-62dd-4ba3-b68b-1073b229087d-image.png

                      b38f9455-722b-4fae-8f40-b67ade0ad713-image.png

                      1585ad52-d7bf-4512-a517-f4c784d6cc9b-image.png

                      Die Debug Node habe ich auf all Messages umgestellt.

                      1 Reply Last reply Reply Quote 0
                      • mickym
                        mickym Most Active last edited by mickym

                        @sascho Nun - ich finde leider auch nichts genaues

                        Wenn die Scene Node noch rot ist - dann muss man da was eingeben. Es darf auf KEINEN Fall noch so ein rotes Warndreieck über der Node zu sehen sein und die rot umrandeten Felder müssen ausgefüllt sein.

                        screen.png

                        screen.png

                        So wie ich den Text verstehe:

                        velux:id:<id>  scene id for execute. **The settings are ignored.**
                        

                        Du musst in der Szene ID trotzdem in die Node eingeben (auch wenn man das wohl mit dem topic überschreibt) - das darf nicht leer oder rot bleiben. Also gib einfach mal eine Zahl als Szene Index ein und schau - ob Du das mit der Inject Node überschreiben kannst.

                        S 1 Reply Last reply Reply Quote 0
                        • S
                          sascho @mickym last edited by

                          @mickym

                          Mit der Variante String geht es leider nicht :-(.
                          Die ersten zwei Versuche mit den Scene IDs 4 und 5 führen zu keiner Reaktion bei KLF200, der dritte Versuche dann mit Scene ID 5 + Number produziert eine Reaktion allerdings keine Bewegung:

                          64887805-5251-46f3-815b-2da70332cca0-image.png

                          623fbda3-1f54-41e7-ac66-3887cc3d2373-image.png

                          67e27111-9cd1-4039-8146-472c9381929d-image.png

                          Gäbe es evtl. eine Alternative, die Szene über die Velux API + eine Funktion auszulösen? Hier wird das beschrieben (auch wie man die Überlastung des KLF200 verhindern kann):
                          https://213.136.68.177/topic/14312/adapter-für-velux-klf-200-interface/41?lang=en-GB&page=6
                          Dies wäre der Code:


                          [
                          {
                          "id": "6948542c.c8d8cc",
                          "type": "tab",
                          "label": "Flow 1",
                          "disabled": false,
                          "info": ""
                          },
                          {
                          "id": "b807c1d.30bcd4",
                          "type": "ui_button",
                          "z": "6948542c.c8d8cc",
                          "name": "",
                          "group": "9f7de3ee.89f1c8",
                          "order": 1,
                          "width": "3",
                          "height": "2",
                          "passthru": false,
                          "label": "Schließen",
                          "tooltip": "",
                          "color": "",
                          "bgcolor": "red",
                          "icon": "",
                          "payload": "0",
                          "payloadType": "num",
                          "topic": "",
                          "topicType": "str",
                          "x": 100,
                          "y": 80,
                          "wires": [
                          [
                          "65db499a.ac2328"
                          ]
                          ]
                          },
                          {
                          "id": "65db499a.ac2328",
                          "type": "function",
                          "z": "6948542c.c8d8cc",
                          "name": "activateScene",
                          "func": ""use strict"\n//const velux = require('velux-klf200-api');\nvar velux = global.get('velux');\nconst ip = '192.168.178.6';\nconst pwd = '....';\n\nvar sceneId = msg.payload;\n\nvelux.connect(ip,{})\n.then(()=>{\n return velux.login(pwd);\n})\n.then((data)=>{\n return velux.sendCommand({ api: velux.API.GW_ACTIVATE_SCENE_REQ,sceneID:sceneId,\n /SessionID: 124,/\n commandOriginator: 1,\n priorityLevel: 2,\n });\n})\n.then((data)=>{\n console.log(data);\n return velux.end();\n})\n.catch((err)=>{\n console.log(err);\n return velux.end();\n});\n\nreturn msg;\n",
                          "outputs": 1,
                          "noerr": 0,
                          "initialize": "",
                          "finalize": "",
                          "libs": [],
                          "x": 580,
                          "y": 160,
                          "wires": [
                          []
                          ],
                          "inputLabels": [
                          "sceneId"
                          ]
                          },
                          {
                          "id": "592841b2.aadd2",
                          "type": "inject",
                          "z": "6948542c.c8d8cc",
                          "name": "",
                          "props": [
                          {
                          "p": "payload"
                          }
                          ],
                          "repeat": "",
                          "crontab": "",
                          "once": false,
                          "onceDelay": 0.1,
                          "topic": "",
                          "payload": "1",
                          "payloadType": "num",
                          "x": 390,
                          "y": 200,
                          "wires": [
                          [
                          "65db499a.ac2328"
                          ]
                          ]
                          },
                          {
                          "id": "9f7de3ee.89f1c8",
                          "type": "ui_group",
                          "name": "Alle",
                          "tab": "e2ba1a6f.2f0198",
                          "order": 1,
                          "disp": true,
                          "width": "6",
                          "collapse": false
                          },
                          {
                          "id": "e2ba1a6f.2f0198",
                          "type": "ui_tab",
                          "name": "Dachfenster",
                          "icon": "home",
                          "order": 9,
                          "disabled": false,
                          "hidden": false
                          }
                          ]

                          Allerdings müsste ich wahrscheinlich die settings.js modifizieren.

                          S mickym 2 Replies Last reply Reply Quote 0
                          • S
                            sascho @sascho last edited by

                            @sascho

                            Ich hab's mit der Function + API Node hinbekommen :-)))!!! Ich kann nun über die Inject Node direkt die Szene aufrufen.

                            Das Programm zum öffnen von Dateien im Terminal des Docker vom IOBroker nennt sich Nano. Damit konnte ich die settings.js modifizieren. Der Befehl lautet: nano /opt/iobroker/node_modules/iobroker.node-red/settings.js

                            f7340401-a3f3-4127-9c6b-dc38859bca94-image.png

                            Ich würde jetzt mal zwei Fenster auf die API Node umbauen. Im nächsten Schritt wäre aber die Frage, ob ich mit einer weiteren API Node auskommen würde, um die Current Position und Remaining/Bewegungsstatus auszulesen :-). Ich bin aber für heute schon mal super Happy!

                            mickym 1 Reply Last reply Reply Quote 0
                            • mickym
                              mickym Most Active @sascho last edited by

                              @sascho Kannst Du Code für die Zukunft in CodeTags packen - sonst ist das blöd zum Kopieren.

                              Punkt 1:

                              Ehrlich gesagt verstehe ich den functions-code nur halb und halte auch davon überhaupt nichts. Wie gesagt, um Überlastung zu verhindern, habe ich Dir ja gestern ein paar Flows geschickt. Die settings.js müsstest Du modifizieren, aber nur weil du die API in der Function Node verfügbar machen müsstest. Dafür hast Du aber die Velux Nodes und die machen die Arbeit schon, auch wenn wir es halt nicht wissen, warum es nicht geht.

                              In der Function Node werden Fehler auch nur mit catch abgefangen. Wie gesagt - ich halte nichts davon, über function Nodes so was komplett zu schreiben.

                              Der Ersteller dieser Function Node macht nichts weiter als die API aufzurufen, das können wir mit der API Node ja auch versuchen.

                              9ed21d44-df2e-4fc6-b90f-6bd23726ac02-image.png

                              Im Prinzip fängt der Fehler nur mit der Catch Node ab, macht aber nichts draus.
                              Was der macht ist nur die API aufzurufen, dass kannst Du aber auch mit den API Nodes:

                              Das gleiche können wir aber auch mit der API Node versuchen:

                              [{"id":"a3aade90e5d5d119","type":"inject","z":"4754a7c40731a9a7","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"{\"apiText\":\"GW_ACTIVATE_SCENE_REQ\",\"commandOriginator\":1,\"priorityLevel\":2,\"SceneID\":4}","payloadType":"json","x":360,"y":520,"wires":[["38b2a8196a72e975"]]},{"id":"38b2a8196a72e975","type":"Velux Api","z":"4754a7c40731a9a7","api":"","ntf":"","topic":"","x":540,"y":520,"wires":[["d002272057b9ce64"]]},{"id":"d002272057b9ce64","type":"debug","z":"4754a7c40731a9a7","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":690,"y":520,"wires":[]}]
                              

                              Im Prinzip hat dieser Ersteller der Function Node nur diese API Funktion aufgerufen:

                              6fb058f4-0fc5-4f71-be7c-5f6f7520eb88-image.png

                              Wenn Du die Inject Node aufmachst um das Objekt zu bearbeiten, dann mach den visuellen Editor auf, dann kannst da die Zahl für die Szene eingeben.

                              screen.png

                              Eventuell muss man lt. API auch noch die Velocity eingeben.

                              Du hast auch nicht rückgemeldet, ob die API Nodes zur Ermittlung des Status und der Reboot funktionieren????

                              Punkt 2:

                              Probier halt auch ob meine Inject Nodes mit den normalen Nodes funktionieren.

                              Punkt 3
                              Ich habe mir gerade den Source Code der Szene Node angeschaut - also es muss in jedem Fall das Topic als String übergeben werden:

                              b3336d3e-b1e8-49b1-ba1f-3491cba56f6e-image.png

                              Ich bin mir aber noch nicht sicher, ob ich das mit den Szenen verstanden habe. Inzwischen kannst ja mal den API Call der Szene probieren und schauen, ob was zurückkommt.

                              1 Reply Last reply Reply Quote 0
                              • mickym
                                mickym Most Active @sascho last edited by mickym

                                @sascho sagte in bshb - Rollladensteuerung mit yhka Homekit:

                                @sascho

                                Ich hab's mit der Function + API Node hinbekommen :-)))!!! Ich kann nun über die Inject Node direkt die Szene aufrufen.

                                Das Programm zum öffnen von Dateien im Terminal des Docker vom IOBroker nennt sich Nano. Damit konnte ich die settings.js modifizieren. Der Befehl lautet: nano /opt/iobroker/node_modules/iobroker.node-red/settings.js

                                f7340401-a3f3-4127-9c6b-dc38859bca94-image.png

                                Ich würde jetzt mal zwei Fenster auf die API Node umbauen. Im nächsten Schritt wäre aber die Frage, ob ich mit einer weiteren API Node auskommen würde, um die Current Position und Remaining/Bewegungsstatus auszulesen :-). Ich bin aber für heute schon mal super Happy!

                                Ich würde es nicht machen. - Ich hab Dir ja gerade geschickt, wie Du das was die Funktion macht ggf. auhc mit der API Node machen kannst.

                                Nano ist übrigens ein Linux Editor - dann hat inzwischen jedes neuere Linux System an Board. 😉

                                Aber wie gesagt mit der Function Node - bin ich aus dem Spiel.

                                S 1 Reply Last reply Reply Quote 0
                                • S
                                  sascho @mickym last edited by

                                  @mickym

                                  Mit der API Node + Funktion hattest Du vollkommen Recht, das war nichts. Die Reaktion der testweise angeschlossenen Fenster war total sporadisch. Ich habe sie erst einmal wieder rausgenommen - total frustierend so etwas.

                                  Stattdessen habe ich gestern die restlichen Szenen im KLF200 angelernt, nachdem es aufgehört hatte zu regnen (ansonsten fahren die Fenster nicht auf).

                                  Ich habe dann mal auf die Schnelle den KLF200 Adapter wieder installiert und an die Szenen gehängt. Bisher läuft der Adapter ohne Absturz und keine Fehlermeldungen im Log.

                                  Evtl. ist ja der Adapter doch die bessere Wahl in Verbindung mit den Szenen + evtl. das Abfangen von Statusmeldungen im Log. Ich habe jetzt einen Smarten Zwischenstecker vor dem KLF200. Wenn eine Fehlermeldung des Adapters im Log auftaucht, könnte man den Zwischenstecker kurz aus und einschalten und dann den Adapter neu starten. Evtl. ist das die beste Lösung?

                                  Mich würde aber schon noch interessieren, ob wir die Nodes zum Laufen bekommen mit Deinen Skripten - mir fehlt gerade nur die Zeit zum ausprobieren :-(.

                                  mickym 1 Reply Last reply Reply Quote 0
                                  • mickym
                                    mickym Most Active @sascho last edited by mickym

                                    @sascho sagte in bshb - Rollladensteuerung mit yhka Homekit:

                                    Mit der API Node + Funktion hattest Du vollkommen Recht, das war nichts. Die Reaktion der testweise angeschlossenen Fenster war total sporadisch. Ich habe sie erst einmal wieder rausgenommen - total frustierend so etwas.

                                    Na deswegen war ich da auch raus - wenn jemand meint mit einem API Call, dasselbe zu erreichen. Wie gesagt, das hättest Du direkt auch mit der API Node machen können und ich hab Dir ja beschrieben, wie man sowas dann macht. Und wenn man mit der API arbeitet, dann gehört etwas mehr dazu, als nur den Request abzusetzen, das können die API Nodes auch.

                                    Lies mal aus der API Doku ab seite 95

                                    5fd6fb3b-a247-486c-bab5-f9dabc88c08a-image.png

                                    Ich hätte also zumindest erwartet, dass diese Function zurückgibt, ob der Request akzeptiert wurde oder nicht und das hat der alles nicht gemacht. Deswegen war das für mich gleich alles für die Tonne, zudem Du ja die API Node hast, um sowas zu machen.

                                    Aber für Dich ist es wahrscheinlich wirklich besser, Du nimmst den iobroker Adapter wieder in Betrieb und reagierst erst mal auf Fehlersituationen im Log, als Dich mit diesen Problemen rumzuschlagen.

                                    Es wäre was anderes wenn ich auch so KLF Gateway hätte, dann könnte ich Dich hier ganz anders unterstützen, da ich die Dinge ja selbst ausprobieren könnte, aber nach dem nicht der Fall ist, geht das leider nicht. Auch das ich generell den Vorschlag gemacht habe, es mit den Velux Nodes es zu versuchen, war ja nur der Versuch, ob Du damit etwas mehr Stabilität bekommst. Wie Du an dem Flow mit der Befehlsqueue siehst, hat man halt ggf. mehr Möglichkeiten durch direktes Zurückmelden einer Fehlersituation eben schneller zu reagieren, als über den Adapter.

                                    Wie gesagt, nimm den Adapter wieder in Betrieb und installiere Dir die von mir empfohlene Tailnode. Ich habe die jetzt 1-2 Wochen in Betrieb und die kommt nun mit dem Wechsel des iobroker Log Files gut zu Recht.

                                    S 1 Reply Last reply Reply Quote 0
                                    • S
                                      sascho @mickym last edited by

                                      @mickym

                                      Dieses Schaubbild von Velux hat mich überzeugt, es mal verstärkt mit den Scenes zu versuchen. Ich habe ganz stark die Vermutung, dass das KLF200 gut damit zurecht kommt, aus einem User-Szenenbefehl mehrere Aktuatoren sauber anzusteuern. Nicht gut zurecht kommt es mit Situationen, wo mehrere User-Befehle mit mehreren Aktuatoren verheiratet werden müssen.
                                      Auch mit fast zeitgleich ausgelösten Szenen kommt es gut zurecht. Seit zwei Tagen läuft der Adapter durch und nichts vom Adapter ist im Log aufgetaucht. Das ist doch schon mal super.

                                      Und realistischerweise - ich habe hier im Haus noch so viele Sachen zu erledigen - da mache ich mich an das Nodes Thema lieber später noch mal dran. Evtl. hat es ja noch ein paar Vorteile ggü. dem Adapter.
                                      Ich hoffe, dass der Adapter jetzt mal sauber durchläuft - beim ersten Crash baue ich dann noch die Tail-Node ein.
                                      Als nächstes muss aber auf jeden Fall noch die PV Anlage eingebunden werden :-). Du bist aber eine ganz große Hilfe in der Lage! Wirklich noch einmal großen Dank und meine aufrichtige Hochachtung vor Deinen Fähigkeiten!

                                      1 Reply Last reply Reply Quote 0
                                      • S
                                        sascho last edited by sascho

                                        @mickym Kurze Frage, ich wollte gerade noch mal den Restart der Instanz einbauen, wenn der Adapter die Verbindung zum KLF200 verliert.
                                        Trigger für den Restart ist, wenn der Connection Datenpunkt auf False springt.
                                        Ich bekomme aber den Trigger für den Instanz-Restart nicht hin. Es kommt immer folgende Fehlermeldung.


                                        [
                                        {
                                        "id": "b75d7881.80f448",
                                        "type": "tab",
                                        "label": "KLF200_Adapter",
                                        "disabled": false,
                                        "info": ""
                                        },
                                        {
                                        "id": "1269b93.a703647",
                                        "type": "exec",
                                        "z": "b75d7881.80f448",
                                        "command": "iobroker restart klf200.0",
                                        "addpay": "",
                                        "append": "",
                                        "useSpawn": "false",
                                        "timer": "",
                                        "oldrc": false,
                                        "name": "iobroker restart klf200.0",
                                        "x": 650,
                                        "y": 140,
                                        "wires": [
                                        [
                                        "e778d2c7.a6621"
                                        ],
                                        [
                                        "e778d2c7.a6621"
                                        ],
                                        [
                                        "e778d2c7.a6621"
                                        ]
                                        ]
                                        },
                                        {
                                        "id": "c4ee8035.cdf36",
                                        "type": "inject",
                                        "z": "b75d7881.80f448",
                                        "name": "",
                                        "props": [
                                        {
                                        "p": "payload"
                                        }
                                        ],
                                        "repeat": "",
                                        "crontab": "",
                                        "once": false,
                                        "onceDelay": 0.1,
                                        "topic": "",
                                        "payload": "false",
                                        "payloadType": "bool",
                                        "x": 170,
                                        "y": 220,
                                        "wires": [
                                        [
                                        "9b67467.79a76b8"
                                        ]
                                        ]
                                        },
                                        {
                                        "id": "1281ff6c.19b101",
                                        "type": "ioBroker in",
                                        "z": "b75d7881.80f448",
                                        "name": "KLF200_Connection_Status",
                                        "topic": "klf200.0.info.connection",
                                        "payloadType": "value",
                                        "onlyack": "",
                                        "func": "rbe",
                                        "gap": "",
                                        "fireOnStart": "false",
                                        "x": 160,
                                        "y": 140,
                                        "wires": [
                                        [
                                        "9b67467.79a76b8"
                                        ]
                                        ]
                                        },
                                        {
                                        "id": "9b67467.79a76b8",
                                        "type": "switch",
                                        "z": "b75d7881.80f448",
                                        "name": "",
                                        "property": "payload",
                                        "propertyType": "msg",
                                        "rules": [
                                        {
                                        "t": "false"
                                        },
                                        {
                                        "t": "true"
                                        }
                                        ],
                                        "checkall": "true",
                                        "repair": false,
                                        "outputs": 2,
                                        "x": 420,
                                        "y": 220,
                                        "wires": [
                                        [
                                        "1269b93.a703647"
                                        ],
                                        []
                                        ]
                                        },
                                        {
                                        "id": "e778d2c7.a6621",
                                        "type": "debug",
                                        "z": "b75d7881.80f448",
                                        "name": "",
                                        "active": true,
                                        "tosidebar": true,
                                        "console": false,
                                        "tostatus": false,
                                        "complete": "false",
                                        "statusVal": "",
                                        "statusType": "auto",
                                        "x": 900,
                                        "y": 220,
                                        "wires": []
                                        }
                                        ]

                                        07c5cc88-d8fa-416c-836a-581d0eb35d32-image.png

                                        mickym 1 Reply Last reply Reply Quote 0
                                        • mickym
                                          mickym Most Active @sascho last edited by mickym

                                          @sascho Hallo 😉 - wäre toll wenn Du den Code für den Flow in CodeTags packen würdest.

                                          Ich habe den klf200 Adapter ja leider nicht installiert - aber ich fürchte ich kann Dir nicht helfen. Weil ich hab einfach mal einen anderen Adapter mit Deinem Flow genommen und der funktioniert:

                                          Ich hab mal den Info Adapter neu gestartet.

                                          072935f6-009b-482b-9472-cd339f2d7e7c-image.png

                                          Schau mal ob Du andere Adapter neu starten kannst - ansonsten hast Du im System ggf. ein Berechtigungsproblem.

                                          Irgendwie als ob Dein NodeRed Adapter unter einer anderen Kennung läuft keine Ahnung.

                                          Eigentlich muss es so funktionieren. Evtl. ist an Deinem System was schief - da müsste ggf. unser Linux Guru helfen => @Thomas-Braun

                                          HIer gabs mal ein ähnliches Problem: https://forum.iobroker.net/topic/40916/docker-container-restart-iobroker-per-script/42?_=1632433048127

                                          Du kannst also mal probieren:

                                          sudo -u iobroker iobroker restart info.0
                                          

                                          funktioniert bei mir jedenfalls auch:

                                          14c8ad0b-be3c-49b1-9a29-b26553b2ecae-image.png

                                          S 1 Reply Last reply Reply Quote 0
                                          • S
                                            sascho @mickym last edited by

                                            @mickym

                                            Ich habs mal mit dem info Adapter probiert. Das funktioniert auch nicht, sieht so aus als wenn ich tatsächlich ein Berechtigungsproblem habe. Soll ich dann mal den Kollegen anklingeln? Die verlinkte Lösung sieht sehr kompliziert aus.

                                            b49e239b-2ee5-4d00-bf66-dd863573b205-image.png

                                            mickym 1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            723
                                            Online

                                            31.9k
                                            Users

                                            80.1k
                                            Topics

                                            1.3m
                                            Posts

                                            2
                                            121
                                            6556
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo