Övning 28 / 29
Filter och larm
Beräknad tid: 22 min
Varför
En gateway som skriver ut allt blir snabbt rörig. I drift tittar du på värdet och reagerar bara när det passerar en gräns. Det är samma if som i övning 12, nu på data från brokern.
Den nya idén
json.loads är spegeln till dumps: sträng in, dictionary ut. Gör det inne i callbacken, på message.payload.decode().
data = json.loads(message.payload.decode())
temp = data["temp"]
print(temp)
if temp > 24:
print("LARM")Ett larm här är bara extra text i terminalen. Ingen siren. Poängen är filtret: meddelanden under gränsen ger bara talet, meddelanden över ger talet och LARM.
Lyssna på ditt telemetry-topic från övning 27. Kör larm.py först, sedan telemetri.py. Vill du tvinga fram ett larm: tillfälligt publicera {"temp": 29, "fukt": 40} i stället för ett slumptal.
json.loads kan kasta json.JSONDecodeError om någon skickar vanlig text på samma topic. Fånga det felet och skriv en kort rad, så dör inte lyssnaren.
Uppgift
Skapa filen larm.py som prenumererar på nackademin/<ditt-namn>/telemetry och för varje meddelande:
- Tolkar JSON till en dictionary.
- Skriver ut temperaturen på egen rad.
- Skriver ut LARM på nästa rad om temp är över 24.
- Skriver ut Kunde inte läsa JSON. och går vidare om texten inte är JSON.
Testa med två publiceringar: en temp på 21 och en på 29. Den första ska inte larma.
Förväntat resultat
Två meddelanden mot en lyssnare som redan kör. Först 21, sedan 29:
21
29
LARM