ESPHome su device Tuya non standard

HassioHelp

ESPHome su device Tuya non standard

.

Argomento: ESPHome

Livello: Novizio (Novizio,Esperto, Pro)

Difficoltà: Media (Bassa, Media, Alta)E

Questo articolo è stato realizzato da  Giovanni C, un nostro affezionato utente Telegram.

Di recente ho acquistato su Aliexpress dei relè wifi pubblicizzati come Tuya-compatibili a due canali (esistono anche ad un canale e questo articolo si può applicare ad entrambi) con la possibilità di collegare ai terminali per gli interruttori/pulsanti la normale Fase della 230V (come gli Shelly per intenderci); i device sono di piccole dimensioni (45x45x18 mm) di basso costo (in offerta li ho presi 8€ spediti) ed utilizzando la app Tuya/Smartlife avevo la quasi certezza che avessero dentro l’ESP8266 come microcontroller, quindi avrei potuto facilmente installarci un firmware mio tramite ESPHome.

Lo potete acquistare a questo link ma ne esistono altri dello stesso tipo ma sempre con la stessa scheda al suo interno.

La prima impressione

Per prima cosa li ho testati con il firmware nativo, giusto per confermare che funzionassero e non ci fossero problemi di hardware e devo dire che è andato tutto liscio, accoppiati alla app SmartLife, controllo tramite cloud Tuya perfetto e switch funzionanti perfettamente. Stacco tutto, apro la scatoletta in plastica ed anche qui nessuna sorprese, vedo subito in bella vista il modulo che con una rapida ricerca confermo avere un ESP8266 al suo interno, con 1Mb di memoria flash; che dire ero convinto che in pochi minuti con un semplice codice YAML di ESPHome li avrei avuti già integrati in HA senza alcun problema.

Mi rimaneva solo da fare un po’ di “reverse-engineering” e capire a cosa corrispondessero i vari pin esposti per mapparli con i relativi GPIO. E qui sotto potete vedere che in pochi minuti, con multimetro, carte e penna il lavoro era fatto!

Anche se i relè che sono utilizzati sono per carichi fino a 12A, le piste della PCB non possono reggere queste correnti, infatti all’esterno è riportata 5A come corrente massima per canale, più che sufficiente per la stragrande maggioranza di lampade che si utilizzano (che poi secondo me è l’applicazione principale di questo tipo di device, aggiungere facilmente un controllo smart ad impianto di illuminazione già esistente).

I primi problemi

Che dire, tutto fin troppo facile, ed infatti il vero problema è arrivato non appena ho caricato il firmware ESPHome tramite adattatore USB/FTDI… I relè li controllavo da HA senza alcun problema ma il comportamento dei pulsanti “fisici” collegati a S1 e S2 era totalmente illogico! Non sempre rispondevano, ma alle volte ad una pressione HA ne venivano riconosciute 3 o 4 di fila, spesso premendo uno dei pulsanti veniva attivato l’altro e via dicendo… In pratica completamente inutilizzabile!

A questo punto armato di pazienza, sempre con il fedele multimetro comincio ad approfondire il funzionamento della PCB, e tutto sembrerebbe ok, tranne per il fatto che il segnale che arriva ai GPIO12 e GPIO13 (quelli dei pulsanti) è in corrente alternata e quindi quando si preme uno dei pulsanti stessi il GPIO passa continuamente dallo stato HIGH allo stato LOW alla frequenza di rete (50Hz) quindi 50 volte al secondo! Ed inoltre per come è strutturata la PCB i due canali hanno parte dei componenti in comune e questo è il motivo per cui uno influenza l’altro. Insomma un disastro totale che mi stava facendo mollare tutto. Ma non volendo dargliela vinta ho collegato un analizzatore di segnale digitale ai due GPIO ed in pratica sono riuscito a determinare che il GPIO stesso era sempre in stato HIGH quando i pulsanti non erano premuti, e, come sospettavo, alla pressione del pulsante la tensione veniva abbassata a 3.3V ma rimaneva alternata e potevo leggere una serie di impulsi HIGH/LOW al ritmo di 50 al secondo finchè il pulsante veniva tenuto premuto. OK avevo capito come funzionava l’hardware ma… come fare a gestirlo da codice ESPHome?

La soluzione

Due notti di varie prove, tentativi e fallimenti e finalmente sono riuscito a risolvere il problema utilizzando i sensori della piattaforma “duty_cycle” per verificare la presenza o meno di un segnale PWM ad onda quadra facendo un campionamento ogni 20ms; quindi il codice una volta che rileva un segnale oscillante con un “duty cycle” al di sotto il 95% (100% significa sempre HIGH ed è lo stato di “riposo” del pin a pulsante non premuto) per un periodo al di sotto dei 400ms (per evitare che tenendo premuto il pulsante a lungo inizi una serie di on/off continui) desume per il pulsante è stato premuto e quindi fa il toggle del GPIO collegato al rispettivo relè. I valori sia del ciclo di campionamento che del tempo massimo di pressione del pulsante sono stati aggiustati man mano che provavo il codice fino a raggiungere la stabilità con appunto rispettivamente 20ms e 400ms. Vittoria ottenuta ed altro modulo che è stato installato da più di 2 settimane e che nonostante venga usato giornalmente da tutta la famiglia per accendere le luci del nostro salone non ha fallito un solo colpo!!!

Esphome

Vi lascio qua sotto il codice YAML utilizzato in ESPHome, personalizzatelo per le vostre esigenze e Buona Modifica!!

esphome:
name: soffitto_salotto
platform: ESP8266
board: esp01_1m

substitutions:
hostname: 'Soffitto Salotto:'

wifi:
ssid: "METTI QUI IL TUO SSID"
password: "METTI QUI LA TUA PASSWORD WIFI"

captive_portal:

api:

web_server:
port: 80

logger:

ota:

#==========================================================
# from here all sensors and devices mapped for this Module
#==========================================================

binary_sensor:
- platform: status
name: $hostname Status
- platform: template
id: pulsante1
internal: true
# lettura del duty_cycle e conversione in on/off
lambda: |-
if (id(push_switch1).state < 95.0) {
return true;
} else {
return false;
}
on_click:
max_length: 400ms
then:
switch.toggle: faretti1
- platform: template
id: pulsante2
internal: true
# lettura del duty_cycle e conversione in on/off
lambda: |-
if (id(push_switch2).state < 95.0) {
return true;
} else {
return false;
}
on_click:
max_length: 400ms
then:
switch.toggle: faretti2

sensor:
- platform: duty_cycle
pin: GPIO13
internal: true
id: push_switch1
update_interval: 20ms
- platform: duty_cycle
pin: GPIO12
internal: true
id: push_switch2
update_interval: 20ms
- platform: wifi_signal
# name: $hostname WiFi Signal
id: rssi_value
update_interval: 60s
- platform: uptime
name: $hostname Uptime
id: uptime_s
update_interval: 15s
- platform: template
name: $hostname WiFi
lambda: |-
return id(rssi_value).state * 2 + 200.0;
icon: mdi:wifi
unit_of_measurement: '%'
update_interval: 60s

switch:
- platform: restart
name: $hostname Restart
- platform: gpio
id: faretti1
pin: GPIO14
name: $hostname Faretti (4)
- platform: gpio
id: faretti2
pin: GPIO15
name: $hostname Faretti (6)

text_sensor:
- platform: version
name: $hostname ESPHome Version
- platform: wifi_info
ssid:
name: $hostname WiFi SSID
- platform: template
name: $hostname Uptime (formatted)
lambda: |-
uint32_t dur = id(uptime_s).state;
int dys = 0;
int hrs = 0;
int mnts = 0;
if (dur > 86399) {
dys = trunc(dur / 86400);
dur = dur - (dys * 86400);
}
if (dur > 3599) {
hrs = trunc(dur / 3600);
dur = dur - (hrs * 3600);
}
if (dur > 59) {
mnts = trunc(dur / 60);
dur = dur - (mnts * 60);
}
char buffer[17];
sprintf(buffer, "%ud %02uh %02um %02us", dys, hrs, mnts, dur);
return {buffer};
icon: mdi:clock-start
update_interval: 15s

Conclusioni

Sicuramente dopo questa modifica non posso che rimanere stupito dalla flessibilità di ESPHome, nell’estrema personalizzazione che si può raggiungere nello scrivere codice conoscendolo meglio ed ho avuto conferma che, probabilmente, non ci sono limiti al suo utilizzo, basta non rinunciare, studiare bene l’hardware e poi di conseguenza il codice, ed i risultati si ottengono.

Singolo Canale

Come accennavo all’inizio, esiste la versione singolo canale di questo relé wifi, che ha la peculiarità di avere un contatto pulito in uscita, quindi utilizzabile ad esempio per controllare una caldaia o delle luci a basso voltaggio (12V/24V/48V); il funzionamento del pulsante di controllo sembra lo stesso (non ho ancora un modulo in mano per provare ma ne sono quasi certo vedendo le immagini che ho trovato in giro per il web).
Su Aliexpress a questo link.

Dimmer

Esiste pure una versione che fa da DIMMER a 230V, ne ho ordinata una per provare a modificarla, e se utilizza lo stesso principio per l’hardware, basterà rilevare la durata della pressione del pulsante per aumentare o diminuire il valore di dimming ed avere un ottimo device per luci dimmerabili a basso costo!!
Su Aliexpress a questo link.

Argomenti correlati

ESPHome

 

 

4 risposte

  1. Avatar Antonello Migliorelli ha detto:

    E se lo si volesse usare per le tapparelle, con anche l’uso dei pulsanti fisici???

  2. Avatar benji ha detto:

    Scusa ma se mettevi delle resistenze a gnd sui pin d’ingresso non funzionava?

    • Avatar Giovanni C ha detto:

      se leggi l’articolo vedi che i terminali S1 e S2 vanno collegati alla FASE della 230V qundi cosa avrei dovuto mettere?? e cosa avrebbe dovuto fare una eventuale resistenza a GND visto che sulla corrente AC non hai GND ? 🙂

Lascia un commento

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