Multipresa Smart con EspHome

HassioHelp

Multipresa Smart con EspHome

.

Argomento: EspHome

Livello: Novizio (Novizio, Esperto, Pro)

Difficoltà: Media (Bassa, Media, Alta)

Home Assistant: v. 2020.12.2

EspHome: v. 1.15.3

 

Premessa

Esphome, con il diffondersi di Home Assistant, sta’ sempre prendendo più piede tra gli utenti, i quali si ingegnano per realizzare firmware personalizzati da inserire nei propri dispositivi smart. 

In questo articolo vedremo come controllare la multipresa Wi-Fi Houzetek precedentemente recensita, tramite firmware realizzato con EspHome.
Un nostro utente di Telegram @davide_di_stefano ha realizzato il codice di base che ho adattato a questo modello.

Ho notato un funzionamento più fluido e reattivo con il firmware EspHome rispetto a quello Tasmota. Sicuramente perché molte automazioni presenti  nel vecchio package sono state eliminate o realizzate internamente del firmware. 

 

In commercio ormai si trovano solo i cloni come la OWSOO o questa link

Analisi del codice sorgente

#Personalizzazione nome multipresa
substitutions:
  host_namemulti1

#Personalizzazione GPIO
  switchGPIO1
  ledGPIO3
  rele1GPIO12
  rele2GPIO14
  rele3GPIO04
  rele4GPIO13
  rele5GPIO05

Con la variabile substitutions: è possibile creare delle etichette le quali, in fase di compilazione, si sostituiranno al valore dichiarato. Es. l’etichetta $host_name verrà sostituita da multi1 (attenzione che l’etichetta quando viene utilizzata all’interno del codice deve essere preceduta dal simbolo $). Possono essere seguite o precedute da altro testo in questo modo quando si andranno a creare le varie entità avranno sempre al suo interno la stessa etichetta, utile nel caso si debba riutilizzare lo stesso firmware per più dispositivi.

Ho aggiunto anche l’etichette dei GPIO del dispositivo, così da migliorarne la personalizzazione per differenti hardware.

esphome:
  name$host_name
  platformESP8266
  boardesp8285
  
wifi:
  ssid!secret wifi_ssid
  password!secret wifi_pass

# Enable logging
logger:

# Enable Home Assistant API
api:
  reboot_timeout0s

ota:

web_server:
  port80
  
captive_portal

esphome: vengono dichiarati il nome del progetto, la piattaforma e la scheda del dispositivo.

wifi: vengono dichiarate le credenziali della rete Wi-Fi. In questo caso è stato utilizzato la modalità secret uguale a quella utilizzata in Home Assistant. Nella stessa cartella di esphome si crea un file secret.yaml dove vengono salvate tutte le password o le cose che vogliamo celare per poi essere richiamate in modo più semplice.

logger: attivata la registrazione di tutti i messaggi del log

api: l’API nativa di Esphome vengono usate per la comunicazione con il dispositivo in questo modo non viene utilizzato il protocollo MQTT

ota: abilitata gli aggiornamenti via etere senza doversi collegare fisicamente al dispositivo

web_server: si abilita l’interfaccia web dove sarà possibile raggiungere il dispositivo digitando il suo IP nel browser

captive_portal: questo componente abilita un meccanismo di fallback per quando la connessione alla rete Wi-Fi fallisce.
Dopo 1 minuto di tentativi di connessione non riusciti, l’ESP avvierà un hotspot Wi-Fi (con le credenziali della configurazione). Connettendosi a questa rete che si è creata e portandosi all’indirizzo http://192.168.4.1 si potrà raggiungere l’interfaccia di configurazione. In questo modo, ad esempio, si potranno settare i nuovi parametri della rete Wi-Fi

 

script:
  – idverifica_per_off
    then:
      – if:
          condition:
            and:
              – switch.is_offpresa_1
              – switch.is_offpresa_2
              – switch.is_offpresa_3
              – switch.is_offpresa_4
              – switch.is_offpresa_usb   
          then:
            – switch.turn_offled
      
  – idon_all
    then:
      – switch.turn_onpresa_1
      – switch.turn_onpresa_2
      – switch.turn_onpresa_3
      – switch.turn_onpresa_4
      – switch.turn_onpresa_usb
      – switch.turn_onled
      
  – idoff_all
    then:
      – switch.turn_offpresa_1
      – switch.turn_offpresa_2
      – switch.turn_offpresa_3
      – switch.turn_offpresa_4
      – switch.turn_offpresa_usb
      – switch.turn_offled

Questi sono tre script: il primo verifica lo stato delle uscite e se sono spente spegne il led che illumina il tasto power. Gli altri due accendono o spengono tutte le uscite, serviranno come azioni associati al tasto power.  

binary_sensor:
      
  – platformgpio
    pin$switch
    idpulsante
    device_classpower
    on_multi_click:
    
#Spegni tutto con un click corto   
    – timing:
        – OFF for 1s to 2s
        – ON for at least 0.8s
      then:
        – script.executeoff_all
        – logger.logoff_all
        
#Accendi tutto con click lungo
    – timing:
        – OFF for 4s to 6s
        – ON for at least 0.8s
      then:
        – script.executeon_all
        – logger.logon_all
        
#Accendi Presa 1 con 1 breve click
    – timing:
        – OFF for at most 0.8s
        – ON for at least 1s
      then:
        – switch.togglepresa_1
        – logger.log1click
        
#Accendi Presa 2 con 2 brevi click   
    – timing:
        – OFF for at most 0.8s
        – ON for at most 0.8s
        – OFF for at most 0.8s
        – ON for at least 1s
      then:
        – switch.togglepresa_2
        – logger.log2click
        
#Accendi Presa 3 con 3 brevi click 
    – timing:
        – OFF for at most 0.8s
        – ON for at most 0.8s
        – OFF for at most 0.8s
        – ON for at most 0.8s
        – OFF for at most 0.8s
        – ON for at least 1s
      then:
        – switch.togglepresa_3
        – logger.log3click
        
#Accendi Presa 4 con 4 brevi click 
    – timing:
        – OFF for at most 0.8s
        – ON for at most 0.8s
        – OFF for at most 0.8s
        – ON for at most 0.8s
        – OFF for at most 0.8s
        – ON for at most 0.8s
        – OFF for at most 0.8s
        – ON for at least 1s
      then:
        – switch.togglepresa_4
        – logger.log4click
        
#Accendi Presa 5 con 5 brevi click 
    – timing:
        – OFF for at most 0.8s
        – ON for at most 0.8s
        – OFF for at most 0.8s
        – ON for at most 0.8s
        – OFF for at most 0.8s
        – ON for at most 0.8s
        – OFF for at most 0.8s
        – ON for at most 0.8s
        – OFF for at most 0.8s
        – ON for at least 1s
      then:
        – switch.togglepresa_usb
        – logger.log5click

Questo codice definisce il comportamento del tasto power alla pressione ripetuta utilizzando la funzione on_multi_click. I commenti spiegano il loro funzionamento. Ho aggiunto come azione, oltre all’interazione con le varie uscite, una chiamata logger.log questo farà si che al compimento dell’azione scriverà la lable che ho dichiarato nel registro di sistema. In questo modo si facilitterà la parte di debug del codice. I log possono essere visualizzati nella web ui, se abilitata, raggiungibile all’indirizzo IP del dispositivo

switch:

#definizione switch led tasto power
  – platformgpio
    pin$led
    name$host_name led
    idled
    invertedTrue
    internalTrue  #questa entità non viene esposta a Home Assistant
    on_turn_on:
    – switch.turn_onled
    
#definizione switch relè 
  – platformgpio
    pin$rele1
    name$host_name presa 1
    icon“mdi:power-plug”
    idpresa_1
    restore_modeRESTORE_DEFAULT_OFF
    on_turn_on:
    – switch.turn_onled
    on_turn_off:
      – script.executeverifica_per_off
 

 #definizione switch tasto power 
  – platformtemplate
    name$host_name power
    icon“mdi:power”
    lambda|
      if (id(led).state) {
        return true;
      } else {
        return false;
      }  
    turn_on_action:
      – script.executeon_all
    turn_off_action:
      – script.executeoff_all

Definizione degli switch:

La definizione dello switch.led è solo ad uso interno, segue la dichiarazione dei 4 relè e l’uscita USB. Infine uno switch template che restituisce l’interruttore del tasto power.

Nella dichiarazione dei relè è impostato il parametro restore_modeRESTORE_DEFAULT_OFF questo controlla il modo in cui il GPIO tenta di ripristinare lo stato all’avvio:

 RESTORE_DEFAULT_OFF tenta di ripristinare lo stato se non riesce lo porta a OFF
 RESTORE_DEFAULT_ON tenta di ripristinare lo stato se non riesce lo porta a ON
 ALWAYS_OFF porta sempre a OFF all’avvio
 ALWAYS_ON porta sempre a ON all’avvio

Va specificato che lo stato, se non espressamente specificato, viene salvato nella memoria volatile dell’ESP e quindi non sarà mai possibile recuperare lo stato.
L’ESP per ripristinare gli stati dovrà salvare i dati nella memoria flash, la quale non si scancella al scollegamento elettrico, questo però ridurrà il numero di cicli di scrittura in memoria (solitamente  100.000 cicli di scrittura massimi).

Il parametro da dichiarare sotto  è esp8266_restore_from_flash

esphome:
  name$host_name
  platformESP8266
  boardesp8285
  esp8266_restore_from_flashtrue
sensor:
  – platformwifi_signal
    name$host_name WiFi
    update_interval60s  
    
  – platformuptime
    name$host_name uptime
    update_interval60s
  
text_sensor:
  – platformversion
    name$host_name ESPHome Ver
  
    
  – platformwifi_info
    ip_address:
      name$host_name IP

Infine alcuni sensori come:
Livello segnale wi-fi
Sensore durata in attività del dispositivo
Versione di EspHome
Indirizzo IP del dispositivo.

L’intero codice lo potete scaricare da questo link

Package

Il package utilizzato precedentemente con Tasmota ha subito dei drastici tagli dato che molte automazioni sono state introdotte direttamente nel firmware della multipresa o eliminate perché non più necessarie. Anche tutta la dichiarazione dei sensori/interruttori MQTT sono stati eliminati dato che i parametri vengono acquisiti con l’API nativa di EspHome.

A questo link potete scaricare il package 

Lovelace

Nella card in lovelace sono stati ritoccati alcuni nomi delle entità: lo switch del tasto power, dei relè e dell’USB e il sensore del wi-fi. 

cards:
  – entities:
      – entityinput_boolean.att_progr_presa
      – entityswitch.multi1_power
      – style:
          background‘#62717b’
          height1px
          margin-leftauto
          margin-rightauto
          width100%
        typedivider
      – entityinput_datetime.multi1_usb_on
      – entityinput_datetime.multi1_usb_off
      – style:
          background‘#62717b’
          height1px
          margin-leftauto
          margin-right2
          width90%
        typedivider
      – entityinput_datetime.multi1_sw1_on
      – entityinput_datetime.multi1_sw1_off
      – style:
          background‘#62717b’
          height1px
          margin-leftauto
          margin-right2
          width90%
        typedivider
      – entityinput_datetime.multi1_sw2_on
      – entityinput_datetime.multi1_sw2_off
      – style:
          background‘#62717b’
          height1px
          margin-leftauto
          margin-right2
          width90%
        typedivider
      – entityinput_datetime.multi1_sw3_on
      – entityinput_datetime.multi1_sw3_off
      – style:
          background‘#62717b’
          height1px
          margin-leftauto
          margin-right2
          width90%
        typedivider
      – entityinput_datetime.multi1_sw4_on
      – entityinput_datetime.multi1_sw4_off
      – style:
          background‘#62717b’
          height1px
          margin-leftauto
          margin-right2
          width90%
        typedivider
    typeentities
  – elements:
      – entityswitch.multi1_presa_usb
        image/local/immagini/lovelace/multipresa/lampo.png
        state_filter:
          ‘off’brightness(100%) saturate(0.5) opacity(0.0)
          ‘on’brightness(110%) drop-shadow(0px 0px 8px gold) opacity(0.8)
        style:
          left63%
          top26%
          width46%
        tap_action:
          actiontoggle
        typeimage
      – entityswitch.multi1_power
        image/local/immagini/lovelace/multipresa/Tasto Power.png
        state_filter:
          ‘off’opacity(0.0)
          ‘on’brightness(110%) drop-shadow(0px 0px 1px gold)
        style:
          left63%
          top11.5%
          width18%
        tap_action:
          actiontoggle
        typeimage
      – entityswitch.multi1_presa_1
        image/local/immagini/lovelace/multipresa/Spina.png
        state_filter:
          ‘off’brightness(100%) saturate(0.5) opacity(0.0)
          ‘on’brightness(110%) drop-shadow(0px 0px 1px gold)
        style:
          left75%
          top45%
          width73%
        tap_action:
          actiontoggle
        typeimage
      – entityswitch.multi1_presa_2
        image/local/immagini/lovelace/multipresa/Spina.png
        state_filter:
          ‘off’brightness(100%) saturate(0.5) opacity(0.0)
          ‘on’brightness(110%) drop-shadow(0px 0px 1px gold)
        style:
          left75%
          top60.5%
          width73%
        tap_action:
          actiontoggle
        typeimage
      – entityswitch.multi1_presa_3
        image/local/immagini/lovelace/multipresa/Spina.png
        state_filter:
          ‘off’brightness(100%) saturate(0.5) opacity(0.0)
          ‘on’brightness(110%) drop-shadow(0px 0px 1px gold)
        style:
          left75%
          top76.5%
          width73%
        tap_action:
          actiontoggle
        typeimage
      – entityswitch.multi1_presa_4
        image/local/immagini/lovelace/multipresa/Spina.png
        state_filter:
          ‘off’brightness(100%) saturate(0.5) opacity(0.0)
          ‘on’brightness(110%) drop-shadow(0px 0px 1px gold)
        style:
          left75%
          top92%
          width73%
        tap_action:
          actiontoggle
        typeimage
      – entitysensor.multi1_wifi
        style:
          colorblack
          font-size13px
          left64%
          opacity0.8
          pointer-eventsnone
          text-aligncenter
          top16%
        typestate-label
      – entitysensor.multi1_usb
        style:
          colorwhite
          font-size13px
          left13%
          opacity0.8
          pointer-eventsnone
          text-alignright
          top26%
        typestate-label
      – entitysensor.multi1_sw1
        style:
          colorwhite
          font-size13px
          left13%
          opacity0.8
          pointer-eventsnone
          text-alignright
          top40%
        typestate-label
      – entitysensor.multi1_sw2
        style:
          colorwhite
          font-size13px
          left13%
          opacity0.8
          pointer-eventsnone
          text-alignright
          top56%
        typestate-label
      – entitysensor.multi1_sw3
        style:
          colorwhite
          font-size13px
          left13%
          opacity0.8
          pointer-eventsnone
          text-alignright
          top72%
        typestate-label
      – entitysensor.multi1_sw4
        style:
          colorwhite
          font-size13px
          left13%
          opacity0.8
          pointer-eventsnone
          text-alignright
          top88%
        typestate-label
    image/local/immagini/lovelace/multipresa/Multipresa.png
    typepicture-elements
typehorizontal-stack

 

7 risposte

  1. Avatar MaGiDeL ha detto:

    Salve, solo per avvisare che i link ai file ZIP del codice ESPHome e del package non sono raggiungibili. 🙂

  2. Avatar LeoVJ ha detto:

    Ottimo lavoro! una domanda quando vado ad aggiungere l card mi dice:

    Rilevati errori di configurazione:
    duplicated mapping key (4:7)

    1 | cards:
    2 | – entities:
    3 | – entity: input_boolean.att_prog …
    4 | – entity: switch.multi1_power
    ———–^
    5 | – style:
    6 | background: ‘#62717b’

  3. Avatar Luca ha detto:

    è possibile fare il primo flash via OTA? magari con Tuya Convert? esiste una guida? grazie.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *