Smart Control
Diese Kategorie ist für das Beobachten und Steuern der anderen Geräte zuständig. Alternativ könnte man statt dieser auch eine eigene Handy Applikation erstellen mit derselben Funktionalität (dazu im nächsten Kapitel mehr), aber da der M5Stack ein Bildschirm mit mehreren Tasten und auch über Units mit Tasten verfügt, können wir dies am M5Stack selbst realisieren.
Zuerst gilt es einzuteilen, welche Bereiche man beobachten will und welche man steuern will.
Ein ausführliche Beschreibung für die Einrichtung von MQTT findet man hier.

Die jeweiligen Blöcke findet man unter “Advanced -> MQTT”
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

