Dificuldade com minha primeira automação com sonoff mofificado

Ola a todos.

Estou começando agora o meu estudo sobre HA.

Com a ajuda que já recebi aqui no fórum, consegui editar os arquivos .yaml.

No entanto ainda preciso de ajuda para que o HA reconheça meus devices.

Tenho um sonoff que modifiquei o firmware dela com o seguinte código:

 /*

MQTT Light for Home-Assistant - NodeMCU (ESP8266)

https://home-assistant.io/components/light.mqtt/

Libraries :

- ESP8266 core for Arduino : https://github.com/esp8266/Arduino

- PubSubClient : https://github.com/knolleary/pubsubclient

Sources :

- File > Examples > ES8266WiFi > WiFiClient

- File > Examples > PubSubClient > mqtt_auth

- File > Examples > PubSubClient > mqtt_esp8266

Schematic :

- https://github.com/mertenats/open-home-automation/blob/master/ha_mqtt_light/Schematic.png

- GND - LED - Resistor 220 Ohms - D1/GPIO5

Configuration (HA) :

light:

platform: mqtt

name: Office light'

state_topic: 'iead/light1/status'

command_topic: 'iead/light1/switch'

optimistic: false

Wilson S.N. - v1.1 - 11.2018

*/

#include <ESP8266WiFi.h>

#include <PubSubClient.h>

#define MQTT_VERSION MQTT_VERSION_3_1_1

// Wifi: SSID and password

const char* WIFI_SSID = "wifi";

const char* WIFI_PASSWORD = "minhasenha";

// MQTT: ID, server IP, port, username and password

const PROGMEM char* MQTT_CLIENT_ID = "gate_light";

const PROGMEM char* MQTT_SERVER_IP = "192.168.15.9";

const PROGMEM uint16_t MQTT_SERVER_PORT = 1883;

const PROGMEM char* MQTT_USER = "MQTT_wilson";

const PROGMEM char* MQTT_PASSWORD = "sennha_do_wilson";

// MQTT: topics

const char* MQTT_LIGHT_STATE_TOPIC = "iead/light1/status";

const char* MQTT_LIGHT_COMMAND_TOPIC = "iead/light1/switch";

// payloads by default (on/off)

const char* LIGHT_ON = "ON";

const char* LIGHT_OFF = "OFF";

const PROGMEM uint8_t LED_PIN = 12;

boolean m_light_state = false; // light is turned off by default

WiFiClient wifiClient;

PubSubClient client(wifiClient);

// function called to publish the state of the light (on/off)

void publishLightState() {

if (m_light_state) {

client.publish(MQTT_LIGHT_STATE_TOPIC, LIGHT_ON, true);

} else {

client.publish(MQTT_LIGHT_STATE_TOPIC, LIGHT_OFF, true);

}

}

// function called to turn on/off the light

void setLightState() {

if (m_light_state) {

digitalWrite(LED_PIN, HIGH);

Serial.println("INFO: Turn light on...");

} else {

digitalWrite(LED_PIN, LOW);

Serial.println("INFO: Turn light off...");

}

}

// function called when a MQTT message arrived

void callback(char* p_topic, byte* p_payload, unsigned int p_length) {

// concat the payload into a string

String payload;

for (uint8_t i = 0; i < p_length; i++) {

payload.concat((char)p_payload[i]);

}

// handle message topic

if (String(MQTT_LIGHT_COMMAND_TOPIC).equals(p_topic)) {

// test if the payload is equal to "ON" or "OFF"

if (payload.equals(String(LIGHT_ON))) {

if (m_light_state != true) {

m_light_state = true;

setLightState();

publishLightState();

}

} else if (payload.equals(String(LIGHT_OFF))) {

if (m_light_state != false) {

m_light_state = false;

setLightState();

publishLightState();

}

}

}

}

void reconnect() {

// Loop until we're reconnected

while (!client.connected()) {

Serial.println("INFO: Attempting MQTT connection...");

// Attempt to connect

if (client.connect(MQTT_CLIENT_ID, MQTT_USER, MQTT_PASSWORD)) {

Serial.println("INFO: connected");

// Once connected, publish an announcement...

publishLightState();

// ... and resubscribe

client.subscribe(MQTT_LIGHT_COMMAND_TOPIC);

} else {

Serial.print("ERROR: failed, rc=");

Serial.print(client.state());

Serial.println("DEBUG: try again in 5 seconds");

// Wait 5 seconds before retrying

delay(5000);

}

}

}

void setup() {

// init the serial

Serial.begin(115200);

// init the led

pinMode(LED_PIN, OUTPUT);

analogWriteRange(255);

setLightState();

// init the WiFi connection

Serial.println();

Serial.println();

Serial.print("INFO: Connecting to ");

WiFi.mode(WIFI_STA);

Serial.println(WIFI_SSID);

WiFi.begin(WIFI_SSID, WIFI_PASSWORD);

while (WiFi.status() != WL_CONNECTED) {

delay(500);

Serial.print(".");

}

Serial.println("");

Serial.println("INFO: WiFi connected");

Serial.print("INFO: IP address: ");

Serial.println(WiFi.localIP());

// init the MQTT connection

client.setServer(MQTT_SERVER_IP, MQTT_SERVER_PORT);

client.setCallback(callback);

}

void loop() {

if (!client.connected()) {

reconnect();

}

client.loop();

}/>

Consigo compilar e gravar no módulo sonoff, utilizei também as configurações para o HA conforme sugerido no próprio código fonte acima. Minha configuração de configuration.yaml. Ficou assim:

 homeassistant:
  # Name of the location where Home Assistant is running
  name: Home
  # Location required to calculate the time the sun rises and sets
  latitude: 0
  longitude: 0
  # Impacts weather/sunrise data (altitude above sea level in meters)
  elevation: 0
  # metric for Metric, imperial for Imperial
  unit_system: metric
  # Pick yours from here: http://en.wikipedia.org/wiki/List_of_tz_database_time_zones
  time_zone: UTC
  # Customization file
  customize: !include customize.yaml

# Show links to resources in log and frontend
introduction:

# Enables the frontend
frontend:

# Enables configuration UI
config:

# Uncomment this if you are using SSL/TLS, running in Docker container, etc.
# http:
#   base_url: example.duckdns.org:8123

# Checks for available updates
# Note: This component will send some information about your system to
# the developers to assist with development of Home Assistant.
# For more information, please see:
# https://home-assistant.io/blog/2016/10/25/explaining-the-updater/
updater:
  # Optional, allows Home Assistant developers to focus on popular components.
  # include_used_components: true

# Discover some devices automatically
discovery:

# Allows you to issue voice commands from the frontend in enabled browsers
conversation:

# Enables support for tracking state changes over time
history:

# View all events in a logbook
logbook:

# Enables a map showing the location of tracked devices
map:

# Track the sun
sun:

# Sensors
sensor:
  # Weather prediction
  - platform: yr
  - platform: random
  

# Text to speech
tts:
  - platform: google

# Cloud
cloud:

group: !include groups.yaml
automation: !include automations.yaml
script: !include scripts.yaml



automation:
  - alias: Check sensor value and show notification
    trigger:
      platform: numeric_state
      entity_id: sensor.random_sensor
      above: 10
    action:
      service: persistent_notification.create
      data:
        message: "Sensor value greater than 10"



light:
      platform: mqtt
      name: iead_light'
      state_topic: 'iead/light1/status'
      command_topic: 'iead/light1/switch'
      optimistic: false
      

mqtt:
    broker: localhost
    port: 1883
    client_id: gate_light
    keepalive: 60
    username: !secret username_mqtt
    password: !secret password_mqtt
    protocol: 3.1.1
    discovery: true
    
    


panel_iframe:
  configurator:
    title: Configurator
    icon: mdi:wrench
    url: http://hassio.local:3218

O HA não acusa erro, mas o sonoff não aparece, e portanto não pode ser acessado. Como posso resolver isto? Será que não configurei corretamente o mqtt?
E sim estou lendo a documentação do HA, mas como estou no início, estou tendo dificuldades.

Obrigado pela paciência de todos.

Tens vários exemplos no fórum de como configurar o ficheiro configuration.yaml

@wilson quando publicares código deves sublinhar o texto que queres transformar em código e clicar no ícone </>. Deverá existir um espaço antes e outro depois do bloco de código para que funcione correctamente.

Quando publicares código muito longo, como por exemplo deves utilizar um serviço externo como o Hastebin ou o Pastebin e depois colocar aqui o link.

Peço-te que alteres por favor a tua publicação inicial pois está demasiado confusa. Assim como está será difícil alguém te poder ajudar.

ok. editei o que escrevi. acho que ficou mais fácil agora.

1 Curtiu

É estranho o HA não dar nenhum erro pois a primeira coisa que salta à vista no configuration.yaml é que a formatação nas entradas light: e mqtt: está errada.

Os ficheiros YAML são muito sensíveis ao espaçamento, devendo sempre ser utilizados em múltiplos de 2.

Podes ler um pouco mais sobre o YAML aqui:

http://yaml.org/spec/1.2/spec.html

Na verdade os espaços estão com multiplos de 2.
Para verificar, fiz teste diminuindo e aumentando os espaços. realmente a verificação de configurações acusa erro quando mudo. Mas quando deixo tudo certo, nenhum erro é acusado.
Realmente ainda não consegui fazer o sonoff funcionar.

Será que o defeito não esta nas configurações do mqtt e das configurações do device?

oOs códigos em destaque estão aqui:

light:
      platform: mqtt
      name: "iead_light"
      state_topic: "iead/light1/status"
      command_topic: "iead/light1/switch"
      optimistic: false
      

mqtt:
    broker: localhost
    port: 1883
    client_id: gate_light
    keepalive: 60
    username: !secret username_mqtt
    password: !secret password_mqtt
    protocol: 3.1.1
    discovery: true

consegui colocar um ip fixo na hasp pi.

192.168.15.9

no sonoff utilizei os mesmos endereços. será que existe algum conflito ai?

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

#define MQTT_VERSION MQTT_VERSION_3_1_1

// Wifi: SSID and password
const char* WIFI_SSID = "wifi-iead";
const char* WIFI_PASSWORD = "xxxxxxxxxxxxxxx";

// MQTT: ID, server IP, port, username and password
const PROGMEM char* MQTT_CLIENT_ID = "gate_light";
const PROGMEM char* MQTT_SERVER_IP = "192.168.15.9";
const PROGMEM uint16_t MQTT_SERVER_PORT = 1883;
const PROGMEM char* MQTT_USER = "MQTT_wilson";
const PROGMEM char* MQTT_PASSWORD = "sennha_do_wilson";

// MQTT: topics
const char* MQTT_LIGHT_STATE_TOPIC = "iead/light1/status";
const char* MQTT_LIGHT_COMMAND_TOPIC = "iead/light1/switch";

Comigo as coisas sempre são mais difíceis. Espero que consiga resolver este problema.

Experimenta trocar broker: localhost por broker: 192.168.15.9 e retira o optimistic da entrada light:

Bem, as coisas são difíceis porque estas a seguir o caminho mais difícil! Porque não flashar o sonoff com tasmota?! Muito mais simples…
Claro que usar código personalizado é mais desafiante, mas se estás a ter dificuldades se calhar o ideal era mudares a abordagem…

1 Curtiu

Verdade, vou tentar usar o tasmota ainda hoje.
Mas olhem o que descobri:
O sonoff se conecta a minha rede wifi, ele não consegue é se conectar com o broker. estou vendo isto pela inteface do arduino.
No log do HA vejo que ocerre algum erro com o mqtt também. Acredito que o defeito esteja nas configurações do broker mosquito. Vou pesquisar por aqui, mas se alguém souber de alguma coisa eu agradeço.

olhem a resposta do módulo sonoff

INFO: Connecting to wifi-iead
.
INFO: WiFi connected
INFO: IP address: 192.168.15.12
INFO: Attempting MQTT connection...
ERROR: failed, rc=-2DEBUG: try again in 5 seconds
INFO: Attempting MQTT connection...
ERROR: failed, rc=-2DEBUG: try again in 5 seconds
INFO: Attempting MQTT connection...
ERROR: failed, rc=-2DEBUG: try again in 5 seconds

agora o log do HA

INFO:2018-11-12 19:01:14,486:__main__:Starting server
INFO:2018-11-12 19:01:14,487:__main__:Listening on: http://0.0.0.0:3218

A porta 3218 não pertence ao MQTT…

Pois é . Acredito que o defeito esteja nas configurações do mqtt.

alterei esta linha no programa do sonoff:
const PROGMEM char* MQTT_SERVER_IP = “192.168.1.16”;
const PROGMEM uint16_t MQTT_SERVER_PORT = 1883;

e agora a resposta do módulo é esta:

INFO: Connecting to wifi-iead
......................

a resposta do HA é

[INFO] Setup mosquitto configuration
[WARN] SSL not enabled - No valid certs found!
[INFO] No local user available
[INFO] Initialize Hass.io Add-on services
[INFO] Initialize Home Assistant discovery
[INFO] Start Mosquitto daemon
1542049222: mosquitto version 1.4.15 (build date 2018-03-04 15:35:59+0000) starting
1542049222: Config loaded from /etc/mosquitto.conf.
1542049222: *** auth-plug: startup
1542049222: ** Configured order: http
1542049222: Opening ipv4 listen socket on port 1883.
1542049222: Opening ipv6 listen socket on port 1883.
1542049222: Opening websockets listen socket on port 1884.
1542049222: Warning: Mosquitto should not be run as root/administrator.
1542049251: New connection from 172.30.32.1 on port 1883.
[ERROR] Auth error with MQTT_wilson
1542049251: Socket error on client <unknown>, disconnecting.
1542051022: Saving in-memory database to /data/mosquitto.db.

O HA esta acusando erro de autenticação do mqtt.

Vou verificar estas configurações, mas se alguém souber qual o erro, por favor me ajude.

O que descobri agora.

Log

[INFO] Setup mosquitto configuration
[WARN] SSL not enabled - No valid certs found!
[INFO] Found local users inside config
[INFO] Initialize Hass.io Add-on services
[INFO] Initialize Home Assistant discovery
[INFO] Start Mosquitto daemon
1542055801: mosquitto version 1.4.15 (build date 2018-03-04 15:35:59+0000) starting
1542055801: Config loaded from /etc/mosquitto.conf.
1542055801: *** auth-plug: startup
1542055801: ** Configured order: http
1542055801: Opening ipv4 listen socket on port 1883.
1542055801: Opening ipv6 listen socket on port 1883.
1542055801: Opening websockets listen socket on port 1884.
1542055801: Warning: Mosquitto should not be run as root/administrator.
1542055830: New connection from 172.30.32.1 on port 1883.
[INFO] found MQTT_wilson on local database
1542055830: New client connected from 172.30.32.1 as gate_light (c1, k60, u'MQTT_wilson')

O que seria esta conexão 172.30.32.1 ?

Respondendo a mim mesmo.

Mudei o nome da authenticação mqtt e o resultado agora é:

Log

[INFO] Setup mosquitto configuration
[WARN] SSL not enabled - No valid certs found!
[INFO] Found local users inside config
[INFO] Initialize Hass.io Add-on services
[INFO] Initialize Home Assistant discovery
[INFO] Start Mosquitto daemon
1542057778: mosquitto version 1.4.15 (build date 2018-03-04 15:35:59+0000) starting
1542057778: Config loaded from /etc/mosquitto.conf.
1542057778: *** auth-plug: startup
1542057778: ** Configured order: http
1542057778: Opening ipv4 listen socket on port 1883.
1542057778: Opening ipv6 listen socket on port 1883.
1542057778: Opening websockets listen socket on port 1884.
1542057778: Warning: Mosquitto should not be run as root/administrator.
1542057807: New connection from 172.30.32.1 on port 1883.
[INFO] found MQTT_big_iead_wilson on local database
1542057807: New client connected from 172.30.32.1 as gate_light (c1, k60, u'MQTT_big_iead_wilson').

o sonoff esta tentando se conectar com o ha, mais ainda assim esta faltando algo.

INFO: Connecting to wifi-iead
......
INFO: WiFi connected
INFO: IP address: 192.168.15.5
INFO: Attempting MQTT connection...
ERROR: failed, rc=-2DEBUG: try again in 5 seconds
INFO: Attempting MQTT connection...
ERROR: failed, rc=-2DEBUG: try again in 5 seconds

a chave virtual de ligar e desligar o sonoff já aparece na tela principal do HA.

estamos caminhando.

uma ajudinha seria muito bom.

Olhem só. descobri que o endereço do mqtt deve ser o mesmo atribuido ao HA ou haspberry pi.

coloquei o mesmo endereço e o sonoff se conectou.

INFO: Connecting to wifi-iead
.......
INFO: WiFi connected
INFO: IP address: 192.168.15.5
INFO: Attempting MQTT connection...
INFO: connected

o log do mosquito

Log

[INFO] Setup mosquitto configuration
[WARN] SSL not enabled - No valid certs found!
[INFO] Found local users inside config
[INFO] Initialize Hass.io Add-on services
[INFO] Initialize Home Assistant discovery
[INFO] Start Mosquitto daemon
1542062678: mosquitto version 1.4.15 (build date 2018-03-04 15:35:59+0000) starting
1542062678: Config loaded from /etc/mosquitto.conf.
1542062678: *** auth-plug: startup
1542062678: ** Configured order: http
1542062678: Opening ipv4 listen socket on port 1883.
1542062678: Opening ipv6 listen socket on port 1883.
1542062678: Opening websockets listen socket on port 1884.
1542062678: Warning: Mosquitto should not be run as root/administrator.
1542062716: New connection from 192.168.15.5 on port 1883.
[INFO] found MQTT_big_iead_wilson on local database
1542062716: New client connected from 192.168.15.5 as gate_light (c1, k15, u'MQTT_big_iead_wilson').
1542062828: Client gate_light has exceeded timeout, disconnecting.
1542062828: Socket error on client gate_light, disconnecting.
1542062835: New connection from 192.168.15.5 on port 1883.
[INFO] found MQTT_big_iead_wilson on local database
1542062835: New client connected from 192.168.15.5 as gate_light (c1, k15, u'MQTT_big_iead_wilson').
1542064479: Saving in-memory database to /data/mosquitto.db.
1542064777: Client gate_light has exceeded timeout, disconnecting.
1542064777: Socket error on client gate_light, disconnecting.
1542064778: New connection from 192.168.15.5 on port 1883.
[INFO] found MQTT_big_iead_wilson on local database
1542064778: New client connected from 192.168.15.5 as gate_light (c1, k15, u'MQTT_big_iead_wilson').
1542064800: Client gate_light has exceeded timeout, disconnecting.
1542064800: Socket error on client gate_light, disconnecting.
1542064800: New connection from 192.168.15.5 on port 1883.
[INFO] found MQTT_big_iead_wilson on local database
1542064800: New client connected from 192.168.15.5 as gate_light (c1, k15, u'MQTT_big_iead_wilson').

Mas agora a chave virtual que deveria ativar e desativar o rele desapareceu do painel do HA. ???

O que eu estou fazendo de errado?

1 Curtiu

Quais as configurações do mqtt no tasmota?
Coloca o resultado do comando backlog status; status 1; status 2; status 5; status 6 na consola do tasmota

Ola amigo Nuno.

Não estou usando o tasmota ainda. estou usando um outro projeto chamado: OpenHome.
Peguei no github.

Mas também vou estudar tasmota, para me aperfeiçoar em HA.

Vou continuar aqui com a pesquisa do porque de não aparecer o comando na tela do HA.

Vamos em frente.

Socorro. Não sei como controlar este módulo pelo painel do HA. Alguém me ajude por favor.

Este tópico foi automaticamente fechado 90 dias após a última resposta. Novas respostas não são permitidas.


Copyright © 2017-2021. Todos os direitos reservados
CPHA.pt - info@cpha.pt


FAQ | Termos de Serviço/Regras | Política de Privacidade