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, per creare un’entità provvisoria in cui memorizzare lo stato precedente 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, men che meno creare una nuova entità da un’automazione o uno script. Ma fortunatamente la soluzione è piuttosto semplice.
Se ti interessa sapere come fare continue a leggere e sarai in grado di farlo!
Sommario
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
#================================================================================================== # python_scripts/set_state.py # modified from - https://community.home-assistant.io/t/how-to-manually-set-state-value-of-sensor/43975/37 #================================================================================================== #-------------------------------------------------------------------------------------------------- # Set the state or other attributes for the entity specified in the Automation Action #-------------------------------------------------------------------------------------------------- inputEntity = data.get('entity_id') if inputEntity is None: logger.warning("===== entity_id is required if you want to set something.") else: inputStateObject = hass.states.get(inputEntity) if inputStateObject is None and not data.get('allow_create'): logger.warning("===== unknown entity_id: %s", inputEntity) else: if not inputStateObject is None: inputState = inputStateObject.state inputAttributesObject = inputStateObject.attributes.copy() else: inputAttributesObject = {} 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 == 'allow_create': 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 allow_create: description: "Specifica se permettere di creare nuove entità (default=false, così se si sbaglia a scrivere non vengono create entità errate)" example: false other: description: "Qualunque altro valore verrà impostato negli attributi dell'entità. Se l'attributo non esiste verrà creato."
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
Solo se stai usando la versione aggiornata al 10/01/2022 (il file zip si chiama …v2.zip) puoi anche creare una entità ex novo. Questo può essere estremamente utile per creare on the fly da un’automazione o uno script un backup di una entità per poter ripristinarla dopo qualcosa.
- service: python_script.set_state data: entity_id: tmp.nuova_entita state: {{states('sensor.sensore_da_backuppare')}} allow_create: true
Tramite il codice sopra verrà creata (se non esiste) o aggiornata l’entità tmp.nuova_entità
impostandone lo stato al valore dell’entità sensor.sensore_da_backuppare
.
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):

Conclusione
Questa non era per niente complicata eh? Una volta tanto… Ora puoi impostare lo stato e gli attributi di entità a piacimento o creare nuove entità (che ricorda: saranno eliminate al riavvio di Home Assistant!)
Tieni in considerazione che è un po’ aggirare il sistema in quanto Home Assistant non prevede questa possibilità.
Ciononostante set_state è una possibilità molto utile e potente, usala con responsabilità… 🙂
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
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 😁
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)
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
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” 😀
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.
Eh certo che funzionano 😁 È un’incongruenza “by design”, il codice di HA prevede che sia così
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.
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?Pingback: Posizione delle persone con Home Assistant •
Pingback: Multinotify: il package per le notifiche su Alexa e App •