community italiana di domotica personale
 
Utilità: i (potenti) sensori bayesiani nella domotica personale, con Home Assistant

Utilità: i (potenti) sensori bayesiani nella domotica personale, con Home Assistant

SCOPI DEL PROGETTO:
  • Definire dei sensori binari i quali stati reagiscano in base a delle analisi bayesiane
  • Livello di difficoltà: medio
  • Costo: n.a.
CONCETTI AFFRONTATI:
  • Configurazione software
COMPONENTI SOFTWARE UTILIZZATE:
COMPONENTI FISICI UTILIZZATI:
  • Il computer sul quale è in esecuzione Home Assistant
  • Diverse entità (di diversa natura) da osservare e utilizzare per il calcolo
PROGETTO INDICATO a UTENTI CON ISTALLAZIONE:
Ambienti Home Assistant HassOS-Supervised-Core
NOTE E DISCLAIMER
  • qualsiasi eventuale modifica agli impianti domestici dev'essere progettata e realizzata SOLO da personale qualificato;
  • qualsiasi modifica non prevista attuata in proprio è a propria responsabilità personale nonché a proprio rischio e pericolo (i contenuti della presenta pagina hanno infatti puro scopo didattico) e fa decadere garanzia, omologazioni e certificazioni di qualità; dei dispositivi interessati;
  • tutte le tecniche descritte si intendono applicate a software e firmware aggiornati alle ultime versioni disponibili;
  • gli articoli di inDomus sono totalmente indipendenti e non sponsorizzati. Se mai questo cambiasse, verrà segnalato chiaramente sulle pagine oggetto di sponsorizzazione;
  • questa pagina è materialmente scritta e manutenuta da più individui: non ci si aspetti né si pretenda un supporto personale. In caso di difficoltà, chiedere supporto alla community sul nostro forum o sulla nostra chat;
  • se hai bisogno di orientarti, c'è la mappa.
Revisione progetto: 1.2

Abstract

In una domotica personale basata su Home Assistant, realizzare un sesore “template” che determini il proprio stato in base ad altre condizioni (a partire da altre entità, per esempio) è un gioco da ragazzi. Lo abbiamo spiegato abbastanza in dettaglio qui.

Quello che invece andiamo illustrando in questo progetto è l’adozione dei sensori Bayesiani, ovvero dei sensori i quali assumano il loro stato (binario, “on/off”) in funzione di un insieme di considizioni a contorno. Si tratta di una tecnica molto elegante che, per essere padroneggiata al meglio, dev’essere compresa alla radice.

Ecco perché spenderemo forse più tempo nel cercare di spiegare il funzionamento di questa tecnica che all’applicazione pratica in sé – la quale, una volta fatte proprie le basi, è alla fine “abbastanza” semplice da applicare.

Si parte

Assunti

Com’è naturale che sia, si assume di avere a bordo di Home Assistant – già installato e funzionante – una serie di integrazioni che diano vita a un certo numero di entità di diversa natura (sensori, luci, switch e così via).

Inoltre, a scopo di esempio daremo per assunta come attiva l’integrazione “Sun” (solitamente attiva di default sull’HUB); latitudine e longitudine di “casa” (impostata presso il menu “Zone” dell’HUB) devono essere altresì corrette.

Come funziona Bayesian

Thomas Bayes
Thomas Bayes.

Tutto nasce dall’applicazione del teorema di Bayes, un principio matematico enunciato dal reverendo Thomas Bayes (1702-1761) che descrive come aggiornare la probabilità di un evento alla luce di nuove informazioni. Tipicamente, Bayes si applica in contesti in cui bisogna rivedere una probabilità iniziale (a priori) considerando dati aggiuntivi. Viene utilizzato in molti campi, come medicina (diagnosi basate su test), intelligenza artificiale (apprendimento automatico), finanza (valutazione dei rischi) e scienze forensi (analisi delle prove). In generale, serve per migliorare le previsioni quando le informazioni disponibili cambiano.

Bene: noi lo useremo in domotica personale.

Immaginiamo di aver perso le chiavi di casa. All’inizio pensi che potrebbero essere in cucina o in salotto, perché di solito le lasci in quei posti. Poi inizi a cercare e in cucina non ci sono. A questo punto, la probabilità che siano in salotto aumenta, perché hai escluso una possibilità.

Bayes funziona proprio così: parte da una o più probabilità iniziale (dove di solito si trovano le chiavi) e la aggiorna man mano che ottieni nuove informazioni (hai controllato un posto e non erano lì).

Un altro esempio.
Supponiamo di fare un test per una malattia.

  • Il test è positivo nel 90% dei casi se la persona è malata.
  • Solo l’1% della popolazione ha la malattia.
  • Il test può sbagliare ed essere positivo nel 5% dei casi anche per chi non è malato.

Se una persona risulta positiva, qual è la probabilità che sia davvero malata? Applicando il teorema di Bayes si scoprirà quale sia la probabilità.

Nel pratico

Immaginiamo di aver bisogno di un sensore binario (“on/off”) che indichi quando siamo o non siamo a letto (magari per attivare delle automazioni come per esempio l’attivazione dell’allarme notturno, o altro). Al di là di usare altre tecniche, questo del teorema di Bayes può essere un’ottima soluzione.

Analizziamo lo scenario. C’è da domandarsi “quando si è a letto” quali siano le possibili condizioni da tenere in considerazione (ovviamente sono solo esempi):

  • è probabile che il sole sia sotto l’orizzonte;
  • è altamente probabile che il sensore di presenza posto in camera da letto ci rilevi come “presenti”;
  • per lo più il sensore di movimento in sala e in cucina non dovrebbe rilevarci;
  • forse potrebbe esserci accesa una delle due abat-jour, o entrambe;
  • se la tapparella della camera è abbassata, è molto probabile che siamo a letto

e altro.

Non è difficile capire che calare condizioni come “è probabile“, “per lo più“, “forse” in un sensore template non sia affatto facile. Appunto per questo vengono in nostro aiuto i sensori Bayesiani.

Esempio concreto

Rimaniamo nel solco tracciato sopra, ovvero quello volto a creare un sensore “di sonno” legato alle variabili proposte nell’elenco.

Un sensore Bayesiano si definisce tramite configurazione YAML con una modellazione come segue:

binary_sensor:
  - platform: bayesian
    name: #NOME DEL SENSORE
    unique_id: #ID CASUALE generato magari con https://www.uuidgenerator.net/
    prior: #la probabilità a priori dell'evento (da 0 a 1 con avanzamenti decimali). In qualsiasi momento (ignorando tutte le influenze esterne), quanto è probabile che questo evento si verifichi?
    probability_threshold: # Soglia di probabilità. (da 0 a 1 con avanzamenti decimali). 1 indica probabilità "certa" al 100%
    observations: #lista di osservazioni
      - platform: state
        entity_id: #entità da osservare
        prob_given_true: #Da 0 a 1 con avanzamenti decimali. Supponendo che il binary_sensor bayesiano sia vero, la probabilità che si verifichi lo stato dell'entità.
        prob_given_false: #Da 0 a 1 con avanzamenti decimali. Supponendo che il binary_sensor bayesiano sia falso, la probabilità che si verifichi lo stato dell'entità.
        to_state: #Lo stato da analizzare

Raccontata così – specie il blocco observations – la cosa si fa nebulosa.

La prima parte aiuta a modellare il sensore binario derivante da quanto siamo facendo:

Campo Spiegazione
prior La probabilità “a priori” dell’evento. In qualsiasi momento (ignorando tutte le influenze esterne), quanto è probabile che l’evento (in questo caso “che siamo a letto“) in assoluto si verifichi?
probability_threshold La probabilità a posteriori in cui il sensore dovrebbe attivarsi. Utilizzare valori più alti per ridurre i falsi positivi (e aumentare i falsi negativi). Nota: se la soglia è superiore a quella a priori, lo stato predefinito sarà disattivato.

è però la seconda parte a fare la vera differenza. Scopriamo perché con ulteriori esempi.

Configurazione completa

Per capire ancora meglio, proponiamo un esempio fatto e finito, sempre rimanendo nel solco dell’esempio del sensore “sonno”.

Ipotizziamo di avere in casa e integrati su Home Assistant:

  • due sensori di movimento, uno in sala e uno in cucina, chiamati rispettivamente binary_sensor.salotto e binary_sensor.cucina;
  • un sensore di presenza in camera, chiamato binary_sensor.presenza_camera;
  • due abat-jour chiamate light.letto_sinistro e light.letto_destro;
  • un attuatore per tapparelle chiamato cover.camera_letto;
  • due sensori derivanti dall’uso di Home Assistant Companion che indichino se i telefoni sono in carica o meno (sensor.smartphone_marito e sensor.smartphone_marito).

Vediamo la configurazione completa (scorrere orizzontalmente per leggere tutte le indicazioni):

binary_sensor:
  - platform: bayesian
    name: "in_bed"
    unique_id: "172b6ef1-e37e-4f04-8d64-891e84c02b43" # generated on https://www.uuidgenerator.net/
    prior: 0.25 # Passiamo circa 6 ore al giorno a letto (6/24=0,25)
    probability_threshold: 0.8 # Voglio essere abbastanza sicuro. Quindi imposto l'80% di probabilità
    observations:
      - platform: state
        entity_id: binary_sensor.salotto
        prob_given_true: 0.05 # Se siamo a letto difficilmente siamo in sala, anche se può capitare. Metto una percentuale del 5%.
        prob_given_false: 0.2 # Se non siamo a letto, 2/10 del tempo quotidiano lo passiamo in sala
        to_state: "on"
      - platform: state
        entity_id: binary_sensor.cucina
        prob_given_true: 0.03 # Stesso discorso della sala, ma per la cucina. Solo che qui ci capitiamo ancora meno 
        prob_given_false: 0.1  # Se non siamo a letto, 1/10 del tempo lo passiamo in soggiorno
        to_state: "on"
      - platform: state
        entity_id: binary_sensor.presenza_camera
        prob_given_true: 0.8 # Se siamo a letto (e non di passaggio), il sensore ci vede almeno l'80% del tempo
        prob_given_false: 0.1 # Se non siamo a letto, ma di passaggio, la possibilità che siamo a letto è bassa
        to_state: "on"
      - platform: state
        entity_id: sun.sun
        prob_given_true: 0.7 #Se siamo a letto, è probabile che il sole tramonti, ma nelle mattine d'estate potrei ancora essere a letto.
        prob_given_false: 0.45 # Se siamo svegli, allora c'è una ragionevole possibilità che il sole sia sotto l'orizzonte, soprattutto in inverno.
        to_state: "below_horizon"
      - platform: state
        entity_id: light.letto_destro
        prob_given_true: 0.4 # Quando siamo a letto, è possibile che l'abat-jour destra sia accesa
        prob_given_false: 0.05 # Quando siamo svegli, molto di rado l'abat-jour destra è accesa
        to_state: "off"
      - platform: state
        entity_id: light.letto_sinistro
        prob_given_true: 0.5 # Quando siamo a letto, è possibile che l'abat-jour destra sia accesa, un po' più della sinistra (per motivi diversi)
        prob_given_false: 0.05 # Quando siamo svegli, molto di rado l'abat-jour sinistra è accesa
        to_state: "on"
      - platform: state
        entity_id: cover.camera_letto
        prob_given_true: 0.70 # Quando siamo a letto, quasi certamente le tapparelle della camera sono abbassate
        prob_given_false: 0.8 # Quando siamo svegli, l'80% del tempo sono aperte
        to_state: "closed"
      - platform: template
        value_template: "{{ is_state('sensor.smartphone_marito','Charging') and is_state('sensor.smartphone_moglie','Charging') }}"
        prob_given_true: 0.70 # Quando siamo a letto, quasi certamente abbiamo i telefoni in carica
        prob_given_false: 0.8 # Quando siamo svegli, l'80% del tempo non capita che siano in carica contemporaneamnete

Se si legge con calma, la configurazione (e quindi la logica di funzionamento del tutto) dovrebbe essere abbastanza comprensibile.

In pratica, Bayesian funziona con i “pesi” – ovvero quanto pesa per l’appunto un determinato evento sul calcolo complessivo dello stato del sensore, stato che viene aggiornato realtime col cambiare delle condizioni a contorno prese in analisi.

Conclusioni

L’approccio descritto è estremamente comodo perché permette di mettere in analisi condizioni estremamente diverse (e apparentemente slegate) tra loro, al fine di arrivare a uno stato si/no (“on/off”) utilizzabile nei modi più disparati.

Qui abbiamo descritto come ipoteticamente realizzare un sensore “di sonno”, ma è solo una delle infinite possibilità che Bayesian su Home Assistant offre in domotica. Tutti i dettagli su questa integrazione sono forniti sulla documentazione ufficiale.

Come al solito, il limite è la fantasia.


Questa pagina è redatta, manutenuta e aggiornata dallo staff di inDomus, un gruppo di persone molto diverse tra loro che trovi, per domande e supporto, sul forum e sulla chat del sito. Alcuni link sono taggati in qualità di affiliati Amazon e riceviamo un compenso dagli acquisti idonei, utile al sostenimento del sito, ma le nostre recensioni sono tutte indipendenti e non sponsorizzate. Se ti sei perso, a tua disposizione c'è la mappa.