Al momento stai visualizzando Impostare lo stato di un’entità in Home Assistant [aggiornato]

Impostare lo stato di un’entità in Home Assistant [aggiornato]

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!

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

Crediti dello script set_state
Ho trovato questo script navigando nel forum di Home Assistant, in una discussione su altri argomenti ed ho subito capito che sarebbe stato utilissimo. Purtroppo lo riportava un utente che non era il suo autore e nello script stesso veniva riportato il link dove probabilmente aveva la genesi tale codice. Tanto mi era bastato all’inizio: l’ho riportato così come l’autore l’ha creato…
Ho però effettuato un po’ di ricerca così da attribuire a Cesare quel che è di Cesare.
L’autore originale (della versione che avevo riportato precedentemente) è Rod Payne (post, github).
Lo script modificato che permette di creare anche entità è invece di Xannor (post, github).
Onore agli autori, un piccolo script, una grande utilità!
ATTENZIONE! Ho aggiornato lo script il 10/01/2022 (lo riconosci anche dal nome del file che termina con …-v2.zip) con una nuova versione, compatibile con la precedente ma che supporta, in più, la creazione di nuove entità. Se avevi già installato tale script assicurati che la tua versione sia uguale a quella che trovi ora!

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.

Attenzione! Ricorda che l’entità creata non è permanente e al primo riavvio di Home Assistant non esisterà più.

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à… 🙂

Henrik Sozzi

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

Questo articolo ha 30 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?

  5. daniele

    Buonasera Henrik, scrivo in questo post augurandoti innanzitutto Buon Natale e Buone Feste; non è proprio specifico al tema ma parlando di entità vorrei chiederti se sei in grado di fornirmi un suggerimento per passare un po’ delle feste che ci aspettano al lavoro sulla configurazione di Home Assistant. Il mio problema (come si dice dove ‘casca l’asino’) è che si è rotto un sensore e devo sostituirlo e qui viene il fattaccio a cui non avevo pensato: come faccio a inserire il nuovo sensore con lo/gli stesso/i entity_id per non dover riconfigurare tutte le automazioni e tutte le configurazioni (es. lovelance)? A volte i device hanno più entity_id (esempio: battery, binary_ etc.) e gestirle tutte insieme come si fa? Nella guida ufficiale si parla di MANUAL CUSTOMIZATION: – ricordo che alcune versioni indietro di Home Assistant c’era un menu che configurava un file custumize.yaml che ancora ritrovo, che ne pensi? Grazie un saluto.

    1. Henrik Sozzi

      Ciao Daniele, scusa il ritardo ma con le feste potrai immaginare… 😀 Intanto buone feste anche a te!
      Se utilizzi la platform device (di solito avviene se usi l’UI per fare le automazioni e usi “dispositivo”) ad ogni dispositivo viene assegnato da Home Assistant un id random non sotto il tuo controllo, per cui se elimini il vecchio device rotto e inserisci il nuovo questo avrà un nuovo id e, conseguentemente, dovrai modificare il dispositivo ovunque l’hai usato (motivo per il quale consiglio sempre di NON usare la piattaforma device…)
      Se invece usi gli entity_id, come credo, tieni presente che le integrazioni le creano con una nomenclatura ben specifica. Ad esempio gli Shelly quando aggiungi un dispositivo dal nome, per esempio, “Luce cucina” ti creano tutti gli entity_id sulla base del nome in cui al posto degli spazi ci sono gli underscore. Nell’esempio sopra avrai cose come “switch.luce_cucina”, “sensor.luce_cucina_power”, “sensor.luce_cucina_energy”, “binary_sensor.luce_cucina_overpower” e così via.
      Se hai “fatto casino” e vuoi riportare l’ordine negli entity_id (ad esempio perchè hai dato il nome allo shelly dopo averlo aggiunto ad HA) basterà rinominare il dispositivo e HA ti chiederà se vuoi rinominare le entità sulla base del nome scelto, premi RINOMINA e voilà.
      Quindi se avevi un device ordinato con le entity_id secondo questo schema basta eliminare il vecchio device e aggiungere il nuovo nominandolo come quello precedente e tutte le entità avranno nome uguale a quelle precedenti, lasciando tutte le automazioni funzionanti.
      Occhio che se aggiungi il device con il vecchio ancora integrato avrai tutte le entità che finiscono con “_2” che poi dovrai rinominare a mano.
      Altra possibilità, utile nel caso in cui il tuo vecchio device avesse entity_id non nominati in modo regolare con il device, è quella di segnarti tutti gli entity_id che usavi precedentemente, eliminare il vecchio device, integrare il nuovo e rinominare ogni entity_id con lo stesso che ti eri segnato da quello precedente.
      Per le automazioni basta che gli entity_id siano uguali e continuano a funzionare.
      Per far tutto questo non serve il customize.yaml o altro.
      Un saluto, buon lavoro sul tuo HA 🙂

  6. daniele

    Grazie Henrik come al solito accendi la luce, per questo darò il mio sostegno 2023 per il tuo blog (lunga vita al blog H.E.Tech 🙂 , mi piacerebbe che questo fosse lo spunto per un tuo nuovo articolo, perchè credemi, per novizi come il sottoscritto, non è per nulla scontato questo problema della definizione delle entità, anzi si parte usando UI e poi la vita si complica (anche se il mio home assistant è una macchina che va perfettamente e fa un sacco di cose anche così), ma in rete non mi sembra ci sia una guida chiara nel merito.

    Personalmente, guardando il mio file automation.yaml e spulciando i trigger, direi che ho creato varie automazioni con platform: device
    es:
    trigger:
    – type: opened
    platform: device
    device_id: 7ebb1052d9eb73a89c4540cd…….
    entity_id: binary_sensor.shelly_porta_..xxx

    Ma come vedi c’è sia device_id che entity_id. Significa che non funzionerà rinominando solo l’entity_id?
    E se così fosse, posso rimediare cancellando dal trigger i vari device_id lasciando solo entity_id, funzionerebbe?
    Un saluto.

    1. Henrik Sozzi

      Ciao Daniele, grazie di cuore per la donazione ancor più generosa delle precedenti, credimi è davvero apprezzata!
      Mi hai dato un bello spunto per un possibile articolo in effetti perché è vero che non c’è materiale di questo tipo, ti ringrazio e credo coglierò il suggerimento.
      So che con platform: device si possono essere sia il device_id che l’entity_id ma a dire il vero non so cosa succede se uno solo dei due diventa errato in quanto non lo uso mai e anche la pagina della documentazione a riguardo è davvero scarna…
      Il mio consiglio è di trasformare ogni trigger platform: device in platform: state sistemando la sintassi così che ti metti nella condizione giusta per non aver problemi in questi casi in futuro.
      Controlla anche nelle condizioni e nelle azioni. In queste ultime, per esempio, l’accensione di una luce diventerebbe qualcosa come:
      - alias: "Accende la luce della cucina"
      service: light.turn_on
      target:
      entity_id: light.luce_cucina

      Vedrai che se elimini ogni platform: device, organizzi tutto in package, metti ordine tra i dispositivi e i relativi entity_id e infine usi VSCode (come addon o standalone sul PC) per editare i package avrai notevole beneficio.
      PS: ho anche in mente qualcosa di più strutturato per imparare automazioni, script e creazione di sensori, passando per i template… Ma è ancora top secret, anche perché prima devo trovare il tempo…

  7. Paolo

    Buonasera Henrik. Grazie per questo interessante tutorial. Purtroppo non conosco Python abbastanza da riuscire a capire come modificare il tuo script per poterlo utilizzare per il mio scopo. In pratica dovrei fare in modo di cambiare lo stato dell’entità senza però forzarla a mantenere lo stato indicato in fase di chiamata del servizio python_script.set_state. Mi spiego meglio seguendo un tutorial ho moficato il file di configurazione per fare in modo che i comandi vocali che do ad Alexa vengano inviati a un’entità denominata sensor.last_called_summary e ho costruito un’automazione che si attiva ogni volta che viene dato uno specifico comando vocale. Il problema sorge quando ripeto lo stesso comando più volte di seguito perchè non essendoci di fatto una variazione di stato nell’entità sensor.last_called_summary l’automazione non si attiva nuovamente. Quello che vorrei ottenere chiamando il tuo script alla fine della mia automazione, è cancellare lo stato dell’entità sensor.last_called_summary , o comunque impostarla ad uno stato prefissato solo fino a quando non arriverà un nuovo comando vocale a cambiare lo stato dell’entità. Saresti così gentile da dirmi come andrebbe modificato il tuo script per poter ottenere questo risultato? Tieni presente che i comandi vocali Alexa che modificano l’entità sensor.last_called_summary vengono sovrascritti solo quando arriva un nuovo comando vocale. Grazie per la tua attenzione.

    1. Henrik Sozzi

      Ciao Paolo, lo stato che imposta set_state non è per nulla permanente. Penso che funzionerebbe per il tuo scopo, anche se set_state è sempre un po’ una forzatura impostando un valore “dietro alle quinte”. E’ pur vero che con Alexa lo uso anch’io (in multinotify) proprio per sopperire a mancanze dell’integrazione (vedi volume_level che si resetta ad ogni riavvio di HA…) provalo, secondo me funziona così com’è 🙂

  8. Paolo

    Ciao Enrik. Grazie per la pronta risposta. Ho riprovato controllando attentamente quanto avveniva allo stato dell’entità tramite lo strumento degli sviluppatori, e in effetti hai ragione tu. Il tuo script così com’è fa esattamente quello che serve a me, e la modifica non è permanente. Il problema è da qualche altra parte, nascosto nel codice che ho inserito nel blocco di configurazione. Sto cercando di venirne a capo. Grazie infinite per l’aiuto.

    1. Henrik Sozzi

      Ti dico la verità, questo commento mi ha un po’ infastidito. Non per colpa tua ma perchè pensare che qualcuno (te in questo caso) abbia potuto pensare che avessi voluto appropriarmi degli onori del lavoro di qualcun altro mi ha disturbato. Se tu mi conoscessi sapresti che io sono l’esatto opposto e mi fa anzi piacere riportare sempre gli autori delle cose che cito proprio per non appropriarmi indebitamente di lavoro non mio, che è una pratica che mi fa “arrabbiare” molto.
      Capisco il tuo commento, tu non mi conosci e là fuori è pieno di gente che non ha problemi a far suo il lavoro degli altri, purtroppo. E non sei tenuto a conoscermi quindi pensare che io non avessi ringraziato a bella posta gli autori ci può anche stare (anche se personalmente avrei adottato con uno sconosciuto il principio della presunzione d’innocenza…)
      Ti ringrazio comunque perchè mi hai dato modo di rileggere l’articolo e dato lo spunto per ricercare la genesi di quel codice e inserirne quindi i dovuti crediti nell’articolo.
      Come ho aggiunto nell’articolo avevo trovato lo script navigando nel forum di HA e un utente lo riportava (non il suo autore). Appena visto ho capito che poteva essere molto utile, me lo sono quindi salvato.
      Non avendo informazioni sull’autore mi sono limitato a riportare lo script così com’era, con l’header dove veniva riportato il link della discussione HA in cui è nato (che è quello che mi hai riportato te, a parte il post di riferimento). Se l’autore avesse voluto riportare i suoi dati di paternità avrebbe potuto semplicemente inserirli nello script e io l’avrei riportato pari pari, ma non l’ha fatto.
      Ad ogni modo ho scavato nel post in questione e nei repo github per capirne la paternità che ho riportato con dovizia di particolari nell’articolo.
      Non credo che nessuno possa dire con mano sulla coscienza che volevo appropriarmi del lavoro d’altri ma sono comunque felice di aver riportato i giusti crediti di paternità.

  9. Alfonso

    salve, volevo una info, ho dei attuatori delle tapparelle che non mi restituiscono lo stato se e chiusa o aperta, ma con questa funzione di home assistant, riesco ad assegnare uno stato quanto e chiuso e quando e aperto? grazie per l’aiuto. saluti

    1. Henrik Sozzi

      Ciao (dammi del tu!), si, con questo script potresti “forzare” lo stato dell’entità cover su open e close dopo un certo tempo in cui stai aprendo o chiudendo ma non è proprio questo il senso di questo script perchè è una po’ una “forzatura” di come funziona Home Assistant.
      Nel tuo caso, secondo me, non avendolo mai provato, sarebbe meglio cercare di risolverlo in modo “lecito” ovvero creando un’entità cover in optimistic mode, che fai lui internamente il ragionamento (che non sarà mai perfetto ma dovrebbe prenderci abbastanza): https://www.home-assistant.io/integrations/cover.template/

      1. Alfonso

        ciao, grazie per la risposta, come faccio ad associare lo stato ad ogni entità creando questa cover.

        grazie.

        1. Henrik Sozzi

          Detto con tutta onestà non l’ho mai provato a fare (io uso Shelly 2.5 che funzionano riportando lo stato anche in percentuale di chiusura senza dover far nulla di strano) ma la pagina di documentazione che ti ho linkato nel commento precedente sembra piuttosto chiaro. Direi che puoi partire dal primo esempio ed elaborare a tuo uso e consumo. Ricorda che, non avendo tu un sensore di stato aperto/chiuso/posizione, devi usare l’optimistic mode che mantiene internamente uno stato “calcolato” (così dice la documentazione).

  10. robypana

    Ciao, ho dei motori Nice per avvolgibili orientabili che vengono attivati ad impulso, contatto pulito su 3 fili (salita, discesa, comune), 2 pulsanti, con 1 pulsante abbasso l’avvolgibile fino in fondo aprendo meccanicamente le lamelle, con l’altro alzo aprendo completamente, infine premendo entrambi va in posizione memorizzata dal motore che è a lamelle chiuse (per me la chiusura dell’avvolgibile).
    Ho dato un’occhiata al cover.template ma nel mio caso non credo funzioni perchè lo stato dei pulsanti torna subito off (auto off impostato a 0.1, sto provando lo Smart Implant di Fibaro che ha 2 contatti puliti).
    Pertanto per recuperare lo stato in cui sono gli avvolgibili devo gestire le casistiche sulle pressioni dei pulsanti e dovrei usare lo script per settare lo stato del sensore che devo creare per ogni avvolgibile, corretto?
    O hai altri suggerimenti?
    Grazie,
    R.

  11. Alex

    Ciao Henrik, con il tuo script è possibile impostare nell’attributo di un sensore il contenuto di un file di testo? Se si come si fa? Ho un testo molto lungo contenuto in un file che vorrei inserire in un attributo di un sensore (supera sicuramente i 255 caratteri max dello state del sensore). Grazie

  12. Dario

    Ciao Henrik,
    grazie per aver condiviso questo Python script. E’ molto interessante.
    Nel mio caso l’ho utilizzato per un climatizzatore controllato da HA che, quando è necessario grazie ad una automazione, deve interrompere ciò che sta facendo (scaldare, raffreddare oppure niente) per forzare la ventilazione nella stanza per un certo numero di minuti filtrando l’aria alla massima velocità. Terminato questo periodo di tempo deve riprendere a fare ciò che faceva prima (scaldare, raffreddare spegnersi ecc…) e tutto questo funziona egregiamente grazie alla tua idea.

    Nella realtà io ho piú di un climatizzatore controllato da HA e, visto che sono “pigro”, vorrei usare un solo script parametrizzando la sua chiamata dall’automazione che fornirà quindi anche l’ entità da coinvolgere secondo le necessità. Così la manutenzione sarà più agevole.

    Quindi io chiamo il mio script in HA fornendo come parametro obbligatorio l’entità su cui si vuole agire (p.es climate.soggiorno) questa entità viene salvata inizialmente nella variabile “{{climatizzatore}}” poi in seguito viene creata una entità temporanea che si chiamerà “tmp_{{climatizzatore}}” per salvare lo stato originale e non confonderla con le altre entità temporanee e poi, grazie al tuo script, ripristinarla in seguito

    A questo punto innesco il tuo script per richiedere lo state del climatizzatore in parametro (cioè cosa sta facendo in questo momento) e la velocità della ventola (attribute -> fan_mode)

    Qui nasce il problema se chiamo il tuo script palesando il nome della entità (p.es climate.soggiorno quindi con uno script per ciascun climatizzatore ) tutto funziona ma, se lo chiamo utilizzando la variabile states(‘{{climatizzatore}}’) , il tuo script ritorna sempre “unknown” sia come State sia come Attribute del Fan_mode come se Python non riuscisse a risolverla.

    Ti lascio un frammento del mio script in questione dove vengono impostati i parametri iniziali e relative variabili

    alias: Climatizzatori ventilazione forzata
    fields:
    climatizzatore:
    selector:
    entity: {}
    name: Climatizzatore
    description: Climatizzatore coinvolto
    required: true

    variables:
    clima_save: tmp_{{climatizzatore}}

    sequence:
    – service: python_script.set_state
    metadata: {}
    data:
    entity_id: “{{ clima_save }}”
    state: “{{states(‘{{climatizzatore}}’)}}”
    fan_mode: “{{state_attr(‘{{climatizzatore}}’, ‘fan_mode’) }}”
    allow_create: true

    …… tutte le altre sequenze per effettuare i cambiamenti nei climatizzatori e forzare la ventilazione aspettare un certo tempo e terminare con la sequenza di recupero delle informazioni originali salvati nella entità {{ clima_save }} ….

    – service: climate.set_hvac_mode
    metadata: {}
    data:
    hvac_mode: “{{states(‘{{ clima_save }}’)}}”
    target:
    entity_id: “{{climatizzatore}}”
    enabled: true
    – service: climate.set_fan_mode
    metadata: {}
    data:
    fan_mode: ” {{state_attr(‘{{ clima_save }}’, ‘fan_mode’) }}”
    target:
    entity_id:
    – “{{climatizzatore}}”
    enabled: true

    Hai idea di dove io possa agire per far comprendere a Python il contenuto della variabile {{climatizzatore}} ?

    Grazie per la tua attenzione

    Dario

    1. Henrik Sozzi

      Ciao, stai andando nella stessa direzione dove tendo sempre anch’io: avere una unica automazione che gestisce situazioni omologhe. Io lo faccio, ad esempio, con le finestre aperte. Quando si apre una finestra in una stanza spengo il riscaldamento di quella stanza e dopo un tempo configurabile Alexa comincia a ricordare che è ora di chiudere le finestre di quella stanza, ciclicamente ogni x tempo configurabile. Infine quando si chiudono tutte le finestre della stanza riapplico la temperatura che c’era prima. E questo lo faccio con una unica automazione che agisce su ogni stanza, andando a rilevare il termostato nella stessa stanza della finestra che si è aperta o chiusa in modo dinamico.
      E per ripristinare la temperatura uso anch’io uno script a cui passo l’entità climate e nello script per ognuna di esse faccio delle elucubrazioni sullo stato di persone, dispositivi ed altro così da valutare a che temperatura impostare l’ambiente. In tal modo basta fare delle automazioni che rilevino il cambio stato e richiamare lo script che imposterà la temperatura più adeguata alla condizione di quel momento.
      Detto questo, per farti capire quanto sono in sintonia con il tuo modo di pensare, ti dico perchè secondo me non funziona il tuo script, è una banalità che ti farà esclamare il nome di qualche divinità arcaica… 😀
      Il campo “climatizzatore” che hai dichiarato contiene una stringa (perchè quello gli passi quando la richiami. Che poi sia una stringa che contiene il nome di un’entità lo sai tu ma per HA è una semplice stringa, potrebbe essere anche “pippo”).
      Di conseguenza quando vai ad utilizzarla nel seguente codice: state: “{{ states(‘{{climatizzatore}}’) }}” non funzionerà perchè alla stringa aggiungerà le virgolette semplici (ricordi? E’ già una stringa). Prova ad usare questa sintassi invece: state: “{{ states(climatizzatore) }}” e buon lavoro 🙂
      Ciao

    2. Henrik Sozzi

      Ti do un suggerimento che spero possa aiutarti quanto penso.
      Con i template impara ad usare Strumenti per sviluppatori -> Modelli, fai tutte le prove lì e riduci notevolmente il ciclo scrivi, prova, modifica perchè vedi i risultati in tempo reale.
      Per simulare un campo basta che ne assegni il valore ad una variabile che si comporterà allo stesso modo poi nel codice.
      Nel tuo caso basterà scrivere una cosa come:
      {% set climatizzatore = 'climate.camera' %}
      e potrai in seguito provare i template che generano quel che desideri.
      Ti posto un esempio completo che puoi incollare nella casella di testo del modello (sostituisci ‘climate.camera’ con il nome di un’entità che hai tu, ovviamente):
      {% set climatizzatore = 'climate.camera' %}
      states('{{'{{'}}climatizzatore}}') = {{ states('{{climatizzatore}}') }}
      states(climatizzatore) = {{ states(climatizzatore) }}

      Il risultato che vedrai a destra è il seguente:
      states('{{climatizzatore}}') = unknown
      states(climatizzatore) = auto

      Buon lavoro 🙂

  13. Dario

    …. le virgolette. Non ci avevo pensato. E anche l’utilizzo dei modelli per il debug degli script non lo avevo provato e fino ad ora mi sembrava una funzione poco utile.
    👍Bingo! Grazie

Rispondi

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.