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)