ioBroker Blockly – Der ausführliche Leitfaden
Wer seinem Smart Home Leben einhauchen will, muss Abläufe programmieren. Diese Abläufe dienen dazu, dass die Technik selbstständig auf eintretende Szenarien reagieren kann. Das Problem dabei ist allerdings, dass nicht jeder die notwendigen Kenntnisse besitzt, um zu programmieren. Zwar kann im Grunde jeder diese Fähigkeit erlernen, das dauert aber mitunter Monate bis Jahre. Einfacher funktioniert die Programmierung des Smart Homes durch Blockly.
Blockly ist eine Bibliothek, die Webanwendungen sowie Android- und iOS-Apps einen visuellen Code-Editor zur Verfügung stellt (Quelle: Wikipedia). Erstellt werden kann die gewünschte Logik hierdurch auf einfache Art und Weise durch ein paar Mausklicks. Oft dient Blockly auch dazu, Programmierkonzepte auf eine einfache Art und Weise darzustellen. Die erstellten Konzepte werden entweder als JavaScript oder als Python exportiert.
Leider wird oft verwechselt, dass ioBroker Blockly nicht erfunden hat. Es handelt sich um eine Bibliothek, die frei genutzt und modifiziert werden kann. Aus diesem Grund war es auch möglich, dass OpenHAB seit der Version 3 auf diese Möglichkeit zur Erstellung von Skripten zurückgreift (Quelle: OpenHAB).
In diesem Artikel möchte ich mich gerne zusammen mit dir auf ioBroker Blockly konzentrieren. Ich zeige dir an konkreten Beispielen, wie Skripte aufgebaut sind und stelle dir die wohl wichtigsten Bausteine des Editors im Detail vor. Ergänzend dazu lasse ich hin und wieder Erfahrungen und Erkenntnisse aus der Softwareentwicklung einfließen.
Stay connected!
Das Smart Home ist ständig verbunden, warum nicht auch wir?
Folge mir auf der Plattform deiner Wahl.
Blockly – die unterschiedlichen Blöcke
Damit du in deiner Hausautomation verschiedene Szenarien umsetzen kannst, brauchst du verschiedene Blöcke. Diese Blöcke sind bereits vorgefertigt und werden durch dich in eine bestimmte Reihenfolge gebracht. Die fertige Reihenfolge ergibt dabei deine Logik. So ist es zum Beispiel durch die richtige Anordnung möglich, dass du auf Basis von Lichtwerten eine Lampe automatisch ein- und ausschalten kannst.
Wir schauen uns nun in den nachfolgenden Abschnitten die wohl wichtigsten Blöcke von Blockly an. Ich erkläre dir außerdem, was du mit diesen Blöcken anstellen kannst. Damit der Artikel nicht im Chaos endet, unterteile ich die Blöcke in die unterschiedlichen Kategorien. Diese Kategorien findest du in ioBroker auf der linken Seite, sobald du mit der Erstellung eines Skripts beginnst.
- 【All in One Control Panel】: Dies smart home control panel unterstützen die Steuerung aller...
- 【Nicht nur Smart Control Panel, sondern Zigbee Hub】: Fügen Sie Zigbee-Geräte schnell in...
- 【Gegensprechanruf, bequemere Kommunikation】: Mit eingebautem Mikrofon und Lautsprecher...
Zuletzt aktualisiert 2024-11-04 / (*) Affiliate Links / (**) Affiliate Links, Preis kann abweichen (andere Plattform) / Bilder von der Amazon Product Advertising API / Der angegebene Preis kann seit der letzten Aktualisierung gestiegen sein.
Trigger (Auslöser)
Ein Trigger steht in unserer Sprache für zwei verschiedene Sachverhalte. In der Elektrotechnik bezeichnet man entweder ein Bauelement zum Auslösen eines Vorgangs als Trigger oder einen Impuls, der wiederum einen Vorgang auslöst. Physiologisch spricht man von einem Trigger, wenn man einen auslösenden Reiz meint. Gemeinsam haben beide Definitionen, dass ein äußerer Umstand zur Ausführung einer bestimmten Reaktion führt.
Genauso ist es auch bei der Erstellung eines Skripts in ioBroker. Ein Trigger ist ein virtuelles Bauelement (in diesem Fall ein Baustein), das auf einen äußeren Einfluss reagiert. Dabei ist ein äußerer Einfluss meist die Zustandsänderung eines bestimmten Datenpunkts. Zum Beispiel reagiert der Trigger, sobald die Wetterstation einen neuen Wert für die Lichtverhältnisse um das Haus herum meldet. Sobald der Trigger ausgelöst wird, beginnt ioBroker mit der Abarbeitung deines Skripts.
Zur Verfügung stehen dir in ioBroker dabei unterschiedliche Bausteine. Ein Trigger kann so beispielsweise die Änderung eines Datenpunkts sein (wie bereits erwähnt), der Auf- oder Untergang der Sonne sowie ein definierter Zeitplan. Zeitpläne werden meist im sogenannten CRON-Format angegeben, das durch Unix-Systeme bekannt ist. Durch die intelligente Erweiterung von Blockly musst du dabei nur angeben, wann dein Trigger ausgeführt werden soll und Blockly kümmert sich um die korrekte Formatierung deines Zeitplans.
Üblicherweise beginnt jedes Skript mit der Auslösung eines Triggers, weshalb das der wohl wichtigste Baustein in Blockly ist. Um allerdings nicht auf jede Art von Zustandsänderungen zu reagieren, können Zustände durch Abfragen verfeinert werden. Dazu kommen wir im Unterabschnitt Logik.
System – Auslesen von Zuständen
Im Abschnitt System findest du unterschiedliche Bausteine, die zum Auslesen vorhandener Datenpunkte in ioBroker dienen. Dabei kannst du sehr genau wählen, was aus einem Datenpunkt ausgelesen werden soll. Mithilfe der System-Blöcke kannst du deine Trigger ergänzen. Hier gibst du an, auf welchen Datenpunkt dein Trigger hören soll, indem du zum Beispiel den Block Wert vom Objekt ID auswählst.
Andere Blöcke in diesem Bereich sind der Debug Output sowie der Kommentar. Debugging-Statements werden dann benutzt, wenn du zum Beispiel den Inhalt einer bestimmten Variable zu Testzwecken auslesen möchtest. Dabei musst du deinen Skript-Editor auf den Debug-Modus umstellen, was du im Fenster oben rechts erledigen kannst. Bei der Ausführung des Skripts wird dir nun in der Konsole unterhalb des Skript der gewünschte Wert angezeigt. Für produktive Zwecke ist der Debugging-Modus nicht erlaubt und auch nicht zu empfehlen.
Mit dem Kommentarblock kannst du deine Skripte besser strukturieren und mit zusätzlichen Hinweisen versehen. Zum Beispiel kannst du so angeben, dass es sich um einen bestimmten Teil des Skripts handelt oder weitere Notizen hinzufügen, die dir beim Bearbeiten helfen.
Grundsätzlich nutzt du die Systemblöcke genau dann, wenn eine Interaktion zwischen Skript und Datenpunkten stattfinden soll. So lassen sich mit diesen Blöcken nicht nur Werte auslesen, sondern auch gezielt Zustände manipulieren. Sobald du einen Datenpunkt eines bestimmten Geräts manipulierst (also änderst), reagiert dieses Gerät auf die gewünschte Weise. Änderst du bei einer Lampe den Wert von falsch auf wahr, wird sie in der Regel eingeschaltet. Umgekehrt wird sie ausgeschaltet.
Logik – der elementare Bestandteil
Kommen wir nun zu einem der weiteren wichtigen Bausteine deines Skripts. Mithilfe von Blöcken aus der Kategorie Logik kannst du bestimmte Ereignisse abfangen oder überprüfen. Wie du sicherlich selbst schon gesehen hast, ist die Anzahl der Blöcke dabei recht überschaubar. Doch diese begrenzte Anzahl von Blöcken genügt schon, um wirklich komplexe Logiken abbilden zu können.
Nach der Erstellung eines Triggers, willst du in vielen Fällen auf einen konkreten Zustand überprüfen. Sofern du das nicht bereits schon im Trigger erledigt hast, kannst du das mit der Überprüfung falls … mache erledigen. Diese Überprüfung entspricht grob gesagt dem Konstrukt if-then-else aus der Softwareentwicklung.
Lass mich ein konkretes Beispiel dafür machen. Nachdem du einen Trigger auf einen bestimmten Datenpunkt gelegt hast, möchtest du gerne wissen, ob dieser auf wahr gesetzt wurde. Dazu bedienst du dich dem Falls-Mache-Block. Diesem ordnest du dann aus der Kategorie System den Block Wert von Objekt ID zu. Ohne einen weiteren Block wird nun geprüft, ob der enthaltene Wert wahr bedeutet. Solltest du auf einen anderen Zustand überprüfen wollen (z. B. einen Text), musst du hingegen den Block für Vergleiche (=) nutzen. Dort kannst du weitere Werte überprüfen, die sich nicht direkt in wahr oder falsch einteilen lassen.
Ohne eine zusätzliche Eingabe prüft der Falls-Mache-Block immer auf einen Wahrheitswert. Das bedeutet, dass überprüft wird, ob der Inhalt der übergebenen Variable wahr ist. Das ist er lediglich bei einem Vergleich oder wenn die angegebene Variable wahr/falsch enthält.
Weitere Blöcke aus der Kategorie System sind jene, die ebenfalls Überprüfungen durchführen. Allgemein gesagt brauchst du diese Kategorie also genau dann, wenn du Werte miteinander vergleichen möchtest oder auf einen bestimmten Zustand reagieren möchtest. Zusammen mit den Triggern und den System-Blöcken bilden sie damit die wohl wichtigsten Blöcke des gesamten Editors.
Aktionen – externe Dienste nutzen
In der Kategorie Aktionen findest du Blöcke, die zur Anbindung fremder Systeme dienen können. In meinem Fall gibt es dort genau zwei verschiedene Blöcke. Der erste Block enthält einen sogenannten exec-Befehl, der zweite einen Request.
Exec-Befehle werden genutzt, um zum Beispiel Skripte auf dem Rechner aufzurufen, auf dem ioBroker läuft. So kannst du auch das System selbst automatisieren, wenn es dafür keinen geeigneten Adapter gibt. Exec-Befehle können außerdem dazu nützlich sein, wenn du Systembefehle ausführen möchtest. Ein möglicher Systembefehl ist zum Beispiel der Neustart des Rechners. Allerdings wird hierbei auch ioBroker neu gestartet, wodurch dir kurzzeitig die Kontrolle über den Rechner fehlt.
Requests brauchst du hingegen, um Anfragen an externe Systeme zu stellen. Du kannst beispielsweise verfügbare Schnittstellen abrufen, für die es in ioBroker keinen passenden Adapter gibt. Das ist meist dann der Fall, wenn bislang noch niemand einen Adapter entwickelt hat oder du ein eigenes System einsetzt. Requests werden dabei oft an sogenannte REST-Schnittstellen gerichtet, über die eine Interaktion mit einem Fremdsystem erfolgen kann.
Sicherlich handelt es sich bei den Aktionen-Blöcken um jene, die du nicht allzu häufig brauchen wirst. Hier wird oft erst dann ein Bedarf erkannt, wenn du im Thema Programmierung bereits etwas fortschrittlicher unterwegs ist. Zum Steuern von Geräten innerhalb von ioBroker werden schließlich die System-Blöcke verwendet.
Sendto – Nachrichten versenden
Kommen wir nun zu den Sendto-Blöcken. Sie dienen dem Versand von Nachrichten an andere Systeme. Dabei wird diese Kategorie dynamisch erweitert, je nachdem über welche Adapter du verfügst. Ich habe in meinem Fall Blöcke für die Vernetzung von Telegram, Google Home und E-Mail.
Je nachdem, welchen Block du in dein Skript integrierst, musst und kannst du verschiedene Werte angeben. Zum Beispiel erwartet der Block Aussprechen die Eingabe eines definierten Textes. Der Block E-Mail hingegen einen Text sowie einen Empfänger, an den die Nachricht zugestellt werden soll. Der Block Telegram ist etwas flexibler. Mit ihm kannst du einen vordefinierten Text angeben, der entweder an mehrere oder genau einen Empfänger zugestellt wird. Aus diesem Grund ist bei diesem Block das sogenannte Attribut Empfänger lediglich ein optionales Attribut.
Übrigens, unter einem Attribut versteht man generell ein Wesensmerkmal. Jeder Block verfügt aufgrund seines jeweils eigenen Einsatzorts über eigene Wesensmerkmale. Einige dieser Wesensmerkmale können optional sein, andere sind notwendig. Du kannst dir das vorstellen wie bei einer E-Mail. Während der Empfänger kein optionales Wesensmerkmal ist, können E-Mails hingegen ohne Betreff versendet werden. Der Betreff ist damit ein optionales Wesensmerkmal. Genauso verhält es sich bei den verschiedenen Blöcken, die dir im System zur Verfügung stehen.
Die Kategorie Sendto ist demnach dein Freund, wenn du Nachrichten versenden möchtest. Welcher Kanal dabei verfügbar ist, hängt von den installierten Adaptern ab und kann von dir bewusst beeinflusst werden. Möchtest du zum Beispiel Nachrichten über Telegram versenden, musst du diesen Adapter installieren und einrichten.
Datum und Zeit
Die Kategorie Datum und Zeit dient der Verarbeitung von Uhrzeiten und Daten (ja, Daten ist die Mehrzahl von Datum). Dabei kannst du zum Beispiel einen Block dafür verwenden, wenn du Uhrzeiten miteinander vergleichen möchtest. Ebenso funktioniert das mit einem Datum.
Alternativ kannst du die Blöcke natürlich auch dann verwenden, wenn du das aktuelle Datum oder die aktuelle Uhrzeit für eine deiner Regeln verwenden möchtest. Allgemein gesprochen liefern dir die Blöcke aus dieser Kategorie sämtliche Informationen zurück, die Datum und Uhrzeit betreffen. Doch nicht nur Informationen dafür stehen zur Verfügung. Du kannst dir auch Informationen zunutze machen, die den Sonnenaufgang oder -untergang bestimmen. Hierfür steht ebenso ein entsprechender Block zur Verfügung.
Besonders an diesen Blöcken ist, dass du die Formatierung bestimmen kannst. Zum Beispiel können das Datum und die Uhrzeit so im US-amerikanischen Format, aber auch im europäischen Format ausgegeben werden. Je nachdem, wie du damit arbeiten möchtest oder aus welchem Teil der Welt du kommst. Dabei formatiert ioBroker in der Regel bereits das Datum auf Basis der Angaben in deinem System. Wenn dein System zum Beispiel auf Deutsch eingestellt ist, wird das Datum entsprechend den Vorgaben für Deutschland formatiert. Im US-amerikanischen Raum eben in einem anderen Format.
Konvertierung – ein anderes Format
Konvertierungen dienen im Allgemeinen dazu, Daten in ein anderes Format umzuwandeln. Ein Computer kann zum Beispiel nicht mit Texten rechnen, mit Zahlen allerdings schon. Wenn nun eine Eingabe als Text (auch String genannt) vorliegt, muss diese Eingabe in eine Zahl umgewandelt werden. Das geschieht mit dem passenden Block.
Du kannst vorhandene Daten allerdings auch in Logikwerte, Texte, Datum/Zeit oder JSON umwandeln. Je nachdem, welche Daten du vorliegen hast, musst du eine entsprechende Konvertierung verwenden. In der Regel ist es aber glücklicherweise so, dass die Datenpunkte bereits Daten im richtigen Format liefern und du eher selten eine Konvertierung vornehmen musst.
Zur Konvertierung sei außerdem noch gesagt, dass es sich bei JSON um ein Datenformat handelt. JSON steht für JavaScript Object Notation und ist ein Format, in dem verschiedene IT-Systeme Daten austauschen können. Schnittstellen, die du in dein Smart Home integrieren kannst verwenden ebenfalls häufig JSON.
Wie du dir nun sicherlich denken kannst, hat auch JSONata etwas mit JSON zutun. Mit JSONata kannst du gezielt Daten in einem sogenannten JSON-Objekt oder JSON-Array abfragen. Auch hier wirst du vermutlich erst dann mit dem Block in Berührung kommen, sobald du etwas fortgeschrittener bist und erste Erkenntnisse zur Vernetzung von Systemen hast. Am Anfang ist ein Berührungspunkt eher unwahrscheinlich.
Timeouts – die Ausführung stoppen
Timeouts weisen deinen Computer dazu an, eine kurze Pause einzulegen. Dabei wird allerdings nicht das komplette System gestoppt, sondern lediglich dieses eine Skript, in das du einen Timeout einbaust.
Die verschiedenen Blöcke dienen dabei unterschiedlichen Verwendungszwecken. Während ein einfacher Pause-Block das gesamte restliche Skript verzögern, kannst du mit Ausführen in bestimmen, welcher Teil deines Skripts eine Pause einlegen soll. Hilfreich ist eine Pause in der Regel dann, wenn du zum Beispiel auf einen noch ausstehenden Wert warten möchtest. Ein Beispiel hierfür ist die Antwort eines Geräts auf die Ausführung eines Befehls.
Sobald du einen Timeout verwendest und ihm einen Namen gibst (Variable timeout), kannst du diesen Timeout ganz gezielt stoppen. Dies geschieht mit den Blöcken Stop. Sie können für dich den von dir angegebenen Timeout-Block abbrechen.
Ich persönlich habe Timeouts eher selten und nur in speziellen Ausnahmefällen im Einsatz. Ich vermute daher, dass auch du eher seltener mit diesen Blöcken in Berührung kommen wirst. Es kann allerdings in verschiedenen Situationen hilfreich sein. Besonders dahingehend, dass ioBroker asynchron arbeitet. Asynchron bedeutet, dass parallel mehrere Befehle ausgeführt werden und du daher nicht genau weißt, wann ein bestimmtes Ergebnis vorliegt. Durch die Einführung einer Pause kannst du dieses Problem auf einem eher uneleganten Weg umgehen.
Timeouts können allerdings auch genutzt werden, um zum Beispiel eine Lampe nach einer vordefinierten Anzahl von Minuten automatisch wieder auszuschalten. Ich nutze genau diese Funktion zum Beispiel für meine automatische Beleuchtung, so dass diese nach einer vordefinierten Zeit wieder ausgeschaltet wird und nicht die ganze Nacht am Leuchten ist. Die Zeit kannst du dabei in Millisekunden, Sekunden, Minuten oder Stunden angeben.
Schleifen
Nun kommen wir zu den Schleifen. Diese benutzt du, wenn du eine bestimmte Aktion mehrfach ausführen möchtest. Dabei kannst du die gewünschte Aktion innerhalb der Schleife definieren und sie wird dann entsprechend oft ausgeführt. So musst du denselben Block nicht mehrfach definieren, um ein bestimmtes Ergebnis zu erreichen.
Schleifen werden auch dann gebraucht, wenn du mehrere Werte bearbeiten oder überprüfen möchtest. Zum Beispiel kommt das vor, wenn du mit Datenpunkten arbeitest, die über den Typ Array verfügen. Ein Array ist dabei ein definierter Speicher, der mehrere Elemente enthält. Mit einer Schleife kannst du so jeden einzelnen Wert durchgehen, ohne hierfür händisch auf die jeweiligen Bereiche zugreifen zu müssen.
Ein hilfreicher Block in der Kategorie Schleifen ist außerdem der, um Schleifen abzubrechen. Mit diesem Block kannst du die Ausführung der aktuellen Schleife abbrechen, sobald zum Beispiel eine bestimmte Bedingung eingetreten ist. Am Ende einer Schleife wird diese allerdings von allein beendet und du musst dich nicht um die Beendigung kümmern.
Ich selbst habe in ioBroker noch nicht allzu oft mit Schleifen arbeiten müssen. Aus eigener Erfahrung weiß ich allerdings, dass Schleifen nicht immer ganz einfach zu handhaben sind und auch zu viel Frust führen können. In diesem Fall kann dir das Debugging weiterhelfen, das ich dir bereits weiter oben kurz beschrieben habe.
Mathematik
Wie die Kategorie Mathematik bereits verrät, kannst du mit diesen Blöcken bestimmte Rechenoperationen durchführen. Dabei kannst du zum Beispiel Werte aufsummieren oder subtrahieren. Meist werden diese Blöcke dann benötigt, wenn du mit Datenpunkten arbeitest, die über den Datentyp Zahl verfügen.
ioBroker bietet dir mit diesen Blöcken außerdem unterschiedliche Hilfestellungen, um zum Beispiel Zahlen zu runden oder eine Variable um genau 1 zu erhöhen, was besonders bei Schleifen hin und wieder einmal gebraucht wird. Du kannst dir außerdem eine Zufallszahl generieren lassen, die dann in einem weiteren Teil deines Skripts überprüft wird.
Mithilfe der Zufallszahlen lassen sich clevere Automationen erstellen, die nicht vorhersehbar sind. Sie sind demnach gerade dann hilfreich, wenn du zum Beispiel Lampen automatisiert nach dem Zufallsprinzip einschalten möchtest. Eine Zufallszahl (0 oder 1) steht dabei jeweils für eine Lampe, die durch eine Überprüfung (Logik-Blöcke) entsprechend ausgewertet wird. Im Falle einer 0 kann ioBroker dir zum Beispiel die Lampe im Wohnzimmer einschalten, während bei einer 1 die Lampe in der Küche eingeschaltet wird.
Im Allgemeinen kannst du die Blöcke dieser Kategorie also genau dann nutzen, wenn du mit Zahlen arbeitest und auf Basis dieser Automationen erstellen möchtest oder Auswertungen durchführen willst.
Text
Nun sind wir bereits bei der Kategorie Text angelangt, die vermutlich eine der häufiger genutzten Blöcke beinhaltet. Mit den Blöcken aus der Kategorie Text kannst du verschiedene Texte zusammenbauen oder mit Texten umgehen. Zum Beispiel lassen sich mit dem Block erstelle Text aus wunderbare Nachrichten für Telegram zusammenbauen. Dabei kannst du als Input sowohl andere Texte, als auch Zahlen nutzen. Alle eingegebenen Informationen werden dabei automatisch in einen Text (String) umgewandelt und von diesem Block ausgegeben.
Für mich persönlich ist genau das ein hilfreicher Anwendungsfall, wenn ich zum Beispiel Informationen aus Variablen mit ergänzenden Informationen verschicken will. Ich baue mir dann mich dem Block erstelle Text aus die passende Nachricht und versende sie mit einem Sendto-Block an mein Smartphone oder Tablet.
Alternativ kannst du natürlich vorhandene Texte umwandeln oder an andere Texte anhängen. Es ist auch denkbar, dass du Texte auf bestimmte Muster oder Buchstaben durchsuchst. So lässt sich zum Beispiel eine Automation auf Basis einer Nachricht einrichten, die du von deinem Smartphone an ioBroker versendest.
Ebenso hilfreich kann der Block Länge von sein. Dieser gibt die Anzahl der Zeichen innerhalb eines Texts zurück. So lässt sich zum Beispiel feststellen, ob ein Text mehr als 2 Buchstaben hat und einer Überprüfung wert ist.
Was du aus den Blöcken Text gestaltest, kann vielseitig sein. In der Regel verwendest du diese Blöcke genau dann, wenn du über ein anderes System Informationen ausgeben willst oder vorhandene Texte auf bestimmte Muster überprüfen möchtest. Dabei musst du natürlich beachten, dass ein Computer nicht mit Texten rechnen kann und du das bei der Erstellung deines Skripts entsprechend bedenkst.
Listen
Listen dienen im Allgemeinen dem Speichern von mehreren Werten. Sie existieren in der Softwareentwicklung entweder als richtige Listen oder als sogenannte Arrays. Der Hauptunterschied besteht darin, dass eine Liste variabel erweitert werden kann und ein Array eine vordefinierte Größe besitzt. Wie du demnach an den Blöcken bereits festmachen kannst, handelt es sich bei ioBroker um Arrays und keine wirklichen Listen. Du musst also beim Erstellen einer Liste schon wissen, wie groß sie werden soll oder eine neue Liste mit den alten und neuen Werten erstellen, die du festhalten möchtest.
Beim Einsatz von Listen kommen nicht selten auch Schleifen zum Einsatz, um mit jedem Wert in einer Liste eine bestimmte Aktion durchzuführen. Du kannst mit den vorhandenen Blöcken auch die sogenannte Länge bestimmen. Unter der Länge versteht man dabei die Anzahl der enthaltenen Elemente.
Wer bereits erste Erfahrungen mit der Programmierung gemacht hat weiß eventuell, dass das erste Element in einer Liste nicht mit dem Wert 1, sondern mit dem Wert 0 abgefragt wird. Die Nummerierung erfolgt dabei von 0 – x, wobei x für die Länge der Liste steht. Blockly macht es aber gerade den Anfängern sehr einfach und beginnt bei der Nummerierung tatsächlich mit der 1, was später im Code entsprechend korrekt übersetzt wird. Wenn du demnach das erste Element abfragen möchtest, greifst du tatsächlich mit der Zahl 1 auf das erste Element zu.
Blöcke aus der Kategorie Listen dienen außerdem dazu, weitere Teillisten zu erzeugen. Beispielsweise können so die ersten drei Elemente aus einer Liste gezogen und für die Weiterverarbeitung zwischengespeichert werden. Listen lassen sich außerdem nach verschiedenen Kriterien sortieren, um die Daten besser verarbeiten zu können.
Farbe
Die Kategorie Farbe beinhaltet verschiedene Blöcke zur Nutzung von Farben. Das ist darauf zurückzuführen, dass der Computer Farben an sich nicht erkennen kann. Stattdessen erhält jede Farbe eine einzigartige Nummer, anhand der sie identifiziert und weiterverarbeitet werden kann. Die Blöcke aus der Kategorie Farbe helfen dir dabei, dass du dir diese Nummern nicht merken musst.
So kannst du zum Beispiel mit dem ersten Block eine bestimmte Farbe auswählen, die intern in den richtigen Farbcode übersetzt wird. Ebenso kannst du dir zufällige Farben oder bestimmte Mischungen erstellen lassen. Besonders hilfreich ist das dann, wenn du Lampen ansteuern willst.
Durch die Vorschau der Farbe ist es für dich zudem leichter, dass du die richtige Farbe auswählst.
Ansonsten bleibt in dieser Kategorie gar nicht so viel zu erklären. Du nutzt diese Blöcke genau dann, wenn es (Achtung, Überraschung) um Farben geht. In der Regel kommt das vor, wenn du dich um die Steuerung der Lampen in deinem Smart Home kümmerst und zum Beispiel bestimmte Farbszenen in Automationen einbauen möchtest.
Variablen
Bei der vorletzten Kategorie angekommen, wird es noch einmal wichtig.
Mit Variablen kannst du dir bestimmte Werte zwischenspeichern. Dabei sind Variablen auf das Skript begrenzt, in dem sie erstellt und genutzt werden. Das bedeutet für dich konkret, dass du die erstellten Variablen nicht in anderen Skripten nutzen kannst und sie sich daher nur für die temporäre Zwischenspeicherung von Werten eignen. Möchtest du hingegen Informationen über das Skript hinaus speichern und eventuell an anderer Stelle verwenden, muss die Speicherung über Datenpunkte geschehen.
Datenpunkte stehen im Gegensatz zu Variablen im gesamten System zur Verfügung und können außerdem bei einer Änderung in einer Datenbank gespeichert werden.
Nun fragst du dich sicherlich, wofür du Variablen verwenden kannst. Auch hier greife ich wieder auf ein Beispiel zurück. Stell dir vor du durchläufst eine Schleife auf der Suche nach einem ganz bestimmten Wert. Sobald du ihn gefunden hast, möchtest du mit diesem Wert gerne etwas machen. Damit nach dem Durchlauf der Schleife der Wert nicht vergessen ist, speicherst du ihn dir in einer Variable, um nach dem Durchlauf der Schleife darauf zurückzugreifen. Der ideale Speicherplatz für diesen Wert ist eine Variable, da sie nach dem Durchlaufen des Skript wieder gelöscht wird und somit nicht dauerhaft Speicherplatz verbraucht.
Würde eine Variable hingegen dauerhaft gespeichert werden, würde sie auf deinem PC Speicher benötigen. Das ist zwar nicht viel, kann in der Masse jedoch große Auswirkungen haben. Speichere Variablen daher nur dann in Datenpunkten, wenn die Werte wichtig sind und für andere Skripte zur Verfügung stehen müssen.
Zuletzt aktualisiert 2024-10-10 / (*) Affiliate Links / (**) Affiliate Links, Preis kann abweichen (andere Plattform) / Bilder von der Amazon Product Advertising API / Der angegebene Preis kann seit der letzten Aktualisierung gestiegen sein.
Funktionen
Gibt es nun noch etwas, das du mit den bisherigen Blöcken nicht tun konntest? Dann sind eventuell die Funktionen genau das richtige für dich.
Mit den Blöcken aus der Kategorie Funktionen bist zu beispielsweise in der Lage dazu, eine bestimmte JavaScript-Funktion auszuführen, die bisher in keinem Block vertreten ist. Damit ermöglichen dir diese Blöcke eine große Freiheit und können dazu genutzt werden, deine Skripte um weitere Funktionen zu ergänzen.
Ich kann dir aus eigener Erfahrung allerdings sagen, dass du mit den vorhandenen Blöcken wohl nahezu alles abdecken kannst und nur selten auf andere Funktionen zurückgreifen musst. Sollte es doch mal vorkommen, verfügst du vermutlich schon über genug wissen, um deine Skripte selbst zu programmieren. In diesem Fall wirst du höchstwahrscheinlich nicht auf diesen JavaScript-Block übergehen, sondern die Erstellung von Skripten im JavaScript-Editor nutzen. Dieser kann als Alternative zu Blockly genutzt werden und gestattet natürlich weitere Freiheiten.
Zusammenfassend
Blockly ist ein großartiges Tool für die Erstellung von Skripten für das Smart Home. Gerade Anfängern wird es so ziemlich leicht gemacht, ihre eigenen Automationen zu erstellen. Dabei ist Blockly allerdings nicht ganz so einfach, wie man vielleicht zuerst vermuten mag. Auch ich als Softwareentwickler habe manchmal meine Schwierigkeiten mit dieser Bibliothek, da ich es gewohnt bin, meinen Code selbst zu schreiben und dazu schon die richtigen Befehle im Kopf habe.
Du musst außerdem wissen, dass du für das Nutzen von Blockly zumindest über ein grundlegendes Verständnis der Blöcke verfügen musst. Kein Tool dieser Welt nützt dir etwas, wenn du nicht weißt, was die einzelnen Blöcke tun. Daher ist es in meinen Augen sehr wichtig, dass du dich im Voraus mit der Funktionsweise beschäftigst und dir eventuell ein paar Skripte ansiehst. Wenn du diese dann noch versuchst zu verstehen, bist du auf einem guten Weg.
Trotz schöner Farben und einfacher Mausklicks bleibt in ioBroker Blockly eins: Ein Tool, um Skripte zu erstellen, die im Normalfall nicht in 5 Minuten zusammengeklickt sind. Die eigene Hausautomation an die eigenen Wünsche anzupassen ist Arbeit und darf nicht auf die leichte Schulter genommen werden.
Sie sehen gerade einen Platzhalterinhalt von YouTube. Um auf den eigentlichen Inhalt zuzugreifen, klicken Sie auf die Schaltfläche unten. Bitte beachten Sie, dass dabei Daten an Drittanbieter weitergegeben werden.
Mehr Informationen
16 Kommentare
Michael · 3. Juni 2024 um 17:25
Hallo Lukas,
mir geht es bei meiner Frage NICHT um die programmiertechnischen Aufgaben oder wie man sie mit den Blockly-Tools lösen kann.
Mir geht es um das Editieren im iOBroker-Blockly: Beispielsweise Kopieren einer ganzen Blockly-Funktion, die ich geschrieben habe und Einfügen in ein anderes Script: An welche Stelle? Wie steuert man den Cursor IM Blockly-Editor?
Oder andere Aufgabe: Ich möchte eine ganze Blockly-Funktion am Anfang des Scripts ans Ende des (langen) Scripts ziehen: Das geht nicht oder nur sehr mühsam.
Funktionen wie man sie bspw in einem Texteditor hat, gibt es anscheinend im iOB-Blockly-Editor nicht. Oder habe ich sowas wie Cut and Paste und Drag und Drop noch nicht gefunden?
Ich spreche hier wohlgemerkt von aufwändigen damit langen Blockly-Scripten: In kurzen ist das ja kein Problem.
Hast Du da bitte einen Ratschlag?
LG
Micha
Lukas · 3. Juni 2024 um 18:21
Hi Michael,
grundsätzlich hast du im Blockly keinen richtigen Cursor. Das bedeutet, dass du kopierte Elemente in einem anderen Skript dort wiederfindest, wo sie im alten Skript waren. Das sind teils sehr wirre Orte, weshalb du im Nachgang immer dazu gezwungen bist, die Elemente richtig anzuordnen. Zumindest ist das mein aktueller Wissensstand.
Wenn du Teile eines Skript verschieben möchtest, dann musst du immer eines Bedenken. Sobald ich im Blockly einen Teil des Skript auswähle und kopiere oder verschiebe, dann werden automatisch auch die „darunter liegenden“ Teile des Skripts verschoben.
Zum Beispiel wenn du innerhalb einer Wenn-Dann-Funktion einen einzigen Block hast und den verschieben willst, dann nimmst du nur diesen. Verschiebst du hingegen das äußere Wenn-Dann, wird auch der andere Block darin verschoben.
Den einzigen Workaround den du hier machen kannst, ist das alles im Export des Blockly zu verschieben. Das ist aber alles andere als ein Spaß, glaub mir.
Ganz grundsätzlich kann ich dir nur einen wichtigen Ratschlag im Hinblick auf diese Situation geben: Teile und herrsche.
Konkret bedeutet der Ansatz, dass du dein Blockly in kleinere Teile unterteilst, um genau diese Situation zu vermeiden. Das ist nicht immer leicht (manchmal sogar nicht möglich), aber der beste Ansatz.
Du kannst zum Beispiel ein Skript nutzen, das Daten in einen Datenpunkt schreibt. Ein anderes reagiert dann auf die Änderung und führt sein eigene Aufgaben aus. So entsteht ein Geflecht an Skripten, die miteinander arbeiten, voneinander aber nichts wissen.
Um dafür die grundlegende Aufteilung zu machen, kannst du dich im Skript von innen nach außen arbeiten. Du siehst zum Beispiel auch beim Anklicken eines Blocks, welche Teile er umschließt. Die werden dann ebenfalls mit kopiert oder verschoben.
Einen anderen Tipp habe ich da an der Stelle leider aktuell nicht. Tut mir leid.
Smarte Grüße
Navlis · 22. August 2022 um 07:19
Hallo, ich suche eine Erklärung wie ich z.b. meinen anwesenheits Status protokollieren kann also ich frage über die fritzbox ab ob ich zuhause bin oder halt nicht das klappt auch super jetzt würde ich aber gerne in einem Datenpunk abspeichern wann ich gekommen bin und wann ich gegangen bin mit halt dem wort anwesend / abwesend und ne Uhrzeit dahinter so dass ich den datenpunkt in meiner vis nutzen kann.
Habe da was gebastelt mit der listen Funktion allerdings ist meine Liste jetzt schon ewig lange und ich brauche aber nur so ungefähr die letzten 10 Aktivitäten?? Wie bekomme ich das mit dem Listen Baustein hin
Besten Dank für Ihre Bemühungen im voraus;)
LG silva.
Lukas · 22. August 2022 um 09:54
Hallo Silva,
wenn du grundsätzlich schon was gebastelt hast, ist das super!
Du kannst jetzt in Blockly eine Variable erstellen, den Inhalt des Datenpunkts reinladen und dann die Liste kürzen. Plus eben der neue Eintrag, den du hinzufügen möchtest.
Das bedeutet, dass bei jedem Durchlauf die Liste auf deine gewünschte Länge reduziert wird und du diesen neuen Wert (also die neue Liste) dann in den Datenpunkt schreibst.
Somit würde sich die Liste automatisch bereinigen, du kannst sie jederzeit kürzen oder verlängern und hast weniger „Datenmüll“ im System.
Smarte Grüße
Sven · 20. Juni 2023 um 19:00
Hi Lukas ,
Coole Seite mit deiner Erklärung über iobroker und blockly. Weiterso 👍
Nun zu meinem Problem in dem du mir eventuell eine Lösung bietest.
Es soll eine Pumpe gesteuert werden mit den Werten Watt aus einer PV Anlage ; Uhrzeit und Zeitablauf x.
Am nächsten Tag soll dies wiederholt werden. Das eigentliche Problem ist das mit den Werten der pv.
Ich habe schon etliches probiert aber leider vergebens.
Das endresultat ist nun eine einfache zeitsteuerung von bis ohne zu wissen ob pv Anlage Dampf hat oder nicht 🙈
Besten Dank für deine Antwort
Eine schöne Woche
Beste Grüße Sven
Lukas · 21. Juni 2023 um 12:39
Hallo Sven,
danke für dein positives Feedback zu meinem Blog. Das freut mich sehr. 🙂
Bei einer PV-Anlage hast du ja im Grunde meines Wissens nur zwei Möglichkeiten.
Du kannst entweder den Wechselrichter direkt befragen oder du musst an den Stromzähler ran.
Ich zum Beispiel habe einen poweropti an meinem Stromzähler, der mir sagt, ob ich gerade einspeise oder nicht.
Der Shelly ist in meinem Fall ähnlich einem Wechselrichter und erzählt mir, wie viel ich gerade produziere.
Einspeisung kann ja von Erzeugung abweichen logischerweise.
Schau mal hier, ob dir das eine Inspiration liefert oder weiterhilft: https://hobbyblogging.de/poweropti-energiedaten
Und hier: https://hobbyblogging.de/poweropti-messung-von-stromerzeugung
Smarte Grüße
Sven · 22. Juni 2023 um 13:30
Grüße dich Lukas,
besten Dank für deine Antwort.
Mittlerweile habe ich es so hinbekommen mit einem cron Zeit Modul gefolgt von einem trigger wo abgefragt wird wieviel Watt an meiner PV anliegt. (Eine Nous at 1 hilft dabei)
Danach ein time stop und die Ausführung wie lange die Pumpe zu laufen hat.
Mega. Dein Blog zu lesen und ausprobieren hat echt gut geholfen
Danke dir
Grüße Sven
Lukas · 23. Juni 2023 um 09:34
Hallo Sven,
super, dass es geklappt hat. Ich finde es echt genial, wie viele Wege es zum Ziel gibt und wie unterschiedlich die Lösungen oft sind.
Danke, dass du deine Lösung noch mit uns geteilt hast. Das hilft sicherlich auch dem einen oder anderen zum Ziel.
Freut mich sehr, dass dir mein Blog so viel Inspiration geliefert hat. Dann habe ich ja durchaus was richtig gemacht. 😉
Smarte Grüße
Herfel · 18. Juli 2022 um 18:16
Ich finde deine Erklärungsart hervorragend. Mach weiter so!
Du kannst die bestimmt denken, das auch ich eine Frage, bzw. ein Problem habe. Ich arbeite schon seit geraumer Zeit mit Blockly. Bisher habe ich fast alles hinbekommen was ich vor hatte. Z.Zt.arbeite ich an einem kleinen Projekt. Kurz zur Erläuterung:
Ich habe einen Zierbrunnen(ca. 800l Regenwasser, bzw. Leitungswasser bei dieser derzeitigen Dürre). Ausserdem habe ich einen Teich. Das Regenwasser möchte ich gleichzeitig als Niveaustandsreglung für den Teich nutzen.
Plan:
wenn der Brunnen einen bestimmten Höchst- Stand erreicht hat soll die U-Pumpe das Wasser in den Teich befördern(bei längerem Regen). Wenn der Teichstand einen min.Wasserstand erreicht hat, soll die gleiche Pumpe den Teichstand über das Brunnenwasser angleichen. Hat der Brunnen einen Min-Stand überschritten, wird ein Magnetventil geöffnet und das günstigere Gartenwasser(Trinkwasser) füllt den Brunnen 15min auf.
Aktoren:
2x Shelly Steckdosen, 3xZigbee Sensoren(Tür und Fenstesensoren umgebaut für Schwimmer mit Readkontakten), 1x für Teichstand „zuTief“ und 2x Brunnen „Oben“ und „Unten“.
Ich habe schon gefühlte 10 Skripte geschrieben. Alle funtionieren eigentlich.
das Problem:
die beiden Shelly´s schalten einpaar Stunden wunderbar, dann aber wieder mal garnicht. Obwohl im ioBroker in den Objekten die Shelly´s „true“ zeigt schalten sie nicht. Die 3 Zigbee´s arbeiten Problemlos. Das Skript auch.(deboog). Muss meiner Meinung nach am Alexa2-Adapter liegen, oder die Cloud des Alexa spinnt. (Oder ich ) :-)) Über Alexa lassen sich beide Shelly´s schalten. Habe auch schon mehrere Steckdosen getestet. Überall das gleiche Problem. Weiß nicht mehr weiter.
vielleicht hast du einen Tipp.
mfg
Herfel
Lukas · 18. Juli 2022 um 19:47
Hallo Herfel,
vielen Dank für dein nettes Feedback zu meinem Artikel. Das hat mich sehr gefreut 🙂
Zugegeben, ich musste deinen Kommentar 3x lesen. Vermutlich liegt es an der Hitze. 😉
Wenn ich das richtig verstehe, steuerst du die Shelly Aktoren über den Alexa2-Adapter? Gibt es dafür einen bestimmten Grund?
Ich könnte mir durchaus vorstellen, dass da irgendwie die Kommunikation zwischen ioBroker und Shelly über Alexa nicht funktioniert. So einen Fall hatte ich meines Wissens auch schon mal.
Da bin ich mir aber grade nicht sicher.
Interessant zu wissen wäre, ob du andere Steckdosen direkt mit ioBroker steuerst oder ob das auch über Alexa geht.
Ansonsten kenne ich bislang kein Shelly Produkt. Habe mir zwar eines bestellt, aber noch liegt es im Schrank und ich komme noch nicht dazu, es endlich auszuprobieren.
Smarte Grüße
Dave · 29. Juni 2022 um 21:23
Hi,
ich habe mich schon etwas mit Blockly beschäftigt, komme aber an einer spezifischen Sache nicht weiter:
Ich habe ein Script, dass aufgrund verschiedener Abhängigkeiten meine Homematic-IP Rolladenaktoren zur Beschattung steuert. Trigger ist eine Veränderung des Außenlichtsensors. Ist dieser >= 25.000 Lux startet das Script. Es folgen nun mehrere Bedingungen (Innentemperatur >= 23 Grad, Rolladen ist nicht bereits auf 80%, Fenstergriffsensor = CLOSED und es ist zwischen 09:00 und 21:00 Uhr. Diese Beschattung funktioniert wunderbar.
Ich habe aber Probleme mit der Endschattung: Hier soll nämlich der Rolladen nicht direkt wieder hochfahren, wenn die entsprechenden Entschattungsbedingungen gegeben sind, sondern diese Bedingungen sollen für X Minuten bestehen, bevor entschattet wird. Hintergrund ist, dass ich bei Sonne-Wolken-Mix nicht ständig die Rolladen hoch- und runterfahren lassen möchte, sondern erst dann, wenn das direkte Sonnenlicht X Minuten „weg“ ist.
Ich frage mich nun wie ich das am geschicktesten mache. Die Timeouts werden mir ja nicht wirklich weiterhelfen, da – so zumindest mein Verständnis – trotz des Timeouts das Script von vorne beginnt, wenn der Trigger ausgelöst wird bzw. sich die Lux-Zahl verändert (was ja ziemlich schnell geschehen kann). Dann würde die Entschattung ja niemals eintreten, es sei denn, dass zufälligerweise die Lux-Zahl über den Timeout-Zeitraum konstant bleibt.
Hättest du einen Tipp?
Danke und viele Grüße!
Lukas · 29. Juni 2022 um 21:51
Hallo Dave,
eine interessante Regel, die du da in deinem Smart Home umsetzen möchtest. Finde ich super! Geht mal über das übliche Wenn-Dann hinaus. 😉
Tatsächlich habe ich dazu eine Idee, da ich ähnliche Probleme bei mir lösen musste.
Und zwar habe ich eine Regel, die einen Datenpunkt (true/false) steuert, sobald das Ereignis eintritt. Damit wird die Variable nicht dauerhaft geändert, sondern nur einmal pro Ereignis auf den jeweiligen Wert gesetzt.
Ab dann greift eine andere Regel auf diese Information zu und wird ausgelöst, wenn dieser eine Datenpunkt von true auf false oder umgekehrt wechselt.
Ich füge also eine Zwischenvariable ein, die sich nicht konstant verändert, sondern einmalig ausgelöst wird. Dann kannst du praktisch auch deine Regel aufteilen.
Der erste Teil der Regel steuert diesen Zwischen-Datenpunkt. Der zweite Teil der Regel steuert dann die eigentliche Automation auf Basis dieses Werts.
Ich hoffe, dass ich dir weiterhelfen konnte und es auch einigermaßen verständlich in eine kurze Antwort gefasst habe.
Smarte Grüße
Dave · 29. Juni 2022 um 22:49
Mega! Vielen Dank für die schnelle Antwort.
Ich hatte nun noch eine andere Idee, die ich erst einmal mittels Telegram-Nachrichten teste:
Ich lasse sowohl die Be- als auch die Entschattung im gleichen Script mit dem gleichen Trigger (Wert des Außenlichtsensors ändert sich) laufen.
Bei der Entschattung habe ich eine Schleife eingebaut (solange Lux < 25.000). Hintergrund ist, dass ich mir dachte: "Wenn nun innerhalb des "Warte-Zeitraums" die Lux wieder über 25.000 steigen, entschattet er und beschattet erst wieder, wenn sich der Trigger ändert (ggf. also wieder sofort). Das erste Do ist dann ein Timeout von 10 Minuten. Dann folgt pro Aktor ein If, ob die Beschattungsvariable = 1 ist und der Stand des Aktors 80% ist (hier behelfe ich mir relativ amateurhaft, wenn trotz vorliegender Entschattungsvoraussetzungen ein manueller Eingriff vorliegt; ich also manuell die Aktoren bewusst != 80% gesetzt habe; 80% ist quasi der Automatisierung vorbehalten). Die Variable habe ich, falls ich oder meine Frau doch mal die Rolladen auf 80% gesetzt habe, ohne dass vorher automatisiert beschattet wurde. Trifft dies zu, dann wird entschattet (je Aktor). Danach habe ich ein break out gesetzt.
Ich versuche deine Lösung auch parallel.
Vielen Dank nochmal!
PS: Geile Website!
Lukas · 30. Juni 2022 um 08:49
Hallo Dave,
deine Idee sollte sich so umsetzen lassen. Cool, dass du dir da auch weiter Gedanken dazu gemacht hast! 🙂
Ich glaube der wesentliche Unterschied zwischen unseren Lösungen würde sowieso nur darin bestehen, dass du in deinem Fall etwas mehr Ressourcen verbrauchst. Schließlich hältst du die Regel ja so lange aktiv, bis das Ereignis dann final eingetreten ist. Solange die Leistung aber bereitsteht und du nicht gerade am Limit arbeitest, sollte das kein Problem ergeben. Einfach ausprobieren. 😉
Würde mich natürlich sehr freuen, wenn du dann dein abschließendes Fazit noch hinterlässt und wie du es final umgesetzt hast.
Vielen Dank auch für das Lob zu meinem Blog. Darüber habe ich mich wirklich sehr gefreut! 🙂
Smarte Grüße
Ulf · 6. Oktober 2021 um 08:48
Ich möchte mich für Deine Arbeit bedanken. Du hast eine sehr gute Art die Dinge zu beschreiben.
Lukas · 6. Oktober 2021 um 20:57
Hallo Ulf,
vielen Dank für das Feedback. Das ist ja grandios! Ich werde das definitiv so beibehalten.
Beste Grüße