NEWS
Node Red und Blockly Scripte
-
Hallo,
ich experimentiere gerade etwas mit Node Red und Blockly Scripten herum.
Dabei würde ich gerne über einen Sprachbefehl (alexa) in Node Red ein Blockly Script auslösen.
Vielleicht kann mir jemand weiterhelfen wie dies Möglich ist.
Der Sprachbefehl funktioniert ohne Probleme. Jedoch ist es mir nicht bekannt wie ich mit Node Red ein Blockly Skript auslösen kann. -
@labamba Du schreibst einfach mit NodeRed in einen von Dir erstellten Datenpunkt, der wiederum ein Blockly triggert.
-
@mickym
Mit Node Red kenne ich mich leider noch überhaupt nicht aus. Wie schaut sowas aus?
Konkret will ich über einen Sprachbefehl, einen Raffstore auf eine Position und einen Öffnungswinkel fahren lassen. Das Skript dazu habe ich schon geschrieben.
Wie ich einen Sprachbefehl (alexa) in Node Red einfüge habe ich auch hinbekommen. -
@labamba Das heisst Du willst diese Information Position und Öffnungswinkel dem Blockly-Skript übergeben? Hast Du die beiden Informationen im NodeRed verfügbar? Oder geht es nur darum das Blockly zu triggern und das Blockly holt sich die Informationen Position und Öffnungswinkel selbst und verarbeitet es?
-
@mickym
Ich habe mir verschiedene Skripte für die Raffstorehöhe und den Öffnungswinkel geschrieben. Momentan sind diese über einen Button in Iobroker VIS ansteuerbar.
z.B. 20% geöffnet und 45° im Winkel.
Jetzt möchte ich dies über Node Red als Alexa Sprachbefehl integrieren. -
@labamba Ok - ich verstehe zwar immer noch nicht wie und was Du im NodeRed für Informationen hast und wie der Flow ausschaut. Aber erstelle einfach einen Datenpunkt unter 0_userdata.0 in den Du via iobroker-Out Node rein schreibst.
Sobald Du diese tust, triggerst Du Dein Blockly in dem Du Aktualisierungen in diesem Datenpunkt überwachst (triggerst).
-
@mickym
Ich verwende eine Shelly 2.5 dazu. Die Position (Höhe) steuer ich über einen http befehl an. Der Winkel wird über die Fahrzeit eingestellt. Das funktioniert im Moment nur über ein Blockly Skript.
Folglich wollte ich jetzt die verschiedenen Skripte mit unterschiedlichen Sprachbefehlen in Node-Red verbinden.
Komplett geöffnet oder geschlossen könnte ich auch direkt mit einem hhtp Befehl auslösen. Jedoch habe ich leider keine Ahnung wie dies in Node-Red funktioniert. -
@labamba sagte in Node Red und Blockly Scripte:
@mickym
Ich verwende eine Shelly 2.5 dazu. Die Position (Höhe) steuer ich über einen http befehl an. Der Winkel wird über die Fahrzeit eingestellt. Das funktioniert im Moment nur über ein Blockly Skript.
Folglich wollte ich jetzt die verschiedenen Skripte mit unterschiedlichen Sprachbefehlen in Node-Red verbinden.
Komplett geöffnet oder geschlossen könnte ich auch direkt mit einem hhtp Befehl auslösen. Jedoch habe ich leider keine Ahnung wie dies in Node-Red funktioniert.Ich hab das alles verstanden und hab Dir ja geschrieben wie es grundsätzlich funktioniert. Man könnte das auch alles direkt in NodeRed abbilden, aber das wollen wir ja nicht.
Wenn Dir meine Hilfestellung zu ungenau ist, dann musst Du mir halt genau Deinen Flow hier zeigen bzw. mir genau sagen, was aus den Alexa Nodes für Informationen herauskommen.Wie gesagt ist auch kein Problem http Befehle aus NodeRed abzusetzen, aber wenn Du das lieber in Blockly machst ist das alles OK - nur wenn Du schreibst:
Wie ich einen Sprachbefehl (alexa) in Node Red einfüge habe ich auch hinbekommen.
dann musst Du schon einen Flow haben und musst beschreiben können, was Du für Informationen Du aus dem Sprachbefehl bekommst. Poste halt mal Deinen Flow und exportiere ihn und stell ihn hier ein - wenn Du nicht weißt wie das geht, helfe ich Dir da auch gerne.
Im Prinzip schreibst Du Deine Info mit NodeRed in einen Datenpunkt:
Ich habe hier mal einen DP 0_userdata.0.target genommen.
Falls Du damit was in den Datenpunkt reingeschrieben hast, kannst Du damit Dein Bockly triggern:
Das target ist der Datenpunkt 0_userdata.0.target
-
@mickym
Ich habe es jetzt auch grundsätzlich verstanden und werde es mal Testen.DATENPUNKTE sind ja bereits angelegt.
Und dann so in Node Red anlegen
Werde es morgen mal testen ob es geht!
Du schreibst es könnte auch direkt in Node Red umgesetzt werden.
-
@labamba Mach mal zwischen den iobroker out Nodes und den Alexa Nodes noch eine Change Node in dem Du ein Boolean = true setzt. Deine Datenpunkte sind alles Buttons, bei den Du ein Betätigung durch ein true auslöst.
Schau dass Du ein Boolean und keinen String in den Datenpunkt sendest:
Achte auch darauf, dass im Adapter keine Stringkonvertierung eingeschaltet ist.
-
@mickym
Danke schon einmal für die Hilfe!
Werde es morgen mal testen.Wäre natürlich noch viel eleganter wenn über einen Sprachbefehl, die Position http-Befehl angesteuert werden könnte.
Bzw. bei den normalen Rollläden habe ich es auch so:
hinbekommen.Würde mich interessieren ob das mit dem Drehwinkel der Raffstore nach Zeit in Node Red auch ohne Skript umsetzbar ist.
-
@labamba Kurzfristig wird das denke ich wahrscheinlich funktionieren, wobei ich die komplette Steuerung relativ umständlich finde.
Mit den Buttons etc.
Die Steuerung ist ja nur dieser Part des Blocklies:
Du scheinst Deine Shellies also weder über den Adapter noch über MQTT, sondern direkt über die HTTP API steuern.
Also sollte ja mit den Prozentzahlen, das wahrscheinlich so gehen:
http://192.168.178.35/roller/0?go=to_pos&roller_pos=25
Im Prinzip ist ja für ein Gerät die URL gleich und nur der Prozentwert ist halt anders. Deswegen verstehe ich auch nicht, warum man da zig Buttons macht, anstelle einfach eine Prozentzahl in einen Datenpunkt zu schreiben bzw. auch bei Sprachbefehl halt - stelle auf x %.
Die URL um den Shelly mit HTTP zu steuern ist ja easy und habe ich ja oben schon gepostet.
Wenn also Prozentzahlen über ALexa oder was auch immer ankommt, lässt sich doch die URL dynamsich anstelle von fix zusammenstellen.Was Du mit Drehwinkel meinst - weiss ich gerade nicht - ist das der 2. Teil Deines Blocklies?
-
@labamba Zu dem 2. Teil des Blocklies - aber ich bin kein Blockly Spezialist:
... finde ich es nicht gut - buttons auf false zu setzen. Buttons sind Taster und sind stateless, dass heißt sie haben keinen Status. Ein Button oder Taster (also Lichtschalter als Taster) - drückst Du - dann wird true ausgelöst und triggert. Nach dem Trigger passiert nichts, bis wieder gedrückt wird - also wieder ein True kommt. Das heißt der Status eines Taster ist immer true und nie false. Es wird auf Aktualisierung getriggert, sprich wann wurde das true erneuert bzw. der Taster erneut gedrückt.
Bei dem Timer gehe ich mal davon aus, dass das nur ein Schutz ist, dass innerhalb der 5 Sekunden, in den sich die Lamellen ausrichten, nicht erneut getriggert wird. Das kann man im NodeRed einfacher über einen Trigger lösen.
Die Umsetzung dieses Blocklies in NodeRed würde ich halt so umsetzen:
Die iobroker In Node muss man halt noch umstellen, dass die am Anfang initialisiert wird. Das machte nur bei mir keinen Sinn, da ich ja keinen Shelly Adapter habe. Und bei mehreren Raffstores muss man natürlich eine Flowvariable pro Raffstore anlegen, damit sich das nicht gegenseitig beeinflusst.
Falls das tatsächlich nacheinander mit dem Close/Open und der Pause stattfinden soll, dass muss man es halt serialisieren.
und wenn man so was ganz elegant machen will - dann verpackt man das in einen Subflow - da sind dann auch die Flowvariable je Instanz initialisiert.
Damit brauchst Du dann nicht für jedes Raffrollo einen neuen Flow erstellen, sondern nutzt einfach diese neue Node:
damit kannst dann einfach diese Node an die States Deiner Raffstores anhängen. Die Datenpunkte zum Schreiben werden dann automatisch aus dem Topic ermittelt.
Hier der Flow mit den neuen Nodes:
Wichtig ist das halt vorher eine Initialisierung mit open oder close stattgefunden hat.
Ach und hab mir gerade Dein Blockly angeschaut - falls der Button und nicht der state triggern soll, dann muss man den Anfang halt noch umstellen. Das blicke ich bei den Blocklies nicht so ganz. Für mich sind das erst mal 2 unabhängige Trigger - einmal der Button Datenpunkt und einmal der State Datenpunkt des Shelly Adapters.
Bei den iobroker-IN Nodes zu den Shelly Datenpunkten - diese ggf. umstellen, dass sie nur Nachrichten durchlassen, wenn sich ein Wert ändert. Shellies sind ja in der Regel geschwätzig und habe keine Ahnung wie der Shelly Adapter das handhabt.
-
@mickym
Ich glaube ich muss erstmal eine Verständnisfrage klären.- Rolladen (Fährt nur auf und ab)
Sprachsteuerung:
Das habe ich hinbekommen diesen über NODE RED mit einer Prozentangabe zu steuern. Also kein Skript notwendig. Funktioniert top seit 1 Jahr!Die Rückantwort habe ich hier über mqtt direkt auf iobroker-vis (Handy oder Tablettsanzeige). Also eine Anzeige zwischen 0-100% für den Öffnungsgrad des Rollo. Also nicht mal node-red notwendig. Funktioniert top!
Handsteuerung:
Jedoch habe ich auch ein Tablet oder ein Handy. Hier habe ich mir zur Steuerung Buttons angelegt. Hinter diesen Buttons liegt ein Skript das ausgelöst wird.Funktioniert top seit 1 Jahr!
Die Rückantwort habe ich auch wieder über mqtt als Anzeige zwischen 0-100%.- Raffstore
Dieser Fährt nicht nur auf und ab (könnte über % in node red geregelt werden/ Teil 1 des Skript) sonder hat Lamellen die in der Position geändert werden können (-90° bis 90°). Dies ist aber nur über die genaue Fahrzeit möglich (Teil 2 meines Skriptes). EIne andere Möglichkeit habe ich nicht gefunden. Das Skript schaut da etwas exotisch aus, da ich immer erst zum gleichen Ausgangspunkt für den Drehwinkel fahre.
D.h. Fährt der Raffstore in Position von oben nach unten, ist der Winkel der Lammelen 90°.
Fährt der Raffstore von unten nach oben ist, ist der Winkel der Lammelen -90°C.
Folglich macht der Raffstore dann erst eine Drehung auf 90° und anschliesend wird der Winkel über die Fahrzeit eingestellt.
Habe schon ein paar Wochen rumgetüftelt bis es sehr zuverlässig lief.
Handsteuerung:
Genau wie bei den Rolläden liegt ein Skript hinter den Buttons das ausgelöst wird. Funktioniert top seit 1 Jahr!
Die Rückantwort habe ich auch wieder über mqtt als Anzeige zwischen 0-100%. Jedoch ist dies nur die Höhe des Raffstore. Denn Drehwinkel habe ich leider nicht geschafft mir ausgeben zu lassen. Wüsste gerade auch nicht wie.Sprachsteuerung:
Hieran arbeite ich ja gerade. Die Lösung über Skripte finde ich auch nicht so toll. Problem wird sein. Das für jedes Skript ein Sprachbefehl notwendig ist. Bei ähnlichen Sprachbefehlen nervt Alexa schon rum.
Eine Lösung über einen Sprachbefehl, einer Prozentangabe (höhe des Raffstore) und einer Zeiten Angabe (für den Drehwinkel) wäre schon wirklich nice.
Jedoch habe ich keinen Plan wie das in NODE RED gehen könnte.
Ich schaue mir aber mal an, was du mir da alles geschickt hast. Schon mal danke dafür.Allgemein: Für das Skript war es für mich sehr einfach den http Befehl für die Position, auf und ab zu verwenden. Läuft auch sehr zuverlässig!
Jedoch verwende ich grundsätzlich mqtt für die Shellys. -
https://forum.iobroker.net/assets/uploads/files/1642116367492-screen.png
Ich bin echt kein Script Experte und nehme gerne Verbesserungsvorschläge an. Ich habe leider nicht verstanden wie du dies im Script ändern würdest.
Bei dem Timer gehe ich mal davon aus, dass das nur ein Schutz ist, dass innerhalb der 5 Sekunden, in den sich die Lamellen ausrichten, nicht erneut getriggert wird. Genau so ist das gemeint. Jedoch schalte ich hier ja nichts mehr aus.
-
@labamba Also grundsätzlich ist das alles was ich sage, nicht als Kritik gemeint und wenn ich vermeintliche Verbesserungsvorschläge oder Alternativen vorschlage, habe ich vielleicht all Deinen Erfahrungsschatz nicht berücksichtigt.
Deine ursprüngliche Frage was ja wie Du NodeRed mit den Blocklies verbinden kannst und das habe ich ja am Anfang beantwortet und damit können wir es ja bewenden lassen.
Vielleicht habe ich halt nur ein Verständnisproblem oder keine Erklärung?
Also wenn ich sowas schrieb, wie:
Im Prinzip ist ja für ein Gerät die URL gleich und nur der Prozentwert ist halt anders. Deswegen verstehe ich auch nicht, warum man da zig Buttons macht, anstelle einfach eine Prozentzahl in einen Datenpunkt zu schreiben bzw. auch bei Sprachbefehl halt - stelle auf x %
Dann verstehe ich es halt nicht.
Wie gesagt, Du musst da nichts ändern oder gar als Angriff auf Deine Lösung sehen. Wenn Du zu Deiner Handsteuerung schreibst:
Handsteuerung:
Jedoch habe ich auch ein Tablet oder ein Handy. Hier habe ich mir zur Steuerung Buttons angelegt. Hinter diesen Buttons liegt ein Skript das ausgelöst wird.Funktioniert top seit 1 Jahr!
Die Rückantwort habe ich auch wieder über mqtt als Anzeige zwischen 0-100%.
dann meinte ich ja - ist doch gut, wenn Du aus Gründen der Bedienung hier Button nimmst, aber hätte man hinter diese Buttons nicht einfach Prozentzahlen in einen Datenpunkt schreiben können und das dann auswerten, anstelle für jeden Button in Deiner VIS einen eigenen Datenpunkt zu machen? Gibt ja vielleicht Gründe, die ich nicht verstehe.
Nun was ich auch nicht verstanden habe, wenn Du schreibst:
Allgemein: Für das Skript war es für mich sehr einfach den http Befehl für die Position, auf und ab zu verwenden. Läuft auch sehr zuverlässig!
Jedoch verwende ich grundsätzlich mqtt für die Shellys.
Liegt das generell daran, dass Du keine Kommandos über mqtt an Deine Shellies verschickst. Wie gesagt ist kein Problem wenn Du das über HTTP zu machen.
Über mqtt wäre es halt:
mit stop,close,open über das Topic:
shellies/shellyswitch25-<deviceid>/roller/0/command
bzw.
shellies/shellyswitch25-<deviceid>/roller/0/command/pos
gegangen - aber wie gesagt, es gibt mehrere Wege nach Rom und man kann das auch über http machen, dafür gibt es ja diese API.
So grundsätzlich gibt es für das Problem des Drehwinkels keine fertige Lösung, sondern ist ja gut, wie Du das mit Deinem Skript gelöst hast und ich habe ja Dein Skript nur in Node Red abgebildet (weil es Dich ja interessiert hat - ansonsten kannst Du ja wie gesagt über die Buttons einfach Deine Blocklies triggern, wie ursprünglich geplant).
Im Prinzip ist es - und das kann ich dann zum 2. Teil sagen - völlig egal, ob Du per Hand oder Sprachsteuerung Dein Raffstore steuerst, denn das Script wird ja durch den stop Status getriggert, um dann die Lamellen durch ein zeitliches Fahren in die Gegenrichtung die Lamellen auszurichten. Das habe ich schon verstanden und soweit auch mit dem Flow 1:1 umgesetzt - bis auf die Abprüfung eines Buttons. Das lässt sich, denke ich, auch nicht anders lösen. -
@labamba sagte in Node Red und Blockly Scripte:
https://forum.iobroker.net/assets/uploads/files/1642116367492-screen.png
Ich bin echt kein Script Experte und nehme gerne Verbesserungsvorschläge an. Ich habe leider nicht verstanden wie du dies im Script ändern würdest.
Bei dem Timer gehe ich mal davon aus, dass das nur ein Schutz ist, dass innerhalb der 5 Sekunden, in den sich die Lamellen ausrichten, nicht erneut getriggert wird. Genau so ist das gemeint. Jedoch schalte ich hier ja nichts mehr aus.
Nun die erste Bemerkung zielte nur darauf, dass man das im NodeRed mit dem vorigen Wert über eine Flow-Variable lösen muss, weil die iobroker-IN Nodes hier nicht die gleichen Informationen zu einem Objekt rausrücken, wie der Trigger in einem Blockly.
Die zweite Bemerkung - insbesondere nachdem Du bestätigt hast, dass es nur zum Schutz dienen soll, dass während der Ausrichtung der Lamellen durch deren Bewegung keine neuen Trigger entstehen sollen, warum Du hier einen Button noch abfrägst. Im Prinzip wäre es doch ausreichend, wenn man einfach in der Zeit alle Trigger in der Zeit der Lamellenausrichtung jedes weitere Triggern unterbinden würde - da spielt doch der Button keine Rolle mehr?
So habe ich es nun zumindest in dem NR Flow umgesetzt.Sprich ich verstehe einfach nicht, warum man den Button in dem Skript überhaupt braucht. Langt es nicht, dass das Skript einfach nicht ausgeführt wird, solange der Timer timeout aktiv ist (also die 5 sek.)?
In allen Fällen - egal ob mit Hand oder Sprachsteuerung - ist es doch so, dass mit dem stop im Status des Stores die Ausrichtung - sprich das kurze Anfahren in die Gegenrichtung eingeleitet wird.
-
@labamba sagte in Node Red und Blockly Scripte:
Sprachsteuerung:
Hieran arbeite ich ja gerade. Die Lösung über Skripte finde ich auch nicht so toll. Problem wird sein. Das für jedes Skript ein Sprachbefehl notwendig ist. Bei ähnlichen Sprachbefehlen nervt Alexa schon rum.
Eine Lösung über einen Sprachbefehl, einer Prozentangabe (höhe des Raffstore) und einer Zeiten Angabe (für den Drehwinkel) wäre schon wirklich nice.
Jedoch habe ich keinen Plan wie das in NODE RED gehen könnteNun verstehe ich auch nicht so ganz. Über die Prozentzahl kannst Du doch genauso wie bei den Rollläden die Öffnung bestimmen. Das Ausrichten erfolgt doch immer dann automatisch, wenn der state auf stop triggert?
OK wenn Du verschiedene Drehwinkel bei geschlossenem Raffstore erreichen willst, dann wird es natürlich schwierig und Du brauchst verschiedene Kommandos.
Aber egal wie, das mit der zeitlichen Steuerung lässt sich in NodeRed nahezu 1:1 wie in den Blocklies umsetzen. -
Leider hat es so nicht funktioniert. Das Skript wird nicht ausgelöst.
-
@labamba Ich gehe mal von der 1. Version aus, in dem Du mit true Deinen Taster auslöst. Auf dem Screenshot ist ja noch nicht deployed. Hast Du die Change Node auch wie unten konfiguriert. Sonst musst halt mit Debug Nodes kontrollieren. Kommt aus der Alexa Node überhaupt was raus?