Lösung: Smart Home mit dem Internet-of-Things
Ein ausführliche Beschreibung für die Einrichtung von MQTT findet man hier.

Die jeweiligen Blöcke findet man unter “Advanced -> MQTT”
Smart-Home
Stecke zuerst den EVN. Sensor am Port A des M5Stacks mittels Grove Kabel an. 
Als nächstes muss nun die RGB LED Komponente an den Port B des M5 Stacks angeschlossen werden.

Nach dem zusammenstecken der Komponenten und dem MQTT Setup, müssen die Units in UiFlow ausgewählt werden. In diesem Fall wird der EVN und der RGB Sensor benötigt.

Um den MQTT Broker ansprechen zu können, müssen nach dem Setup die Verbindungsinformationen für den Broker angegeben werden.
Mit dem „Get env0 Temperatue“-Block erhält man die Temperaturwerte. Der „convert to int“ Block konvertiert mir die erhaltenen Werte in schöne Ganzzahlen. Mit dieser Schleife ist das Senden der Sensordaten auch schon bereits getan.

Würde man mehrere solche M5Stacks in verschiedenen Zimmer aufstellen, so müsse man noch unterschiedliche Topics für die Temperaturwerte konfigurieren, so dass man für jedes Zimmer die korrekten Werte bekommt, ansonsten würden mehrere ENV-Units eventuell unterschiedliche Temperaturwerte messen.
Als nächstes kümmern wir uns um die Beleuchtung. Das gute an dem RGB-Unit am M5Stack ist, dass es nicht nur an- und ausgeschaltet werden kann, sondern man auch die Lichtstärke regulieren kann. Deswegen muss man überlegen, wie soll diese Lichtstärke gesteuert werden? Der Drehschalter-Unit ANGLE würde sich da optimal dafür anbieten. Wenn man mit diesem etwas Vertraut ist, erkannt man, dass die Werte, die diese Unit ausgibt, von ungefähr 1-1024 gehen. Die Lichtstärke hingegen am RGB Unit geht von ungefähr 1-300 (Das bedeutet, dass sie bei ca. 300 ihr Maximum erreicht hat). Man könnte alle ANGLE Werte einen Lichtstärkewert zuweisen, aber das wäre vom Aufwand viel zu hoch und nicht zielführend für eine Einführung. Beschränken wir uns auf gewisse Beleuchtungsstärkezustände und kategorisieren wir diese
M5/jku/brightness = 0 … Kein Licht
= 1 … Schwach
= 2 … Mittelstark
= 3 … Starke Beleuchtung
Das Setzen dieser Werte über den MQTT-Broker muss sich unser jetziges System nicht kümmern, dafür gibt es die „Control-Kategorie“ die später implementiert wird. Jedoch können wir jetzt schon die Logik für die Beleuchtung programmieren, sollte eine solche Nachricht empfangen werden.
Der erste und wichtigste Block dafür ist der subscribe-Block.
Da unsere Werte im Bereich 0-3 sind, soll zuerst beim Empfangen der Nachricht abgeprüft werden, um welchen von diesen es sich handelt und anhand von dieser reagiert werden und entsprechend die Lichtstärke gesetzt werden.
Für eine solche Überprüfung eignet sich der „if-do“-Block ideal, da sich dieser beliebig erweitern lässt.

Nun geht es darum, die Bedingung abzufragen, wann die Lichtstärke verändert werden soll, und dies funktioniert mit einem simplen Vergleichsoperator.

Tab ContentWann soll das Licht ausgeschalten werden? Wenn die Nachricht mit dem Inhalt „0“ empfangen wird.

Die anderen Fälle (wann der Inhalt 1,2 oder 3 ist) können wir abbilden, indem wir beim „if“ das blaue Zahnrad auswählen, und weitere „else-if“ Bedingungen hinzufügen.

Am Ende sollen somit 4 Überprüfungen stattfinden.
Nun werden die verschiedenen Fälle überprüft und passend zu dem jeweiligen Fall zuerst die Lichtstärke und anschließend der Wert der Intensität gesetzt.

Als nächstes muss die Temperatur überprüft werden, um anzeigen zu können, ob es zu warm oder kalt ist.
Dazu wird die Temperatur ausgelesen und der Wert mit 2 addiert oder subtrahiert.
(Hinweis: die Farbe schwarz ist wieder gleich zu setzen wie mit keiner Beleuchtung)
Die fertige „Smart-Home-Kategorie: Home“ sieht am Ende so aus

Video
Smart-Plant
Stecke den Pb.HUB am Port A des M5Stacks an. Der Pb.HUB wird benötigt, da die folgenden beiden Sensoren jeweils über den Port B angesprochen werden müssen.
Im nächsten Schritt muss der Earth Sensor an den Port 0 des Pb.HUBs angeschlossen werden.

Als letzte Komponente muss der Light Sensor mittels Grove Kabel an den Port 1 des Pb.HUBs angeschlossen werden.

Bevor mit der Programmierung in Ui Flow begonnen werden kann, muss zunächst die Unit Pb.HUB ausgewählt werden, denn sowohl die Earth-Unit als auch die Light-Unit benötigen beide den Port B.
Wie bei dem Smart Home zuvor benötigt man auch bei diesem Modul den MQTT Broker.
Wie sieht es nun mit den Topics aus. Welche Nachrichten benötigt man, welche soll man weiterschicken? Für unseren Anwendungsfall benötigen wir keine Nachrichten von anderen Geräten, jedoch wollen wir den Zustand der Pflanze weitergeben können. Deswegen werden keine Subscribe-Blöcke benötigt, sondern nur Publish-Blöcke.
Die zu verwendeten Variablen sind somit:
· M5/jku/humidity … Ob die Erde ausreichend bewässert ist
· M5/jku/light … Ob die Pflanze ausreichend Licht bekommt
Um den MQTT Broker ansprechen zu können, müssen nach dem Setup die Verbindungsinformationen für den Broker angegeben werden.
Bevor wir nun mit der Logik der Units anfangen, muss man im Vorhinein überlegen, wann soll eine Nachricht gesendet werden? Ich möchte alle paar Sekunden den Status der Pflanze senden. Deswegen benötigen wir eine Schleife:

Den Status der Pflanze ermitteln wir über die Units, besser gesagt über den Pb.HUB, mittels dem analogRead-Block. Hier ist zu beachten, an welchen der 6 Ports man die Unit ansteckt. (Am Pb.HUB selbst, ist die Zahl gekennzeichnet).

Wenn man die LIGHT-Unit an den, Pb.HUB ansteckt, und dessen Werte sich über dieses „AnalogRead“ anschaut (z.B. über eine Label Ausgabe am M5Stack Bildschirm), erkennt man, dass starkes Licht zu einem niedrigen Wert führen, und hohe Werte bedeuten somit Dunkelheit. Für meine Pflanze zuhause möchte ich, dass die „Lichtwerte“ unter 500 sind, alles darüber wäre zu dunkel.
Deswegen beginnen wir wieder mit einer Bedingung, die man abfragen muss. Da es nur ein richtig oder falsch gibt, genügt hier eine einfache „if-do-else“-Schleife.

Die Abfrage selbst beim „if“ erfolgt über den Vergleichsoperator, den wir schon vorm vorherigen Kapitel kennen. Hier den AnalogRead abprüfen, ob der Wert unter 500 ist.

Im „do“-Teil soll die Nachricht gesendet werden, dass die Lichtverhältnisse für die Pflanze passen. Dies kann beliebig gewählt werden, für mich ist es einfacher zu halten mit „1“ für ok und „0“ für dunkel.

Für die Feuchtigkeit der Erde gehen wir analog vor und erstellen einen „if-do-else“ Block mit einem Vergleichsoperator mit dem AnalogRead. Beim Herumtesten fiel mir auf: Sehr trockene Erde hat Werte über 400.

Der momentane Zustand wird somit alle 10 Sekunden an den Broker gesendet. Was jedoch nicht beachtet wird, sind Tag- und Nachtzeiten. Das auf Nacht die Lichtwerte nie passen, ist selbstverständlich. Man könnte eventuell eine Überprüfung machen, dass diese Werte nur zu gewissen Uhrzeiten (z.B. Tagsüber) geschickt werden oder man summiert pro Tag alle diese „1“ und „0“ und findet heraus, ob die Pflanze über den ganzen Tag hinweg genug Licht bekommen hat.

Video
Smart-Security
Stecke den Grove Hub mit einem Grove Kabel an Port A des M5Stacks an. Stecke nun an einen beliebigen Port des Grove Hubs mittels eines Grove Kabels die CardKB Komponente an.
Im nächsten Schritt muss der Motion Sensor an einen beliebigen Port des Grove.HUBs angeschlossen werden.
Der M5Stack wird nun über den Grove.HUB mit den beiden Laser Komponenten (Laser.RX und Laser.TX) mittels Grove Kabel erweitert.


Für dieses Modul werden folgende Units benötigt:
- PIR
- Laser.TX
- Laser RX
- Pb.HUB
Da die ersten drei Units am Port B angeschlossen werden müssen wird zusätzlich noch ein Pb.HUB benötigt. Weswegen dieser und die PIR-Unit in Ui Flow ausgewählt werden muss.
Mit dem Bewegungsmelder wollen wir eine Nachricht an den Broker senden, wann dieser eine Bewegung im Haus registriert. Außerdem soll auch die Laserschranke erkennen, wann diese unterbrochen worden ist. Vom Broker selbst, bzw. von anderen Geräten werden keine Informationen bzw. Nachrichten benötigt.
Die zu verwendeten Variablen sind somit:
- M5/jku/laser … Wann die Laserschranke unterbrochen wird
- M5/jku/motion … Wann eine Bewegung im Haus erkannt wird
Um den MQTT Broker ansprechen zu können, müssen nach dem Setup die Verbindungsinformationen für den Broker angegeben werden.
Nun stellt sich die Frage, wann soll eine Nachricht gesendet werden?
-Bei Erkennung einer Bewegung beim Motion Sensor oder der Laser Schranke
Fangen wir mit dem Bewegungsmelder PIR an. Wird eine Bewegung erkannt, so ist der Wert „Get pir status“ dann „1“, andernfalls „0“.
Da wir ständig überprüfen müssen, ob sich der Wert ändert, wird eine Schleife notwendig sein, diesmal ohne zu warten.
Jedoch, wenn wir dies beim WebClient testen, werden wir erkennen, dass dies ungünstige Resultate liefert. Da die Schleife sehr oft pro Sekunde durchlaufen wird und bei einer Bewegungserkennung der Status vom PIR für paar Sekunden auf „1“ bleibt, senden wir hunderte, wenn nicht tausende Nachrichten an den Broker. Dies gilt es zu vermeiden, da wir so unser Kommunikationssystem mit dem Broker stören und überlasten können.
Das Ziel ist es somit, wenn sich der Status ändert, nur eine einzige Nachricht zu senden. Die können wir mit eigen erstellten Variablen erreichen, die den Zustand der Units speichern.
Dazu müssen in Ui Flow Variablen angelegt werden.

Ich habe für die PIR Variable den Namen „isMovement“ und für die Laser Variable „isLaser“ gegeben und sollen beide mit dem Wert „0“ starten.
Da der optimale Zustand dieser Variable bei „0“ liegt, wird dies am beim „Setup“-Bereich festgelegt, vor der Schleife.
Der nächste Schritt, ist die Abfrage (also das „if“) so umzuändern, so dass es die Variable nun berücksichtigt. Es soll also nur die Nachricht senden, wenn der neue Status „1“ ist, und der alte „0“ ist.

Damit verhindert werden kann, dass die Nachrichten dauernd gesendet werden und nicht nur bei einer erkannten Bewegung, muss mit folgender IF-Bedingung überprüft werden, ob eine Bewegung erkannt wurde.
Ist dies der Fall muss die Variable isMovement auf 1 gesetzt werden und eine Nachricht gesendet.

Das Problem jetzt: Beim Ausführen wird die Nachricht korrekterweise nur einmal gesendet, jedoch bleibt die Variable auf 1, sodass es nicht mehr dazu kommen kann, erneut eine zu senden. Dazu muss der Fall noch realisiert werden, wenn keine Bewegung erkannt war. Dies erfolgt sehr ähnlich nur mit umgekehrten Ziffern.

Wird keine Bewegung erkannt, ist jedoch zuvor schon eine erkannt worden ist (isMovement = 1), muss dieser Block ausgeführt werden.

Wird die Bedingung erfüllt, soll die Variable isMovement wieder auf = 0 gesetzt werden (weil keine Bewegung mehr erkannt wird) und diese Information an den Broker senden.
Bei dem fertigen Code erkennt man, dass das zweite „if“ gleich ist wie die erste, nur die „0“ und „1“ Zahlen vertauscht sind. Somit wird immer bei einer Änderung des Zustands nur eine Nachricht gesendet. Eine für das Erkennen der Bewegung und eine, dass keine Bewegung mehr stattfindet.
mit einer Labelausgabe von dem „analogRead“) erkennt man, dass der analogRead Wert durchgehend ein hoher ist. Zielt der Laser genau auf den Empfänger, so wird der Wert sehr gering. Der „Normalzustand“ ist, wenn der Laser durchgehend genau auf den Empfänger zielt. (wichtig: die Laser-Units gut befestigen!)
Für meinen Fall habe ich den Wert „500“ als Vergleichswert genommen, da „analogRead“ entweder weit unter 500 oder weit über 500 ist.
Analog wie beim Bewegungsmelder benötigen wir somit wieder eine „if“-Abfrage wo einerseits der Wert von analogRead abgefragt werden muss, andernfalls auch Variable des Lasers.

Wird die Schranke unterbrochen, so soll die Variable geändert und eine Nachricht an den Broker gesendet werden. Wie im vorherigen Beispiel müssen wir für den anderen Fall ein „else-if“ hinzufügen und nur die Ziffern ändern.

Wenn der analogRead größer als 500 ist soll eine Nachricht mit 1 gesendet werden, was bedeutet, dass sich gerade etwas bewegt.
Findet jedoch gerade keine Bewegung zwischen der Lichtschranke statt, ist der analogRead kleiner als 500 und es soll 0 an den Broker übermittelt werden.

Nochmals möchte ich erwähnen, dass es für das Thema Sicherheit sehr viele Units für den M5Stack gibt, und man diese Kategorie somit beliebig erweitern könnte.

Video
Smart-Control
Stecke den Pb.HUB am Port A des M5Stacks an. Der Pb.HUB wird benötigt, da der folgende Angle Sensoren über den Port B angesprochen werden muss.
Stecke den Angel Sensor nun an den Port O desPb.HUBs an.
Nun noch den Dual Button an den Port B mit einem Grove Kabel anstecken.
Anschließend muss der Dual Button und der Pb.HUB noch als Unit in Ui Flow hinzugefügt werden.
Zuerst gilt es einzuteilen, welche Bereiche man beobachten will und welche man steuern will. Außerdem sieht man hier eine gute Zusammenfassung aller Topics in unserem System
Steuern:
Wir können einerseits die Wunschtemperatur steuern, anderseits die Beleuchtung im Haus. Die Topics dafür wären
- M5/jku/temp_set … Wunschtemperatur
- M5/jku/brightness … Beleuchtung
Beobachten:
Alle anderen Topics bzw. Nachrichten, die von den M5Stacks gesendet werden
- M5/jku/temp_actual … Temperaturwerte des Sensors
- M5/jku/humidity … Ob die Erde ausreichend bewässert ist
- M5/jku/light … Ob die Pflanze ausreichend Licht bekommt
- M5/jku/laser … Wann die Laserschranke unterbrochen wird
- M5/jku/motion … Wann eine Bewegung im Haus erkannt wird
Somit benötigen wir 5 Subscribe-Blöcke und 2 publish-Blöcke.
Mit ein paar Text Änderungen in UIFlow kann man für eine gute Übersicht der Werte sorgen. Das „#“ der einzelnen Werte sind die Variablen, die durch die Geräte über den MQTT-Broker erst entstehen werden bzw. verändert werden.
Hinweis: Man kann den Namen der Lables belassen (z.B. lable0, lable1 usw.), jedoch ist zu empfehlen, diese in diesem Fall umzubenennen, da man so diese viel leichter findet, wenn man Werte ihnen im Code zuweisen möchte.

Um den MQTT Broker ansprechen zu können, müssen nach dem Setup die Verbindungsinformationen für den Broker angegeben werden.
Gleich beim Start des M5Stacks soll eine MQTT-Nachricht mit dem Startwert dieser Variable gesendet werden
Hinweis: Dieses Senden passiert nur einmal genau beim Einschalten den M5Stacks.

Subscribe-Variablen
Die Logik für das Beobachten der Werte ist im Grunde sehr simpel. Ein Subscribe-Block auf das entsprechende Topic und beim Empfangen von Nachricht dies über das Label am Bildschirm anzeigen lassen.
Sofern Step 6 nicht ausgelassen wurde, genügen solche Subscribe-Blöcke vollkommen aus, um die Werte anzeigen zu lassen
Wenn man die Labels korrekt benennt, führt das gleich zu einer besseren Übersicht.

Wunschtemperatur
Um den Dual Button steuern zu können, muss sowohl der Rote als auch der Blaue Button einzeln definiert werden und bestimmt werden was wann passiert. In unserem Fall, ist nur wichtig was passiert wenn der gedrückt (wasPressed) wurde.
Wurde der Rote gedrückt wird die Temperatur um 1 erhöht und die erhöhte Temperatur an den Broker gesendet. Bei Blau um 1 verringert.

Lichtstärke
Für die Lichtstärke nutzen wir die Unit „ANGLE“. Da auch der Angle Sensor am Port B angeschlossen werden müsste, nehmen wir hier wieder den Pb.HUB zur Hilfe.
Einfach die ANGLE-Unit an den Pb.HUB anstecken und über eine Label-Ausgabe testen, welche Werte beim Drehen des Drehschalters angezeigt werden.
In meinem Fall sind es Werte von 0 bis ca. 1000. Ist der Drehschalter bis zum Anschlag im Uhrzeigersinn, so ist der Wert sehr klein. Für gewöhnlich dreht man Drehschalter im Uhrzeigersinn, um die Lichtstärke zu erhöhen. Deswegen soll, je kleiner der ANGLE-Wert (bzw. der „analogRead-Wert“ vom Pb.HUB), die Lichtstärke erhöht werden.
Da ständig die Werte von der ANGLE-Unit gelesen werden muss, wird hier eine Schleife benötigt. Um die Werte zu überprüfen, brauchen wir einen „if“-Block, am besten einen erweiterbaren, da wir in der Home-Kategorie vier Werte für die Lichtstärke definiert haben (0,1,2,3)
Fangen wir mit der Situation an, dass das Licht ausgeschaltet werden soll. Der dafür definierte Wert war „0“ für das Topic „M5/jku/brightness“. Der ANGLE-Wert dafür ist wie gesagt ein sehr hoher. Da die Spannweite von 0 bis ca- 1000 geht, könnten wir diese auf 4 gleich große Wertebereiche aufteilen und für alle 4 eine Abfrage machen, ob sich der ANGLE-Wert da befindet. Ich habe beim Testen herausgefunden, dass Grenzen bei 700, 500,200 recht sinnvoll sind.
Beim Testen werden wir erkennen, dass ein bekanntes Problem auftauchen wird. Sobald der ANGLE-Drehschalter so gedreht ist, dass die Werte über 700 sind (gegen den Uhrzeiger), dann werden wieder hunderte von Nachrichten an den Broker gesendet. Dies gilt es wieder zu vermeiden. Deswegen brauchen wir wieder eine Variable für die Lichtintensität und wollen nur dann eine Nachricht senden, wenn sich die Stärke ändert. Beginnen soll sie mit dem Wert „0“.
Der „do“-Bereich von diesem „if“ soll nur dann ausgeführt werden, wenn die ANGLE-Werte über 700 sind UND die Lichtstärke davor nicht „0“ war. Wenn dieser Block ausgeführt wird, dann soll auch diese Variable auf „0“ gesetzt werden, damit nur eine Nachricht gesendet wird.

Die Abfrage aus Step 12 müssen wir nun für die anderen Wertebereiche der ANGLE-Unit wiederholen und entsprechend die Variable setzen. Dabei erweitern wir den „if“-Block um 3 weitere „else-if“-Bereiche.

Gesamtübersicht über den Code von Modul 4



