2.3.1. Python MQTT Subscriber

Das Python Skript soll Temperaturdaten über den MQTT Subscriber erhalten und den Temperaturverlauf in einem Graphen darstellen.

Bemerkung

Dieser Subscriber wurde in Python verfasst.

2.3.1.1. Subscriber Anteil

Das Programm verbindet sich mithilfe der Bibliothek paho-mqtt mit dem MQTT Broker. Bei der Verbindung wird die Funktion “on_connect” aufgerufen. Diese subscribed das Programm zum Topic “tel/arduino”.

Bei Erhalt einer Nachricht wird die Funktion “on_message” aufgerufen. Diese liest die in der JSON enthaltenen Daten aus und fügt sie als Tupel einer Liste hinzu. Die Zeit seit der Verbindung wird aus der Timestamp der ersten erhaltenen Nachricht und der Timestamp der gerade erhaltenen Nachricht berechnet.

Die Liste enthält alle Punkte die vom Programm dargestellt werden sollen und wird auf 10 Elemente gehalten. Kommt ein 11ter Punkt dazu wird der erste entfernt. Diese Liste wird zur Darstellung dem Plot Teil des Programms übergeben.

import paho.mqtt.client as mqtt
import json
from matplot import plot

class Handler:

    TOPIC = 'tel/arduino'
    BROKER_ADDRESS = '141.82.144.70'
    PORT = 1883
    list_of_points = []
    connect_time = int()
    max_number_of_points =20

    def on_message(self,client, userdata, message):
        payload = json.loads(message.payload.decode("utf-8"))
        if(len(self.list_of_points)==0):
            self.connect_time = int(payload['timestamp'])#saving the timestamp of the first message
        time_since_connection = int((payload['timestamp']) - self.connect_time)#calculating the time since the connection
        temperature = float(payload['temperature'])
        point=(time_since_connection,temperature)

        if(len(self.list_of_points)<=self.max_number_of_points):
            self.list_of_points.append(point)
        else:
            self.list_of_points.append(point)
            self.list_of_points.pop(0)
        plot(self.list_of_points)


    def on_connect(self,client, userdata, flags, rc):
        client.subscribe(self.TOPIC)
        print('connected to broker at:' + self.BROKER_ADDRESS)


if __name__ == '__main__':
    handler = Handler()
    client = mqtt.Client()
    client.on_connect = handler.on_connect
    client.on_message = handler.on_message

    client.connect(handler.BROKER_ADDRESS, handler.PORT)

    client.loop_forever()

2.3.1.2. Plot Anteil

Für die Darstellung des Temperaturverlaufs wird die Python Bibliothek matplotlib verwendet. Diese stellt die erhaltene Liste der Punkte als einen Graphen dar.

Die Funktion “plot” wird nach dem Erhalt einer neuen Nachricht aufgerufen um die Darstellung des Graphen um den neuen Punkt zu erweitern.

import matplotlib.pyplot as plt
import numpy as np


def plot(list_of_points):
    plt.clf()
    plt.title('Arduino Temperature Graph')
    plt.xlabel('time since connection in s')
    plt.ylabel('temperature in °C')
    plt.plot(*zip(*list_of_points),color='red',linestyle='dashed')
    plt.draw()
    plt.pause(0.001)