Smart Security
Für unser Sicherheitssystem wollen wir sicherstellen, dass niemand das Haus unbefugt betritt. 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.
Ein ausführliche Beschreibung für die Einrichtung von MQTT findet man hier.

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

