Dificuldade com minha primeira automação com sonoff mofificado


(wilson souza nascimento) #1

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.


(André F. Cruz) #2

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


(Jorge Assunção) #3

@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.


(wilson souza nascimento) #4

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


(Jorge Assunção) #5

É 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


(wilson souza nascimento) #6

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.


(wilson souza nascimento) #7

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.


(Jorge Assunção) #8

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


(Nuno Neves) #9

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…


(wilson souza nascimento) #10

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.


(wilson souza nascimento) #11

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

(Jorge Assunção) #12

A porta 3218 não pertence ao MQTT…


(wilson souza nascimento) #13

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.


(wilson souza nascimento) #14

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 ?


(wilson souza nascimento) #15

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.


(wilson souza nascimento) #16

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?


(Nuno Neves) #17

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


(wilson souza nascimento) #18

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.


(wilson souza nascimento) #19

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