Script correzione temperatura valvole: funziona!

12357

Commenti

  • Si, in configuration.yaml ho riportato un include per i sensor su un file sensors.yaml, dove ho tutti i sensori.
    Quindi anche questo.
    sensor:
    - platform etc..
  • Il sensore viene creato e lo script funziona, ho provato a mettere a 0 l’offset delle valvole in sala e dopo un po’ è cambiato con un -3 gradi (ci picchiava sopra il sole).
    Però sembra che il sensore non restituisca nulla a Home Assitant.
  • Per dare qualche dato in più:

    sono andato a vedere nei log:

    2020-06-22 16:38:56 ERROR (SyncWorker_9) [homeassistant.components.command_line.sensor] Command failed: python3 /config/Tado_script_Sala.py

    2020-06-22 16:38:56 WARNING (SyncWorker_9) [homeassistant.components.command_line.sensor] Empty reply found when expecting JSON data

    sembra che fallisca l'esecuzione dello script python.

  • Jacopo2
    Jacopo2 ✭✭✭
    Posta le ultime righe dello script, ma come uno screenshot
  • Certamente, eccolo:


  • Jacopo2
    Jacopo2 ✭✭✭

    non c'è niente di strano, sembra tutto a posto, l'unica differenza è che io ho tutti i sensori configurati in configuration.yaml anziché in sensors.yaml

    a questo punto cercherei aiuto sulla community di Home Assistant

  • Posso provare per test a spostare i sensori in configuration.yaml e poi faccio sapere.

    Ho anche visto che in teoria esiste la possibilità di includere la dicitura Python: in configuration.yaml e poi mettere gli script in una apposita cartella, ma non ho capito cosa cambia a livello di utilizzo dello script, non richiamandolo più come command-Line ma come Python script.

    Perché un modo “alla brutta” che mi è venuto in mente potrebbe essere far scrivere allo script un file txt e poi richiamarlo per fare il sensore.

    Ti cosa ne pensi?
  • Jacopo2
    Jacopo2 ✭✭✭

    l'unico modo per eseguire python con i vari privilegi e librerie che servono al nostro scopo è il command line sensor; avevo provato in altri modi, ma senza successo

  • Non saprei, se lo script non avesse effetti sulle valvole avrei pensato che se lo script è corretto allora forse c'era qualche problema sull'esecuzione di python 3, però ho provato a richiamarlo da terminale e risponde correttamente.

    Poi lo script di fatto esegue l'azione di regolazione sulle valvole, ho provato più volte ad impostare a mano dall'app l'offset a 0 e lo script lo ha sempre ricorretto ed in effetti la temperatura è sempre uguale a quella del termometro di riferimento.

    Penso che ci sia qualche problema solo nella comunicazione tra home assistant e l'output dello script.

  • Comunque sulla Comunity di Home Assitant mi sono imbattuto nel tuo post di sviluppo, essendo il problema diverso ne ho creato uno in configurazioni, ma ho linkato il tuo per dovere si autore.

    Ecco il mio post:

    https://community.home-assistant.io/t/python-script-integration-tado-automation-in-home-assistant/206854

  • Jacopo2
    Jacopo2 ✭✭✭
    Riesci a plottare temperatura reale e temperatura di Tado corretta?

    Sarebbe interessante per mostrare come funziona la correzione; anche se in estate a riscaldamento spento non ci dovrebbero essere grandi correzioni necessarie
  • Certo, eccolo.

    L'unico limite è che per ora sto testando il tutto con il sensore di temperatura del climatizzatore che è a grado intero, senza decimali, intanto sto predisponendo un sensore di temperatura Xiaomi a giorni.

    Tuttavia essendo estate e facendo andare il clima. gli balzi sono ben visibili lo stesso, faccio anche notare che la valvola che riporto è vicino ad una finestra e quando c'è il sole, l'offset è anche -6 gradi.


  • Un ulteriore test.

    Ho provato ad indirizzare python con il percorso completo, che ho trovato con:

    which python3
    

    Dopo di che ho provato ad eseguire lo script manualmente

    ~ /usr/bin/python3 /config/Tado_script_Sala.py
    Traceback (most recent call last):
      File "/config/Tado_script_Sala.py", line 119, in <module>
        json_dump = json.dumps(object)
    NameError: name 'json' is not defined
    

    Mi da un errore nello script sul nome json.

    A questo punto ho aggiunto all'inizio dello script in python

    import json
    

    Ho salvato e rieseguito a mano lo script e ho ricevuto risposta positiva:

    ~ /usr/bin/python3 /config/Tado_script_Sala.py
    {"offset": -1.8100000000000023, "info_message": "No Change"}
    

    A questo punto ho provato as inserire il percorso completo di python3 nella configurazione del sensore come:

    command: "/usr/bin/python3 /config/Tado_script_Sala.py"
    

    Dopo aver riavviato ho provato a rivedere il log

    2020-06-23 12:59:29 ERROR (SyncWorker_15) [homeassistant.components.command_line.sensor] Command failed: /usr/bin/python3 /config/Tado_script_Sala.py
    2020-06-23 12:59:29 WARNING (SyncWorker_15) [homeassistant.components.command_line.sensor] Empty reply found when expecting JSON data
    

    Ma niente da fare, anche se il comando è eseguito a mano correttamente non viene eseguito correttamente da Home Assistant.

    Cosa ne pensi?

  • Jacopo2
    Jacopo2 ✭✭✭
    modificato giugno 2020

    Lo script conteneva già "import requests" e "import json"


    lo riposto qua per sicurezza

    p.s. come hai fatto a postare quelle sezioni di codice mantenendo la formattazione?




    ...

    import requests

    import json


    TADO_USERNAME = '[email protected]'

    TADO_PASSWORD = 'password123'

    ZONE = [20] # the zone number associated to the Tado device (this might change if you remove/add devices)


    url_HASSIO = "http://192.168.0.12:8123/api/states/"

    HASSIO_TOKEN = "e*********************"

    SENSOR = ["sensor.shelly_t1"] #id of the device measuring the real temperature



    # The minimum change that grants an offset update, default is 0.5 to avoid unnecessary noise when offset is updated

    # smaller value will update more often, accuracy will be better but noise and battery like will be worse (Tado limitation)

    OFFSET_ERROR = 0.5 # degrees Celsius



    # nothing needs to be configured after this line



    HBTOKEN = ("Bearer " + HASSIO_TOKEN)

    HASSIO_headers = {

      'Authorization': HBTOKEN,

      'Content-Type': 'application/json',

    }

    url_Token = 'https://auth.tado.com/oauth/token'

    url_HOME = 'https://my.tado.com/api/v1/me'

    access_data = {

      'client_id': 'tado-web-app',

      'grant_type': 'password',

      'scope': 'home.user',

      'username': TADO_USERNAME,

      'password': TADO_PASSWORD,

      'client_secret': 'wZaRN7rpjn3FoNyF5IFuxg9uMzYJcvOoQ8QWiIqS3hfk6gLhVlG57j5YNoZL2Rtc'

    }



    try:

      ##print("number of zones to be corrected: " + str(len(ZONE)))


      # GET THE ACCESS TOKEN

      ##print('Getting token...')


      resp = requests.post(url=url_Token, data=access_data)

      TOKEN = resp.json().get("access_token")

      BTOKEN = ("Bearer " + TOKEN)

      ##print(BTOKEN)

      ##print(" ")


      # GET HOME-ID

      ##print('Getting home-id...')

      headers_TOKEN = {

        'Authorization': BTOKEN,

        'Content-Type': 'application/json;charset=utf-8',

      }

      HOMEID = requests.get(url=url_HOME, headers=headers_TOKEN).json().get("homeId")

      ##print(HOMEID)

      ##print(" ")


      for i in range(len(ZONE)):


        # GET REAL TEMPERATURE

        ##print('Getting real temperature...')

        url_H = (url_HASSIO + SENSOR[i])

        ##print(url_H)

        REAL_TEMPERATURE = requests.get(url=url_H, headers=HASSIO_headers).json().get("state")

        #print(REAL_TEMPERATURE)


        # GET CURRENT ZONE SERIAL NUMBER

        ##print('Getting current zone serial No...')

            url_ZONES = "https://my.tado.com/api/v2/homes/" + str(HOMEID) + "/zones/"

        response_ZONES = requests.get(url=url_ZONES, headers=headers_TOKEN)

        ZONES = response_ZONES.json()

        id = 0

        index = -1

        while id != ZONE[i]:

          index = index + 1

          id = ZONES[index].get("id")

        zone_name = ZONES[index].get("name")

        SERIAL = ZONES[index].get("devices")[0].get("serialNo")

        ##print("zone name: "+zone_name+"; serial No: "+SERIAL)


        # GET THE CURRENT TEMPERATURE

        ##print('Getting current temperature...')

            url_Temp = "https://my.tado.com/api/v2/homes/" + str(HOMEID) + "/zones/"+ str(ZONE[i]) +"/state"

        response_TEMP = requests.get(url=url_Temp, headers=headers_TOKEN)

        TEMPERATURE = response_TEMP.json().get("sensorDataPoints").get("insideTemperature").get("celsius")

        ##print(TEMPERATURE)


        #GET CURRENT OFFSET

        ##print('Getting current offset...')

            url_offset="https://my.tado.com/api/v2/devices/"+SERIAL+"/temperatureOffset"

        response_OFFSET = requests.get(url=url_offset, headers=headers_TOKEN)

        OFFSET=response_OFFSET.json().get("celsius")

        ##print(OFFSET)


        #UPDATE OFFSET

        ##print('Updating Offset')

        NEW_OFFSET=float(OFFSET)-float(TEMPERATURE)+float(REAL_TEMPERATURE)

        if NEW_OFFSET>0: # +-8 is the maximum offset accepted by Tado

          NEW_OFFSET=0

        if NEW_OFFSET<-8:

          NEW_OFFSET=-8

        data = ("{\"celsius\":"+str(NEW_OFFSET)+"}")

        ##print('new required offset:', NEW_OFFSET)

        ##print('difference in offset:', NEW_OFFSET-OFFSET)

        if abs(NEW_OFFSET-OFFSET)>OFFSET_ERROR:

            response = requests.put(url=url_offset, headers=headers_TOKEN, data=data)

            ##print(response)

            info='Just Updated'

        else:

          info='No Change'

    except:

      info='Error'


    object = {

      'offset': NEW_OFFSET,

      'info_message': info,

    }

    json_dump = json.dumps(object)

    print(json_dump)

    ...

  • Nella versione che avevo scaricato mancava, poco male, trovata la mancanza ho trovato la soluzione.

    Sono riuscito a far partire anche in home assitant lo script, dopo aver aggiunto import json ho reso lo script eseguibile:

    chmod +x Tado_script_Sala.py 
    

    poi nell'impostazione sensors ho lasciato come segue

      - platform: command_line
        name: TadoOffset_Sala
        command: 'python3 /config/Tado_script_Sala.py'
        value_template: "{{value_json.offset}}"
        json_attributes:
          - info_message
        unit_of_measurement: '°C'
        scan_interval: 180
    

    ed ecco finalmente che funziona!


  • Jacopo2
    Jacopo2 ✭✭✭
    hai ragione, mi deve essere sfuggito, ci vuole "import json" all'inizio, vorrei caricare lo script corretto ma non vedo più il pulsante "allega"...
  • Eccolo, esattamente il tuo con import json.

    Ho notato dall'app che l'offset che consente è fino a 9 gradi, niente di particolarmente rilevante, ma se vuoi puoi modificarlo nel tuo script.

  • Jacopo2
    Jacopo2 ✭✭✭

    Ok, mi sa che hanno cambiato qualcosa, credo che prima fosse +8 e -8; adesso sembra essere +10 e -9

  • Si esatto +10 e -9!

    comunque ottimo lavoro uno script che davvero è molto utile!

  • Buongiorno, volevo condividere l'esito della configurazione che ho provato.

    Ho utilizzato sensori di temperatura Xiaomi mi (quelli rotondi per intenderci, non quelli quadrati che sono Aquara).

    Non volendo comprare un HUB Xiaomi ho comprato la chiavetta ZigBee ConBee II a 32€ si Amazon.

    La chiavetta è istallata su Raspberry pi che monta la versione HASSIO di Home Assistant tramite un add-on che si chiama deCONZ, che genera un Bridge virtuale ZigBee per Home Assistant.

    I sensori vengono montati e visti in un attimo e dopo il riavvio vengono generati 3 sensori, temperatura, umidità e stato della batteria (molto utile quest'ultimo).

    Dopo di che ho configurato con il sensore di temperatura lo script python e riavviato Home Assistant.

    Per ora ho fatto solo due stanze di prova, il salotto e il bagno, prossimamente, prima della riaccensione dei caloriferi, lo farò per tutte le stanze.

    Questa è una immagine dell'offset delle due stanze (la variazione della sala è vistosa, perché sul calorifero batte il sole).

    Sono molto soddisfatto del risultato!

  • Grazie per tutte le prove che state facendo, speriamo TADO prenda spunto dal vostro lavoro ! 😅

    Un prodotto come lo xiaomi mi temperaure sarebbe l'ideale per migliorare il confort in casa e avere rapidamente visione della temperatura e umidità delle singole stanze, tra l'altro costa meno di 20 euro l'uno...



  • Infatti non l'ho scelto a caso ^_^

  • Alla fine TADO ci ha ascoltato e ha tirato fuori il suo sensore esterno, peccato per il prezzo esagerato !!! :-(

    Speriamo nel black friday...

  • @paolo83 @Jacopo2

    ho lo script funzionante su homeassistant (ultima versione di cui sopra, quindi "import json" è presente) ma riscontro ancora lo stesso problema riportato da Paolo, ovvero tutto funziona ma non rimane traccia dello storico del sensore TadoOffset_xyz.

    Paolo come avevi poi risolto? Sembrerebbe che il problema non fosse solo l' "import json" mancante...

    PS Per ora il sensore di temperatura è simulato, vorrei avere tutto perfettamente a punto prima di comprare i sensori.

  • Ciao @EmilioOo , in realtà creato il sensore su Home Assistant tipo questo:

    # Tado Scripts
    # SALA
      - platform: command_line
        name: TadoOffset_Sala
        command: 'python3 /config/Tado_script_Sala.py'
        value_template: "{{value_json.offset}}"
        json_attributes:
          - info_message
        unit_of_measurement: '°C'
        scan_interval: 180
    

    lo storico dovrebbe attivarsi da solo, a mano che non hai configurato delle opzioni selettive su recorder. In tal caso dovresti inserire il nome dell'entità sensore in recorder tipo:

    recorder:
      include:
        entities:
          - sensor.tadooffset_sala
    
  • @alfaman non avevo notato che avessero prodotto un sensore di temperatura, direi finalmente, non è alla portata di tutti configurare uno script come questo. Peccato il costo di 70€, con il quale se compri 3 della Xiaomi.

    Ma del resto la "pappa pronta" costa sempre un po' di più.

  • @paolo83 Magari 70 euro, sono 116!

    Quindi in 2 anni non hanno ancora risolto la questione di sbalzi di temperatura nelle teste?

  • @paolo83 in realtà costa 80 euri...

    Io sono riuscito ad ordinarne 3 (c'era un limite per account) su amazon a 60 con il prime day

    Sono curioso di vedere come funzionano e se ci sarà la possibilità di programmare anche i decimi di grado, aspetto risposta dall'assistenza.

    Anche così la cifra è esagerata e se non funzionano come si deve li manderò indietro !

    Il "problema" dello script è che ad ogni aggiornamento dell'offset viene rifatta la calibrazione della testa, a meno che adesso che esistono questi nuovi sensori si può ovviare in qualche modo al problema

  • @alfaman facci sapere come vanno.

    Per il fatto che viene rifatta la calibrazione non è una cosa così grave, semplicemente si tratta di impostare un tempo di esecuzione dello script che abbia un senso, io per esempio, tenendo conto che le condizioni al contorno non cambiano alla velocità della luce lo eseguo ogni mezz'ora.

  • La calibrazione ha però due conseguenze:

    -il rumore, che in camera da letto, soprattutto dei bimbi, potrebbe essere un problema

    -la durata delle batterie, visto che con un utilizzo normale non durano tantissimo. A me durano circa un anno.

    Senza contare che in base alla versione del firmware l'indicazione è più o meno sbagliata.

    Due giorni fa ho dovuto cambiare le batterie a delle teste che risultavano cariche al massimo

    Un'altra che invece risulta scarica da tempo funziona ancora bene.... misteri !