You are currently viewing Impostare lo stato di un’entità in Home Assistant

Impostare lo stato di un’entità in Home Assistant

  • Autore dell'articolo:
  • Categoria dell'articolo:Home Assistant
  • Commenti dell'articolo:9 commenti
  • Ultima modifica dell'articolo:28 Aprile 2021

Dopo un po’ di esperienza configurando automazioni a molti insorge l’esigenza di impostare lo stato di un’entità in Home Assistant.

Può essere utile per impostare lo stato di un’entità di tipo device_tracker in base alla rete WiFi collegata allo smartphone, per forzare uno stato di un’entità da un’automazione o per simulare qualcosa.

Per qualunque fine ci serva ci scontreremo presto con il fatto che non è possibile impostare lo stato o l’attributo di un’entità in modo nativo in Home Assistant ma fortunatamente la soluzione è piuttosto semplice.

Se ti interessa sapere come fare continue a leggere e sarai in grado di farlo!

Abilitare gli script Python

Come prima cosa dovremo abilitare la possibilità di creare degli script scritti in linguaggio Python nella nostra configurazione di Home Assistant.

Farlo è molto semplice, basta inserire la seguente riga nel nostro configuration.yaml o in un package:

python_script:

Sarà inoltre necessario creare la cartella python_scripts all’interno della nostra cartella config.
In tale cartella si potrà quindi creare un file .py per ogni script python che vorremo utilizzare.

Se poi vorremo documentare i parametri dei nostri script, come faremmo con uno script scritto in yaml (ad esempio vedi il mio script multinotify), basterà creare un file services.yaml nella cartella python_scripts appena creata, nel quale inserire la definizione di ogni script con la descrizione ed i campi, senza il corpo dello script. Fate attenzione che il nome delle definizioni nel file services.yaml devono corrispondere ai nomi dei file .py, che sono anche i nomi dei servizi da richiamare per eseguire tali script.

Per ulteriori indicazioni fare riferimento alla guida ufficiale.

Creare lo script set_state per impostare lo stato di un’entità in Home Assistant

Per creare lo script set_state scarica lo zip di seguito e scompattane il contenuto nella cartella config/python_scripts.

In alternativa puoi fare copia/incolla creando i seguenti due file sempre nella cartella config/python_scripts:

set_state.py

#--------------------------------------------------------------------------------------------------
# Imposta lo stato o altri attributi per l'entità specificata.
#--------------------------------------------------------------------------------------------------

inputEntity = data.get('entity_id')
if inputEntity is None:
    logger.warning("===== entity_id is required if you want to set something.")
elif hass.states.get(inputEntity) is None:
    logger.warning("===== unknown entity_id: %s", inputEntity)
else:
    inputStateObject = hass.states.get(inputEntity)
    inputState = inputStateObject.state
    inputAttributesObject = inputStateObject.attributes.copy()

    for item in data:
        newAttribute = data.get(item)
        logger.debug("===== item = {0}; value = {1}".format(item,newAttribute))
        if item == 'entity_id':
            continue            # already handled
        elif item == 'state':
            inputState = newAttribute
        else:
            inputAttributesObject[item] = newAttribute
        
    hass.states.set(inputEntity, inputState, inputAttributesObject)

services.yaml

# set_state.py
set_state:
  description: Imposta lo stato e/o gli attributi di una entità ai valori desiderati
  fields:
    entity_id:
      description: Nome completo dell'entità da aggiornare
      example: device_tracker.mio_tracker
    state:
      description: Nuovo valore dello stato dell'entità (opzionale)
      example: not_home
    other:
      description: Qualunque altro valore verrà impostato negli attributi dell'entità

Al termine riavviare il core di Home Assistant da Impostazioni -> Controlli del server -> Gestione del server -> RIAVVIARE.

Come utilizzare lo script set_state per Impostare lo stato di un’entità in Home Assistant

Home Assistant creerà un servizio per ogni file .py presente nella cartella python_scripts con nome python_script.NOME_FILE. Pertanto, per il file set_state.py, avremo il servizio python_script.set_state.

Per richiamarlo basterà utilizzare questa sintassi all’interno di una lista di azioni (automazioni o script):

- service: python_script.set_state
  data:
    entity_id: device_tracker.mio_smartphone
    state: home

Tramite il codice sopra riportato lo stato dell’entità device_tracker.mio_smartphone sarà impostato a home.

Abbiamo anche la possibilità di impostare gli attributi di un’entità, semplicemente specificando come parametri ulteriori i nomi degli attributi da impostare.

Per esempio possiamo impostare lo stato e la sorgente tramite l’attributo source_type con questo codice:

- service: python_script.set_state
  data:
    entity_id: device_tracker.mio_smartphone
    state: home
    source_type: wifi

Per fare delle prove ti potrebbe essere utile usare Strumenti per sviluppatori -> Servizi nel seguente modo (la descrizione dei parametri nella parte inferiore è presente grazie al file services.yaml):

Impostare lo stato di un'entità in Home Assistant tramite Strumenti per sviluppatori -> Servizi

Conclusione

Questa non era per niente complicata eh? Una volta tanto… Ora puoi impostare lo stato e gli attributi di entità a piacimento.

Tieni in considerazione che è un po’ aggirare il sistema in quanto Home Assistant non prevede questa possibilità. Ad esempio aggiornando un’entità device_tracker è possibile che lo stato ritorni quello impostato precedentemente per un aggiornamento dall’integrazione collegata a tale entità.

Ciononostante set_state è una possibilità molto utile e potente, usala con responsabilità… 🙂

Henrik Sozzi

Sono un analista programmatore per lavoro e per passione. Amo la domotica, la stampa 3D e la tecnologia in generale.

Questo articolo ha 9 commenti.

  1. Gianluca

    Ciao e grazie per i tuoi utili articoli. Ti chiedo una conferma da non esperto. Ma il file “services.yaml” e’ obbligatorio inserirlo nella cartella ? O si puo anche omettere ed usare solo il primo script, “set_state” ? Da quanto ho capito, quello indicato nel file “services.yaml” lo imposta gia all’ avvio di HA. Invece usando lo script “set_state” , viene impostato esempio in un automazione. Giusto?
    Grazie

    1. Henrik Sozzi

      Ciao, il file services.yaml è opzionale (magari poi lo specifico meglio) e serve solo per documentare gli script Python ed i loro parametri (ne vedi il risultato in strumenti per sviluppatori). Se non c’è funziona tutto ugualmente ma in strumenti per sviluppatori non vedi le descrizioni, tutto lì.
      Però secondo me è sempre meglio documentare tutto per evitare che dopo mesi che hai fatto qualcosa non ti ricordi più come funzioni. Credimi, da programmatore ne so qualcosa 😁

  2. daniele calzetti

    Buonasera, a me rimanda questo errore

    Logger: homeassistant.components.automation.allarme_on_arma_at_night
    Source: components/automation/__init__.py:517
    Integration: Automazione (documentation, issues)
    First occurred: 27 giugno 2021, 18:20:41 (8 occurrences)
    Last logged: 0:07:06

    Error while executing automation automation.allarme_on_arma_at_night: Unable to find service python_script.set_state
    Error while executing automation automation.allarme_on_arma_at_night: Unable to find service python_scripts.set_state

    Ho notato che la directory è python_scripts mentre in service: python.script.set_state, ma cambiando in scripts il risultato è il medesimo.
    (la mia automazione arma l’allarme di sistema non integrato e quindi non usando il servizio contemporaneamente vorrei cambiare stato ad alarm_control_panel.home.alarm in state: arming per attivare il pannello anche in lovelace)

    1. daniele calzetti

      Stupidamente mi ero dimenticato la prima nozione dell’articolo inserire “python_script:” nel file configuration.yaml, Mi rimane la curiosità di come mai si richiama in configurazione python_script e la directory si chiama python_scripts, e sicuramente questo denota che mi mancano le basi 🙂 !!! grazie un saluto

      1. Henrik Sozzi

        Ciao, scusa ti rispondo in ritardo ma credo di averti già risposto sul gruppo Facebook 😉
        L’incongruenza che denoti è effettivamente vera. Sarebbe stato più giusto che l’attivazione si chiamasse “python_scripts:” al plurale, come d’altronde si chiama la cartella. Ma ricordiamoci sempre che Home Asssitant è open source e ci lavorando in diversi. A volte le cose non sono perfette, sono realizzate con buona volontà da tanti che lo fanno nel loro tempo libero per la gloria del progetto. E considerando quanto ha rivoluzionato ed è importante per casa mia… io gli perdono la “s” 😀

  3. daniele calzetti

    Grazie della risposta, però ti dico che nonostante l’incongruenza (cioè ho scritto in configuration.yaml python_script e la cartella l’ho chiamata python_scripts come da guida) le cose sembrano funzionare lo stesso.

    1. Henrik Sozzi

      Eh certo che funzionano 😁 È un’incongruenza “by design”, il codice di HA prevede che sia così

  4. maxbarba

    Grazie Henrik !!! mi è servito per cambiare lo stato dei sensori di presenza Aqara che rimangono on per molti secondi.
    Con la modifica hardware e il tuo articolo adesso rispondono ogni 5 secondi.

    1. Henrik Sozzi

      Ciao Maxbarba! Grazie per il feedback! Interessante… Fino ad oggi la soluzione al tempo di ON con i sensori modificati con ZHA pensavo fosse un’automazione che chiamasse il servizio zha.set_zigbee_cluster_attribute verso il sensore (come documentato su Home Assistant Community). Invece tu dopo il tempo hardware di ON cambi lo stato dell’entità… Non ci avevo pensato, sembra un’ottima soluzione! Ma quindi se dopo, ad esempio, 6 secondi, c’è altro movimento torna ancora in ON, giusto?

Rispondi