TapHome

NOUS A1

Packet Parser → MQTT
Inviato da
Ultimo aggiornamento: 04. 2026
NOUS A1

La NOUS A1 è una presa smart WiFi con monitoraggio energetico integrato (chip BL0937). Con firmware Tasmota comunica con TapHome tramite MQTT. Il template fornisce controllo relè e misurazione energetica completa — tensione, corrente, potenza attiva/reattiva/apparente, fattore di potenza e consumo energetico cumulativo.

La presa utilizza un chipset ESP8266 ed è dimensionata per 16A di picco / 15A continui (fino a 3680W max, 3450W continui). Richiede un broker MQTT esterno (es. Mosquitto) accessibile sia dalla presa che da TapHome Core.

Configurazione

Configurazione Tasmota MQTT

Prima di importare il template TapHome, la NOUS A1 deve avere il firmware Tasmota e la connessione al broker MQTT configurata:

  1. Aprire l’interfaccia web Tasmota (inserire l’IP del dispositivo nel browser)
  2. Navigare a ConfigurationConfigure MQTT
  3. Impostare l’Host sull’indirizzo IP del broker MQTT
  4. Impostare la Port (predefinita 1883)
  5. Impostare User e Password se il broker richiede autenticazione
  6. Annotare il valore del Topic (es. tasmota_496D5A) — necessario per il template TapHome
Variabili del template

Dopo l’importazione del template in TapHome, impostare la variabile personalizzata plug1topic in base al topic MQTT Tasmota della presa:

VariabileDescrizioneCome ottenere
plug1topicTopic MQTT Tasmota della presa smartTasmota web UI → Configuration → MQTT → campo Topic

Il valore predefinito è tasmota_496D5A — deve essere modificato in base al topic effettivo di ogni presa.

Il topic MQTT è specifico per dispositivo. Se si utilizzano più prese NOUS A1, ciascuna richiede un’istanza di template separata con un valore plug1topic univoco.

Calibrazione del monitoraggio energetico

Il chip BL0937 per il monitoraggio energetico richiede calibrazione per letture accurate. Per calibrare:

  1. Collegare un carico resistivo noto (es. lampadina da 60W) alla presa
  2. Nella console Tasmota, impostare la tensione di riferimento: VoltageSet 230
  3. Impostare la potenza di riferimento: PowerSet 60
  4. Verificare che il fattore di potenza mostri un valore vicino a 1,00 per il carico resistivo

La calibrazione è una procedura una tantum — i valori sono memorizzati nella memoria flash e persistono dopo i riavvii. Senza di essa, le letture del chip BL0937 possono essere imprecise.

Funzionalità del dispositivo

Controllo relè

Il template espone una singola uscita relè per la presa AC 230V. Il relè viene controllato pubblicando su cmnd/{topic}/Power con payload 1 (ON) o 0 (OFF). Quando il relè viene spento, il template richiede anche un aggiornamento dello stato energetico (Status 8) per aggiornare immediatamente le letture.

Monitoraggio energetico

Il template legge i dati energetici dal payload tele/{topic}/SENSOR, pubblicato periodicamente (predefinito ogni 300 secondi). Sono disponibili le seguenti misurazioni:

  • Voltage — tensione di rete (V)
  • Current — corrente di carico (A)
  • Active Power — potenza attiva (W)
  • Apparent Power — potenza apparente inclusa la componente reattiva (VA)
  • Reactive Power — potenza reattiva (VAR)
  • Power Factor — rapporto tra potenza attiva e apparente (cos phi, 0–1)
  • Energy Today — consumo cumulativo dalla mezzanotte (kWh)
  • Total Energy — consumo cumulativo dall’avvio del contatore, persistente dopo i riavvii (kWh)
  • Period Energy — consumo nel periodo di telemetria corrente (Wh)
Diagnostica WiFi

Il template legge lo stato WiFi dal payload tele/{topic}/STATE:

  • WiFi Channel — numero del canale 2,4 GHz (1–13)
  • WiFi Signal Strength — livello del segnale in dBm
  • WiFi RSSI — qualità del segnale in percentuale (0–100%)
  • Uptime — tempo di attività del dispositivo in secondi dall’ultimo avvio
Funzionalità aggiuntive

La NOUS A1 con firmware Tasmota supporta anche il monitoraggio dello stato della connessione tramite topic LWT (Last Will and Testament), il consumo energetico di ieri, un periodo di telemetria configurabile (10–3600 secondi) e comandi per il reset del contatore energetico. Il chip BL0937 può essere ricalibrato da remoto tramite comandi MQTT. Queste funzionalità potranno essere aggiunte in un futuro aggiornamento del template.

Risoluzione dei problemi

Nessun dato in TapHome
  1. Verificare che la presa sia connessa al WiFi — l’interfaccia web Tasmota dovrebbe essere accessibile all’IP del dispositivo
  2. Controllare che MQTT sia configurato e connesso — la pagina principale di Tasmota mostra lo stato della connessione MQTT
  3. Confermare che la variabile plug1topic in TapHome corrisponda esattamente al valore Topic nella configurazione MQTT di Tasmota
  4. Utilizzare un client MQTT (es. MQTT Explorer) per sottoscriversi a tele/# e verificare che la presa pubblichi messaggi STATE e SENSOR
Letture energetiche imprecise
  1. Il chip BL0937 richiede calibrazione con un carico resistivo noto — vedere la sezione calibrazione sopra
  2. I carichi induttivi (motori, driver LED) hanno naturalmente un fattore di potenza inferiore a 1,0 — questo è un comportamento atteso, non un errore di misurazione
  3. Controllare il periodo di telemetria — l’intervallo predefinito di 300 secondi significa che i valori energetici si aggiornano ogni 5 minuti

Le serie di produzione più recenti della NOUS A1 potrebbero utilizzare chipset non-ESP incompatibili con il firmware Tasmota. Verificare il chipset prima dell’acquisto se è richiesta l’integrazione Tasmota/MQTT.

Dispositivi disponibili

NOUS A1 Modulo
Variabili personalizzate
plug1topic (string) = tasmota_496D5ATopic MQTT Tasmota della presa smart — usato nei filtri di sottoscrizione e nei comandi di controllo relè
Open Tasmota web UI → Configuration → MQTT → copy Topic value (e.g., tasmota_496D5A)

ESP-NOUS-ZASUVKA-1

Listener
#var tmp := RECEIVEDMSG.Payload;
Canale WiFi Variabile Solo lettura
numeric json_path

Canale WiFi

Listener
if INDEXOF(RECEIVEDMSG.Topic, "STATE") > 0
	var tmp := RECEIVEDMSG.Payload;
    var temp4 := PARSEJSON(RECEIVEDMSG.Payload, ID1 + ".Channel", true);
    if (!ISNULL(temp4), Va := temp4/1);
end
Potenza apparente Variabile Solo lettura
numeric Unità: VA json_path

Potenza apparente

Listener
if INDEXOF(RECEIVEDMSG.Topic, "SENSOR") > 0
	var tmp := RECEIVEDMSG.Payload;
    var temp4 := PARSEJSON(RECEIVEDMSG.Payload, ID12 + ".ApparentPower", true);
    if (!ISNULL(temp4), Va := temp4/1);
end
Fattore di potenza Variabile Solo lettura

Rapporto tra potenza attiva e apparente (cos phi) — intervallo da 0 a 1, dove 1,0 indica un carico puramente resistivo

numeric json_path

Fattore di potenza

Listener
if INDEXOF(RECEIVEDMSG.Topic, "SENSOR") > 0
	var tmp := RECEIVEDMSG.Payload;
    var temp4 := PARSEJSON(RECEIVEDMSG.Payload, ID12 + ".Factor", true);
    if (!ISNULL(temp4), Va := temp4/1);
end
Corrente Variabile Solo lettura
numeric Unità: A json_path

Corrente

Scrittura
# Simple HTTP Request:
# VAR response := SENDHTTPREQUEST("/example/set/value=" + Va);
# IF response.IsSuccess = false
#  ADDERROR(response.StatusCode);
# END
#
# Set Http request method, body and headers
# VAR response := SENDHTTPREQUEST("/example/setValue", "GET", "value=" + Va, "header1:value1", "header2:value2", ...);\r
# Or VAR request := HTTPREQUEST("/example/setValue");
# request.Method := "PUT";
# VAR response := SENDHTTPREQUEST(request);
#r
#
# Send TCP, UDP data:
# VAR data1 := "{\"name\":\"John\", \"age\":" + Va + "}";
# SENDDATA(data1);
# VAR data2 := TOBYTES("{\"name\":\"John\", \"age\":" + Va + "}", "iso-8859-1");
# SENDDATA(data2);
# You can process received TCP or UDP data in the Listener script
#
#
# Upload data to FTP:
# FTPUPLOAD("filePath", "somedata=" + Va, "write"); # use "append" mode to append data to existing file
Lettura (modulo)
# Simple HTTP Request:
# VAR response := SENDHTTPREQUEST("/example/getValue");
# IF response.IsSuccess
#  VAR content := response.Content;
#  VAR responseHeaders := response.Headers;
#  RETURN(PARSEXML(content, "//element1/value1"));
# ELSE
#  ADDERROR(response.StatusCode + " (" + response.ReasonPhrase + ")");
#  RETURN(NaN);
# END
#
# Set Http request method, body and headers
# VAR response := SENDHTTPREQUEST("/example/getValue", "GET", "some data", "header1:value1", "header2:value2", ...);
# OR
# VAR request := HTTPREQUEST("/example/getValue", "POST", "some data");
# request.headers := { "header1:value1", "header2:value2", ...};
# request.method := "GET";
# request.data := null;
# VAR response := SENDHTTPREQUEST(request);
#
#
# Send TCP, UDP data:
# VAR data1 := BYTECOLLECTION("0a bb ea df 01");
# SENDDATA(data1);
# VAR data2 := "{\"name\":\"John\", \"age\":32}";
# SENDDATA(data2);
# VAR data3 := TOBYTES("{\"name\":\"John\", \"age\":32}", "iso-8859-1");
# SENDDATA(data3);
# Process received TCP or UDP data and set device values in the Listener script
#
#
# Download data from FTP:
# FTPDOWNLOAD("filePath");
Listener
if INDEXOF(RECEIVEDMSG.Topic, "SENSOR") > 0
	var tmp := RECEIVEDMSG.Payload;
    var temp4 := PARSEJSON(RECEIVEDMSG.Payload, ID12 + ".Current", true);
    if (!ISNULL(temp4), Va := temp4/1);
end
Uscita relè Interruttore

Relè principale AC 230V — richiede anche aggiornamento stato energetico allo spegnimento

boolean
Valori / Stati: ON-ACCESO · OFF-SPENTO

Uscita relè

Scrittura stato interruttore
var value1 := IF(St = 1, "1", "0");
MQTTPUBLISH("cmnd/" +  plug1topic + "/Power", value1);

var value2 := IF(St = 0, MQTTPUBLISH("cmnd/" +  plug1topic + "/Status", "8"));
Energia del periodo Variabile Solo lettura

Consumo nel periodo di telemetria corrente

numeric Unità: Wh json_path

Energia del periodo

Listener
if INDEXOF(RECEIVEDMSG.Topic, "SENSOR") > 0
	var tmp := RECEIVEDMSG.Payload;
    var temp4 := PARSEJSON(RECEIVEDMSG.Payload, ID12 + ".Period", true);
    if (!ISNULL(temp4), Va := temp4/1);
end
Potenza attiva Variabile Solo lettura
numeric Unità: W json_path

Potenza attiva

Listener
if INDEXOF(RECEIVEDMSG.Topic, "SENSOR") > 0
	var tmp := RECEIVEDMSG.Payload;
    var temp4 := PARSEJSON(RECEIVEDMSG.Payload, ID12 + ".Power", true);
    if (!ISNULL(temp4), Va := temp4/1);
end
Energia oggi Variabile Solo lettura

Consumo energetico cumulativo dalla mezzanotte

numeric Unità: kWh json_path

Energia oggi

Listener
if INDEXOF(RECEIVEDMSG.Topic, "SENSOR") > 0
	var tmp := RECEIVEDMSG.Payload;
    var temp4 := PARSEJSON(RECEIVEDMSG.Payload, ID12 + ".Today", true);
    if (!ISNULL(temp4), Va := temp4/1);
end
Potenza reattiva Variabile Solo lettura
numeric Unità: VAR json_path

Potenza reattiva

Listener
if INDEXOF(RECEIVEDMSG.Topic, "SENSOR") > 0
	var tmp := RECEIVEDMSG.Payload;
    var temp4 := PARSEJSON(RECEIVEDMSG.Payload, ID12 + ".ReactivePower", true);
    if (!ISNULL(temp4), Va := temp4/1);
end
Energia totale Variabile Solo lettura

Consumo cumulativo dall'avvio del contatore — persistente dopo i riavvii

numeric Unità: kWh json_path

Energia totale

Listener
if INDEXOF(RECEIVEDMSG.Topic, "SENSOR") > 0
	var tmp := RECEIVEDMSG.Payload;
    var temp4 := PARSEJSON(RECEIVEDMSG.Payload, ID12 + ".Total", true);
    if (!ISNULL(temp4), Va := temp4/1);
end
Tempo di attività Variabile Solo lettura

Tempo di attività del dispositivo in secondi dall'ultimo avvio

numeric Unità: s json_path

Tempo di attività

Listener
if INDEXOF(RECEIVEDMSG.Topic, "STATE") > 0
	var tmp := RECEIVEDMSG.Payload;
    var temp4 := PARSEJSON(RECEIVEDMSG.Payload, "UptimeSec", true);
    if (!ISNULL(temp4), Va := temp4);
end
Tensione Variabile Solo lettura
numeric Unità: V json_path

Tensione

Listener
if INDEXOF(RECEIVEDMSG.Topic, "SENSOR") > 0
	var tmp := RECEIVEDMSG.Payload;
    var temp4 := PARSEJSON(RECEIVEDMSG.Payload, ID12 + ".Voltage", true);
    if (!ISNULL(temp4), Va := temp4/1);
end
Intensità segnale WiFi Variabile Solo lettura

Livello segnale WiFi in dBm — diviso per 100 nel template (potrebbe necessitare ricalibrazione)

numeric Unità: dBm json_path

Intensità segnale WiFi

Listener
if INDEXOF(RECEIVEDMSG.Topic, "STATE") > 0
	var tmp := RECEIVEDMSG.Payload;
    var temp4 := PARSEJSON(RECEIVEDMSG.Payload, ID1 + ".Signal", true);
    if (!ISNULL(temp4), Va := temp4/100);
end
WiFi RSSI Ingresso analogico Solo lettura

Qualità segnale WiFi in percentuale, normalizzata nell'intervallo 0–1 per TapHome AnalogInput

numeric Unità: % json_path

WiFi RSSI

Listener
if INDEXOF(RECEIVEDMSG.Topic, "STATE") > 0
	var tmp := RECEIVEDMSG.Payload;
    var temp2 := PARSEJSON(RECEIVEDMSG.Payload, ID1 + ".RSSI", true);
    if (!ISNULL(temp2), An := temp2/100);
end
Connessione: Packet Parser → MQTT
Possibili miglioramenti (5)
  • Connection Status (LWT) — Last Will and Testament — Online/Offline payload. Could detect device connectivity.
  • Energy Yesterday — Yesterday's energy consumption in kWh. Available in SENSOR payload but not parsed by template.
  • Telemetry Period — Set telemetry interval (10–3600s, default 300). Could be exposed as service action.
  • Energy Counter Reset — Reset energy counters (Today, Yesterday, Total). Could be exposed as service action.
  • Energy Calibration Commands — BL0937 energy monitoring chip calibration — important for accurate readings but requires physical known load.

Fonti