Der Notifier ist für die Kommunikation zwischen Backend und Sensor verantwortlich, sendet push-notification an Endgeräte und schreibt die vom Sensor erhaltenen Datensätze in die Datenbank.

Der Code in notifier.py lässt sich wie folgt unterteilen:

Setup

sensible Informationen wurden geschwärzt

Im Setupteil wird der Endpoint für die Push-Benachrichtigungen konfiguriert. Der MQTT Broker samt Port angegeben und außerdem das Topic auf dem der Sensor die Daten published. Die Client ID für den MQTT Broker wird per Zufall generiert in dem eine Zahl zwischen 0 und 1000 an den client_id string angefügt wird.

Connection

In diesem Block wird eine Connection Funktion, connect_mqtt, beschrieben um eine Verbindung mit dem Broker herzustellen und eine on_connect Funktion definiert die jedes Mal aufgerufen wird wenn eine Verbindung hergestellt wird.
Die on_connect Funktion prüft ob der return code vom Broker 0 ist, dies bedeutet, dass eine erfolgreiche Verbindung hergestellt wurde und gibt dann “Connected” in der Konsole aus. Sonst wird “Failed to connect, return code {rc}” zurückgegeben wobei {rc} für den erhaltenen return code steht.

In der Connection Funktion wird zunächst eine Client Instanz mit unserer Zufalls Client ID erstellt, dann wird die on_connect Funktion als on_connect Methode des Clients festgelegt, damit sie auch aufgerufen wird wenn der Client sich mit dem Broker verbindet. Schließlich wird die client.connect Methode aufgerufen mit der eine Verbindung zum Broker hergestellt wird. Damit nun über diese Verbindung auch ein Datenaustausch stattfinden kann wird das client Objekt zurückgegeben, sodass es von anderen Funktionen genutzt werden kann.

Subscribe & on message

Hier passiert der Haupteil von dem was notifier.py tut. Auch hier haben wir zwei verschachtelte Funktionen. Eine subscribe Funktion die lediglich das unter der Variabel “topic” angegebene Topic abonniert und der client.on_message Methode die on_message Funktion zuweist und die on_message Funktion die nach der Zuweisung bei jeder erhaltenen Nachricht aufgerufen wird.
Zuerst gibt die on_message Funktion in der Konsole die erhaltene Nachricht und das Topic aus. Da es sich bei den sensor readings die an den Broker übermittelt werden um json strings handelt müssen diese nun erst einmal wieder umgewandelt werden. Das Funktioniert mit der Funktion ast.literal_eval(), dieser Funktion kann ein String übergeben werden der einen Python Datentypen enthält und gibt dann die Daten in diesem Datentyp wieder zurück. In diesem Fall wird der json string in ein Python dictionary umgewandelt. Als nächstes wird dieses dictionary der threshold_test Funktion übergeben, da diese einen Datensatz in einem bestimmten Format erwartet steht alles weitere in einem try-except-Block, damit der Notifier nicht abstürzt wenn versehentlich ein falsches Format gesendet wird. Das Ergebnis der threshold_test Funktion ist eine Liste die im Besten Fall, und zwar wenn kein Messwert einen Schwellenwert überschreitet, leer ist. Sollte die Liste nicht leer sein wird sie an die message_builder Funktion weitergeleitet und auch diese Funktion gibt eine Liste zurück. Dieses Mal eine Liste an Nachrichten. Diese Nachrichten werden nun eine nach der anderen vom Notifier an den vorher konfigurierten Endpunkt gesendet und landen so als Push-Benachrichtigung auf dem Handy.

Unabhängig davon ob die threshold result Liste leer ist oder nicht wird nun ein Timestamp zum dictionary hinzugefügt und schlussendlich wird das dictionary als JSON Dokument durch die Database.insert_dataset Methode auf die Datenbank geschrieben.

run Funktion

Zwar unscheinbar jedoch essentiell ist die run Funktion. Diese wird in app.py aufgerufen und sorgt dafür, dass der Notifier gestartet wird. Beim Aufruf der run Funktion wird erst ein neuer client mit der oben besprochenen connect_mqtt Funktion erstellt, dieser wird dann an die subscribe funktion übergeben und schließlich wird der client in einen endlos loop gepackt, sodass dauerhaft Nachrichten vom Broker verarbeitet werden können.

Tags:

No responses yet

Leave a Reply

Your email address will not be published. Required fields are marked *