Ö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().

Läs temp och jämför — skiss, inte hela lyssnaren
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:

  1. Tolkar JSON till en dictionary.
  2. Skriver ut temperaturen på egen rad.
  3. Skriver ut LARM på nästa rad om temp är över 24.
  4. 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:

python3
21
29
LARM

Kör fast?