tado°: scoprire (e non intervenire) quando il riscaldamento è già spento, via Python

| |

L’articolo che stai per leggere qui di seguito richiede tutta una prima parte di cui ti ho già parlato precedentemente: tado°: dialogare con il sistema tramite Python. Se manca la prima parte, questo articolo perde completamente di senso, ti consiglio quindi di recuperarla nel caso tu non l’avessi già letta.

Fatta la dovuta premessa, quello che oggi voglio approfondire è l’aspetto legato all’intervento sul sistema di riscaldamento quando questo è già impostato per rimanere spento, operazione tipica che si esegue quando arriva il periodo primaverile, il caldo, quando il condominio spegne la caldaia e quindi il sistema centralizzato si ferma. Inutile dire che tutto questo è però applicabile anche a chi il riscaldamento non ce l’ha centralizzato. Lo scopo del gioco è (facendo riferimento al primo articolo) NON modificare alcunché sul sistema tado° se questo si trova già in modalità “OFF“.

tado°: dialogare con il sistema tramite bash

Cosa vuol dire spento?

Ormai da qualche tempo tado° ha introdotto una nuova funzione della sua applicazione ufficiale che – con la semplice pressione di un dito – permette di dire a tutte le valvole di portarsi in posizione di “funzione antigelo“, in pratica spegnere il sistema, fermare ogni possibile erogazione di calore. Per me questo vuol dire spento, vuol dire che in casa nessun termosifone deve scaldare la sua stanza di competenza. Se anche solo una valvola è ancora operativa, il sistema in qualche maniera sta funzionando e deve continuare a farlo.

Tradotto in output JSON nel momento in cui si interrogano le API di tado°, vuol dire trovare nello stato di zona (la zona è l’ambiente in cui si installano le valvole) il valore power su OFF, sotto setting.

Per fare l’albero, ci vuole …

Per poter arrivare a capire se una zona è attualmente attiva (con le valvole che stanno quindi funzionando regolarmente, in stagione non calda), si passa tramite la classe libtado.api.Tado.get_state, quella ben dettagliata all’indirizzo libtado.readthedocs.io/en/latest/api.html#state. Noterai probabilmente che la classe si aspetta un parametro in ingresso relativo alla zona, l’ID univoco di quest’ultima.

Per poterlo ottenere, bisognerà però fare appello alla classe libtado.api.Tado.get_zones, spiegata all’indirizzo libtado.readthedocs.io/en/latest/api.html#zones, la quale permette di conoscere quali sono le zone (in pratica le stanze dichiarate nell’applicazione quando si installano le valvole di tado°) della casa.

Traducendo il tutto, si parla di qualche nuova funzione e relativo richiamo nel main(), più nello specifico sto parlando del get_zones:

def get_home_zones(TADO_USER, TADO_PWD, TADO_TOKEN):
    home = api.Tado(TADO_USER, TADO_PWD, TADO_TOKEN)
    return list(home.get_zones())

e quindi del get_state:

def get_zone_status(zones,TADO_USER, TADO_PWD, TADO_TOKEN):
    home = api.Tado(TADO_USER, TADO_PWD, TADO_TOKEN)
    n = 0
    activezones = 0
    while n < len(zones):
        zonestate = home.get_state(zones[n]["id"])
        print("Zone ID", zones[n]["id"], "(", zones[n]["name"], ")", zonestate["setting"]["power"])
        if zonestate["setting"]["power"] == "ON":
            activezones += 1
        if n == (len(zones))-1:
            break
        n += 1
    return activezones

Avrai forse notato che però nella seconda funzione vado a popolare una variabile activezones che corrisponde poi anche a quella di ritorno della funzione stessa. A che serve? Presto detto: voglio conoscere lo stato delle zone, se queste non sono attive (spente, quindi stagione calda, quando si attiva la funzione antigelo di tado°):

root@jarvis:/Scripts/Tado# python3 test.py 
Zone ID 1 ( Sala ) OFF
Zone ID 3 ( Bagno ) OFF
Zone ID 2 ( Camera da letto ) OFF
Zone ID 4 ( Cameretta ) OFF
Check active zones: 0

L’output è prodotto chiaramente dal print riportato nella funzione get_zone_status, quel “Check active zones: 0” finale è il conteggio di quante zone sono attive del sistema tado°, un valore che mi tornerà molto utile tra poco.

Perché conoscere le zone spente?

Perché è grazie a quelle se poi posso lanciare un banale confronto quando si va a determinare il comportamento dello script tado.py. Spiego meglio: nell’articolo originale, dopo aver verificato la presenza in casa dei MAC Address da tenere d’occhio, andavo a verificare che la variabile di presenza fosse maggiore di zero (almeno un dispositivo registrato sul router, presente quindi in casa o nelle direttissime vicinanze), a quel punto modificavo lo stato di tado° per metterlo in posizione HOME o AWAY.

La differenza oggi consiste nel fatto che, pur tenendo in piedi lo stesso identico controllo, prima di modificare la posizione HOME / AWAY mi accerto che i dispositivi non siano tenuti spenti, in funzione antigelo. Ricordi cosa intendo (scrivendolo a inizio di questo articolo) per “sistema spento“?

[…] vuol dire che in casa nessun termosifone deve scaldare la sua stanza di competenza. Se anche solo una valvola è ancora operativa, il sistema in qualche maniera sta funzionando e deve continuare a farlo.

Anche solo una zona accesa: almeno un dispositivo sta funzionando, non è quindi corretto non intervenire. Zone tutte spente: funzione antigelo attiva, posso evitare di toccare la questione HOME / AWAY e passare oltre. La variabile activezones (il valore che ottengo dalla funzione get_zone_status) non può essere maggiore di zero, se lo fosse (anche solo di una unità) vorrebbe dire che c’è almeno una zona operativa. A questo punto la modifica è fatta:

if zonestatus > 0:
    if presence > 0:
        if str(homestate) == "AWAY":
            print("Found at least one device in home, set tado° to HOME")
            sendtotelegram(BOT_TOKEN,CHAT_ID,MSG_TADO_HOME)
            set_home_state(TADO_USER, TADO_PWD, TADO_TOKEN, True)
    else:
        if str(homestate) == "HOME":
            print("No devices found in home, set tado° to AWAY")
            sendtotelegram(BOT_TOKEN,CHAT_ID,MSG_TADO_AWAY)
            set_home_state(TADO_USER, TADO_PWD, TADO_TOKEN, False)
else:
    if presence > 0:
        print("Found at least one device in home, but tado° is already OFF")
        sendtotelegram(BOT_TOKEN,CHAT_ID,MSG_TADO_HOME_OFF)
    else:
        print("No devices found in home, but tado° is already OFF")
        sendtotelegram(BOT_TOKEN,CHAT_ID,MSG_TADO_AWAY_OFF)

Questo permetterà allo script di intervenire e modificare il comportamento del sistema tado° solo nel periodo in cui deve funzionare, le stagioni più fredde.

Le modifiche che riguardano Telegram

Solo due. Non intendo il commentare le istruzioni che richiamano l’invio dei messaggi nel canale Telegram, quel metodo è rimasto completamente invariato. Ciò che intendo sono le due nuove frasi che trovano spazio nelle variabili MSG_TADO_HOME_OFF e MSG_TADO_AWAY_OFF, rispettivamente utili per segnalare il rientro in casa (ma con sistema spento) e l’uscita dall’area entro la quale i dispositivi vengono rilevati dal router (sempre a sistema spento, funzione antigelo).

Io ti (ri)propongo qui di seguito quelli che utilizzo nel mio script in produzione, sul Raspberry, tu sei assolutamente libero di sceglierne di diversi, dovrai solo mantenere i nomi delle variabili, potrai anche togliere giorno e ora della notifica se lo ritieni opportuno:

MSG_TADO_HOME = "tado° in modalità Home 🔥 \nBentornati nell'area di casa 🏠 \n(%s)" % datetime.datetime.now().strftime("%d/%m/%Y alle %H:%M:%S")
MSG_TADO_AWAY = "tado° in modalità Away ❄️ \nAbbasso il riscaldamento, a più tardi 👋 \n(%s)" % datetime.datetime.now().strftime("%d/%m/%Y alle %H:%M:%S")
MSG_TADO_HOME_OFF = "tado° rimane spento 💤, bentornati nell'area di casa 😄 \n(%s)" % datetime.datetime.now().strftime("%d/%m/%Y alle %H:%M:%S")
MSG_TADO_AWAY_OFF = "tado° rimane spento 💤, a più tardi 👋 \n(%s)" % datetime.datetime.now().strftime("%d/%m/%Y alle %H:%M:%S")

That’s all folks

L’articolo si conclude qui. Se vuoi – come sempre – l’area commenti è a tua totale disposizione per dubbi, ulteriori informazioni o suggerimenti riguardo possibili miglioramenti. Non ho ancora pubblicato il tutto su GitHub ma conto di farlo presto, promesso, aggiornerò conseguentemente questo articolo e anche quello vecchio che lo ha preceduto.

#StaySafe


Riconoscimenti (oltre quelli già riportati nell’articolo):
stackoverflow.com/a/68404168
stackoverflow.com/a/3437070
stackoverflow.com/a/68404168

Correzioni, suggerimenti? Lascia un commento nell'apposita area qui di seguito o contattami privatamente.
Ti è piaciuto l'articolo? Offrimi un caffè! ☕ :-)

L'articolo potrebbe non essere aggiornato

Questo post è stato scritto più di 5 mesi fa, potrebbe non essere aggiornato. Per qualsiasi dubbio ti invito a lasciare un commento per chiedere ulteriori informazioni! :-)

Condividi l'articolo con i tuoi contatti:
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Commenti
Inline Feedbacks
View all comments