community italiana di domotica personale
 
Dedurre il sonno degli inquilini in una casa domotica con Home Assistant

Dedurre il sonno degli inquilini in una casa domotica con Home Assistant

SCOPI DEL PROGETTO:
  • Utilizzare un approccio deduttivo per determinare lo stato di addormentamento degli inquilini di un ambiente
  • Livello di difficoltà: basso
  • Costo: n.a.
CONCETTI AFFRONTATI:
COMPONENTI SOFTWARE UTILIZZATE:
DISPOSITIVI FISICI UTILIZZATI:
  • Il computer sul quale è in esecuzione Home Assistant
  • Un sensore domotico necessario alla determinazione dello stato (spiegato nel progetto)
  • Vari (vedi progetto)
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;
  • 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.4

Abstract

domire smallPotrebbe sembrare una battuta, ma non la è: dedurre lo stato di addormentamento di una famiglia tramite la domotica personale è tutto fuorché superfluo.

Automatizzare i comportamenti di una casa dotata di domotica personale rispetto alla presenza o all’assenza degli inquilini non è particolarmente difficile, sopratutto quando si usano HUB personali come Home Assistant, Homey o ecosistemi come Apple HomeKit. Solitamente è sufficiente configurare la relativa app di gestione sugli smartphone di tutta la famiglia per far in modo che, all’uscita di tutti gli elementi (o al ritorno anche di un solo membro), la domotica provveda ad eseguire delle azioni (predefinite) in piena autonomia.

La fase di sonno è una delle più importanti della giornata: il riposo, come è noto, è sacro. Conoscere tale fase dal punto di vista della domotica personale, come accennato sopra, può essere particolarmente utile per attivare, durante la notte, degli automatismi importanti, come per esempio l’armo del sistema d’allarme in modalità “presenza” (ovvero attivare il solo monitoraggio dell’apertura dei varchi); anche la chiusura automatica dell’erogazione di acqua e gas può essere utile, così come lo spegnimento di intere sezioni dell’impianto elettrico non in uso durante la notte.

Uno dei modi più banali per fornire questa importante informazione alla propria domotica è quello di utilizzare dei componenti fisici, come per esempio questo interruttore giorno/notte, il quale una volta integrato al proprio ecosistema permette di infornre l’informazione in modo manuale.

Questo progetto è volto a definire, presso Home Assistant, un’entità di tipo “Template Binary Sensor” che determini, empiricamente, quando sia possibile considerare la famiglia “dormiente” (stato “ON“) e quando no (stato “OFF“).
Vedremo infine come utilizzare in ambito automazione questo tipo di sensore.

N.b. Questo progetto non ha la presunzione di risolvere la questione, ma solo di innescare il ragionamento in piena ottica didattica. È infatti evidente come la specificità di ogni casa, di ogni famiglia, influenzi la risoluzione del problema.

Analisi

Come anticipato, l’idea è quella di definire un “Template Binary Sensor” che, sulla base dell’osservazione empirica di una o più metriche, determini se la famiglia stia dormendo o meno.

In primis, è necessario assumere l’esistenza di un’entità di tipo gruppo la quale rappresenti il raggruppamento logico dei “Device Tracker“, i quali singolarmente rappresentino i membri della famiglia. Indipendentemente dalle piattaforme utilizzate per definire tali tracker, assumeremo che tale gruppo si chiami “group.famiglia“, il quale possa assumere (automaticamente, per natura) i valori “home” e “not_home” (ovvero “in casa” e “fuori casa”). Lo stato “home” è presente quando almeno un elemento della famiglia risulti in casa, mentre “not_home” quando tutti gli elementi siano fuori casa.

A seguire vedremo varie tecniche per stabilire più o meno efficacemente la fase di sonno o di veglia.

Sensore

Definire è un “Template Binary Sensor” è piuttosto elementare. È infatti sufficiente introdurre in configurazione un blocco di questo tipo:

binary_sensor:
  - platform: template
    sensors:
      sonno_famiglia:
        value_template: ""

Il campo “value_template” è l’artefice dello stato che, nel tempo, il sensore andrà ad assumere.
Se su Home Assistant fosse presente una luce chiamata “light.tavolo” e realizzassimo un sensore come segue:

binary_sensor:
  - platform: template
    sensors:
      stato_luce:
        value_template: "{{ is_state('light.tavolo','on') }} "

il conseguenziale sensore “binary_sensor.stato_luce” presenterebbe stato “on” ogni qual volta la luce venisse accesa e “off“, al contrario, quando spenta. In sostanza, quando la condizione indicata nel campo “value_template” è vera, lo stato del “Template Binary Sensor” assume valore “on“.

Quel che faremo è quindi definire dei “value_template” che valutino lo stato presenza della famiglia e una serie di altri stati.

In base all’orario

La più semplice delle scelte, ma anche la più imprecisa. Assumiamo quindi che la famiglia, in una certa fascia oraria (diciamo dall’1 alle 7 del mattino), se presente in casa stia dormendo.

La configurazione potrebbe essere la seguente:

binary_sensor:
  - platform: template
    sensors:
      sonno_famiglia:
        value_template:  >
          "{{
          is_state('group.famiglia','home')
          and
          now().strftime('%T') > '01:00' and now().strftime('%T') < '07:00'
          }}"

dato che la condizione “value_template” sarà vera solo in presenza della famiglia e tra l’una e le sette, in quel caso “binary_sensor.sonno_famiglia” assumerebbe stato “on“.

In base alle luci

A meno di essere dei vampiri, solitamente di notte si dorme con le luci spente.
Ricordiamo la presenza (automatica) di un gruppo “group.luci” che rappresenta, appunto, tutte le luci integrate a Home Assistant (realizzato a mano includendovi tutte le luci): tale gruppo assume stato “off” quando tutte le luci sono spente.

Andando a variare il sensore di cui sopra, aggiungiamo anche questa condizione:

binary_sensor:
  - platform: template
    sensors:
      sonno_famiglia:
        value_template:  >
          "{{
          is_state('group.famiglia','home')
          and
          now().strftime('%T') > '01:00' and now().strftime('%T') < '07:00'
          and
          is_state('group.luci','off')
          }}"

le tre condizioni sono tutte e tre in AND, pertanto la condizione complessiva del sensore diventa vera (e quindi il sensore “on“) solo tra l’una e le sette, se la famiglia in casa e le luci sono spente.

In base al rumore

Se disponiamo, infine, di un sensore di rumorosità (per esempio un Broadlink A1 e-Air o, meglio ancora, una stazione clima/ambiente Netatmo o analoghi), possiamo sfruttare questa funzionalità per definire lo stato di riposo.

Nel secondo caso (Netatmo) avremmo a disposizione non un’indicazione generica (con Broadlink A1 si ottiene una lettura abbastanza grossolana, ma comunque valida) ma una puntuale: il numero di dB rilevati nella stanza in cui è collocato il sensore. Dopo averlo integrato e dopo un necessario periodo di osservazione empirica (atta a comprendere quale sia il livello di rumorosità notturna) potremmo infatti definire un sensore che, valutando anche (o solo) il numero di decibel, determini se si stia dormendo o meno.

Dando per scontato il sensore “sensor.netatmo_noise” (derivante dall’integrazione della stazione Netatmo), modifichiamo ancora al configurazione di cui sopra:

binary_sensor:
  - platform: template
    sensors:
      sonno_famiglia:
        value_template: >-
          "{{
          is_state('group.famiglia','home')
          and
          (now().hour > 1 and now().hour < 7)
          and
          is_state('group.luci','off')
          and
          (states('sensor.netatmo_noise') | int(default=0) < 30)
          }}"

In questo esempio il “Template Binary Sensor” assumerà stato “on” solo tra l’una e le sette di notte, con le luci spente, un rumore inferiore ai 30dB e la famiglia presente in casa.

Uso del sensore

Modellato il nostro sensore “binary_sensor.sonno_famiglia” è pronto per l’uso – tipicamente in ambito automazione.

Il primo esempio è quello dell’uso come trigger per innescare delle attività notturne. Poniamo infatti di volere chiudere acqua e gas (assumiamo la presenza degli switch “switch.acqua” e “switch.gas“) e di voler attivare un allarme integrato con Home Assistant (entità “alarm_control_panel.allarme“) in modalità “armato notturno”:

automation:
  trigger:
    platform: state
    entity_id: binary_sensor.sonno_famiglia
    to: 'on'
    for:
      minutes: 30
  condition: []
  action:
    - service: alarm_control_panel.alarm_armed_night
      data:
        entity_id: alarm_control_panel.allarme
        code: 1234 #codice personale
    - service: switch.turn_on
      entity: switch.acqua, switch.gas

Si noti l’uso del “for” nella sezione trigger: dato che “binary_sensor.sonno_famiglia” è soggetto, per sua stessa natura, a fluttuazioni di stato, l’uso del “for” garantisce che il suo stato sia stabile per almeno 30 minuti prima di innescare l’automazione.

Analogamente, “binary_sensor.sonno_famiglia” può essere utilizzato come elemento condizionale sia nelle automazioni che in altri ambiti (per esempio negli script).

Nella seguente automazione:

automation:
  trigger: [] #indicare uno o più trigger
  condition:
    condition: state
    entity_id: binary_sensor.sonno_famiglia
    state: 'on'
  action: [] #indicare una o più action

quale sia il trigger, l’action (quale sia a sua volta) viene eseguita solo in presenza di stato “on” del sensore “binary_sensor.sonno_famiglia” , quindi in caso la famiglia sia addormentata. Viceversa, impostando il valore a “off“, l’esecuzione viene garantita solo in stato di veglia.

Per i più coraggiosi

Consigliamo ai più arditi di prendere visione del sensore Bayesiano disponibile su Home Assistant: esso permette di applicare il teorema di Bayes per il calcolo della probabilità del verificarsi degli eventi. Tale teorema – tramite tale piattaforma – può essere applicato per determinare la probabilità che la famiglia sia andata a dormire, in integrazione alle considerazioni di cui sopra.

⚠️ Se di Home Assistant ne sai poco ma sei interessato a capirne di più, ti suggeriamo di partire da qui.

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. Se ti sei perso, a tua disposizione c'è la mappa.