martes, 29 de agosto de 2017

Dispositivos SonOff en HomeAssistant

En este artículo veremos cómo podemos integrar algunos dispositivos SonOff en nuestro HomeAssistant.

Dispositivos SonOff

SonOff es una serie de dispositivos inteligentes fabricados por el fabricante chino Itead que nos permiten de una manera fácil y económica montar un sistema de domótica en nuestra casa.
Casi todos los componentes de esta serie están basados en el chip ESP8266(EX) y algunos de ellos en el más evolucionado ESP8265, y aunque Itead proporciona una aplicación móvil y una nube propia para la gestión de sus dispositivos, se da la circunstancia de que son dispositivos fácilmente modificables para adaptarlos a nuestras necesidades particulares.
¡ATENCIÓN! El simple hecho de cortar el sello de papel que traen los dispositivos para abrir su carcasa hace que invalidemos su garantía. Lógicamente, si cambiamos su firmware ya no podremos obtener ningún soporte del fabricante ni del vendedor.
Los componentes más conocidos y más baratos son los siguientes:

SonOff Basic

Este dispositivo es el más básico y barato de la serie. Se trata de un interruptor Wifi, que en principio sólo nos permite eso: encender y apagar un aparato conectado a él.
SonOff Basic
Está basado en el SoC ESP8266EX, es de reducido tamaño y dispone de un par de terminales de entrada (vivo y neutro) y otro par de salida, con un relé intermedio que se activa y desactiva por medio del ESP8266 mediante su conexión Wifi. Además tiene un pequeño pulsador que permite activar y desactivar manualmente la conexión del relé y un led que se activa cuando el relé está cerrado.
Tamaño SonOff Basic
Detalle ESP8266EX
Vista general SonOff Basic
Pero sin duda, lo más interesante de este dispositivo es que dispone de unos pequeños agujeritos donde, soldando una regleta de 5 pines, podemos acceder a ciertas patillas del SoC pudiendo reprogramarlo a nuestro gusto y conectarle algunos periféricos extra. En la siguiente imagen vemos la disposición de estas conexiones:
GPIOS SonOff Basic
Podemos observar las conexiones que tenemos disponibles:
  • 4 conexiones (GND - TX - RX - VCC) que constituyen un puerto serie mediante el cual podemos programar el dispositivo.
  • 1 puerto en la misma línea (GPIO14) en el que podríamos conectar cualquier dispositivo controlable por medio de un solo pin: sensores de temperatura, 1wire, etc.
  • El pulsador está conectado entre tierra y otro puerto (GPIO0). Si soldamos unos pequeños cables a estos terminales también podríamos hacer uso de este puerto

SonOff POW

Este otro dispositivo es algo más avanzado, permitiéndonos además de encender y apagar, controlar la potencia y el voltaje de la corriente que circula en todo momento por el dispositivo.
SonOff POW
El empaquetado es bastante más robusto y es algo más grande. Existen además dos versiones: una de 10 Amperios que nos permite encender y apagar y controlar el consumo de aparatos de hasta 2200W (lámparas, estufas, etc) y otra de 16 Amperios que nos permite hacer lo mismo con aparatos de hasta 3500W (aires acondicionados, lavavajillas, lavadoras, etc).
Al igual que su hermano menor, dispone de una línea con agujeritos para soldar en este caso 4 pines que nos permitirán programar el dispositivo. En este modelo es muy peligroso conectar otros periféricos a las líneas de control porque la señal GND va conectada a uno de los terminales de la red (que puede ser el neutro pero también el vivo), con lo cual podríamos freir el sensor que le conectemos. Por tanto en principio no trae ningún GPIO fácilmente accesible.
Las conexiones serían las que se muestran en las siguientes imágenes:
GPIOs SonOff POW
CA SonOff POW

Programación

Para reprogramar un dispositivo SonOff según nuestras necesidades necesitamos los siguientes elementos:
  • Un programador de Arduinos y otros controladores, como el FTDI FT232 o similar. Siempre nos tenemos que asegurar de que el programador funcione a 3.3V y no a 5V, si no queremos freír el controlador del SonOff.
  • Un entorno de programación preparado para ESP8266. A continuación veremos cómo preparar el entorno utilizando el IDE de Arduino, aunque se puede utilizar cualquier otra herramienta.
  • Un software (o firmware) para meterle al SonOff, que nos proporcione las funcionalidades que necesitamos.
A continuación veremos los pasos que necesitamos para configurar cada uno de los elementos:

Paso 1: Conectar el programador

Para conectar el programador, nos aseguraremos de que realizamos las siguientes conexiones entre el mismo y el SonOff:
Conexion programador
Básicamente se trata de establecer un “null modem” entre ambos dispositivos, cruzando las líneas de recepción y transmisión y manteniendo las de alimentación y tierra. El resto de pines del programador se quedarán sin conectar.
De este modo, si conectamos el programador a nuestro ordenador, nos aparecerá un nuevo puerto serie (COMx) al que nos podemos conectar tanto para obtener la información que saque el dispositivo como para programarlo. Para esto último hay que entrar en modo programación como veremos más adelante.

Paso 2: Preparar el entorno

Para programar un dispositivo ESP8266 existe la posibilidad de utilizar el mismo lenguaje de Arduino (y su IDE), como vimos en este artículo, aunque existen otras posibilidades como LUA o MicroPython.
Nosotros vamos a utilizar Arduino como lenguaje de programación, para lo cual lo normal es utilizar su propio IDE (yo particularmente utilizo Eclipse que es mucho más potente, pero eso ya es otro cantar). Para ello tendremos que hacer lo siguiente:
  • Debemos disponer de una versión reciente del IDE (a partir de la 1.6.4). Se descarga en esta dirección. El IDE tal cual lo instalamos conoce muchas placas de hardware, como todos los modelos habidos y por haber de Arduino y otras muchas, pero en principio no conoce ningún dispositivo ESP8266.
  • Para ello, tendremos que instalar el soporte de ESP8266. Para ello, haremos lo siguiente:
    • Arrancamos el IDE.
    • Vamos a la opción preferencias dentro del menú Archivo.
    • En la opción “Gestor de URLs Adicionales de Tarjetas”, especificamos la siguiente dirección: http://arduino.esp8266.com/stable/package_esp8266com_index.json y pulsamos Ok.
      Url ESP8266
    • Vamos al menú Herramientas -> Placa -> Gestor de Tarjetas.
    • Seleccionamos ESP8266 Community y la instalamos.
      Gestor de tarjetas
    • A partir de ese momento, ya tenemos disponible toda la familia de productos basados en ESP8266 en el menú Herramientas -> Placa.
  • Para poder programar correctamente nuestro dispositivo, en el menú Herramientas debemos seleccionar exactamente las siguientes opciones. En caso contrario no nos va a funcionar:
    • Placa: Generic ESP8266 module.
    • Flash Mode: DOUT.
    • Flash Frequency: 40Mhz.
    • CPU Frequency: 80Mhz.
    • Flash Size: 1M (64K SPIFFS).
    • Debug Port: Disabled.
    • Debug Level: Ninguno.
    • Reset Method: CK.
    • Upload Speed: 115200.
    Opciones Esp8266
    En cuanto al puerto, lo podremos seleccionar cuando tengamos conectado el programador.

Paso 3: Elegir el software

A la hora de cambiar el funcionamiento de nuestros dispositivos SonOff, podemos elegir entre una gran cantidad de softwares, o firmwares, o como se les quiera llamar.
Unos tienen más características que otros, otros tienen un servidor web integrado, otros son más fácilmente configurables, etc. Yo voy a poner una lista de los más conocidos y el que yo he elegido concretamente. Todos ellos están programados en el lenguaje de Arduino y se pueden subir desde nuestro IDE ya preparado.
  • Tasmota.
    Este software soporta todos los dispositivos SonOff, incluye un servidor web y permite configurarlo de forma interactiva, se conecta a servidores MQTT y permite conectarles una gran cantidad de sensores, es actualizable por OTA, etc.
  • Espurna.
    Este software es español y tiene prácticamente las mismas características.
  • Homie.
    Homie es una librería que podemos incluir en nuestro Sketch de Arduino y que nos provee de una funcionalidad básica: conexión a Wifi, a MQTT, etc.
  • SonOff-HomeAssistant.
    Este software es muy básico: sólo nos permite encender y apagar los dispositivos y conectarles opcionalmente un sensor de temperatura y humedad. También es configurable mediante OTA, pero no tiene ninguna característica avanzada como configuración online, ni servidor web ni nada de eso.
En mi caso, me he quedado con esta última opción, ya que no necesito que un interruptor haga otra cosa: yo tengo de momento 3 SonOffs Basic funcionando: uno como interruptor simple, otro con un DHT22 que me mide la temperatura y la humedad (soportado directamente por el software) y un tercero con un sensor de temperatura DS18B20 mediante una modificación que he realizado en el código. Para mí es suficiente y es lo que voy a explicar.

Configuración

Para utilizar el software SonOff-HomeAssistant, nos iremos al repositorio y entraremos en el directorio arduino. Dentro de este directorio utilizaremos los siguientes programas:
  • ESPsonoff-v1.01pOTA, si vamos a utilizar un SonOff Basic sin ningún sensor conectado.
  • ESPsonoff-v1.01tOTA, si vamos a utilizar un SonOff Basic con un sensor de temperatura y humedad conectado (DHT11 ó DHT22).
  • ESPsonoff_POW-v1.0, si vamos a utilizar un SonOff POW.
Una vez descargado el software y abierto con el IDE de Arduino, deberemos ajustar los siguientes parámetros del código:
#define DHTTYPE         DHT22
// Aquí indicaremos DHT11 ó DHT22, según el modelo que tengamos

#define MQTT_CLIENT     "Sonoff_Living_Room_v1.01tOTA"
// Este parámetro indica el identificador que tiene este dispositivo de cara al MQTT.
// El identificador debe ser único para cada dispositivo

#define MQTT_SERVER     "192.168.0.100"                      
// Aquí indicamos la dirección IP del broker MQTT

#define MQTT_PORT       1883
// Puerto TCP del broker

#define MQTT_TOPIC      "home/sonoff/living_room/1"
// Tópico que utilizaremos para controlar este dispositivo, y en el que se 
// publicarán el estado del mismo y los valores de los sensores

#define MQTT_USER       "user"
// Usuario del broker MQTT

#define MQTT_PASS       "pass"
// Contraseña del mismo

#define WIFI_SSID       "homewifi"
// Nombre de la WIFI

#define WIFI_PASS "homepass"
// Contraseña de la WIFI

int kRetries = 10;
// Número de intentos a realizar para conectar a la Wifi.
// En mi caso tuve que aumentarlo a 50 porque tardaba en conectar.

Paso 4: Grabar el software

Una vez que tenemos el software descargado y configurado a nuestro gusto, tendremos que grabarlo en el dispositivo. Para ello tendremos que entrar en modo programación:
  1. Con el programador desconectado del puerto USB, dejar pulsado el pulsador del SonOff.
  2. Sin soltar el pulsador, conectar el programador a un puerto USB del ordenador.
  3. Dejar pulsado el pulsador unos 3 ó 4 segundos.
  4. Soltar el pulsador.
Desde este momento el controlador del SonOff, en lugar de ejecutar el software que tiene cargado, se queda a la espera de que le mandemos un nuevo software. Subiremos el software mediante la opción Programa -> Subir.
En caso de que nos dé un error de sincronización, podemos volver a intentarlo. En caso de que siga fallando, podríamos bajar la velocidad de flasheo de 115200 a 57600 o inferior. Si seguimos teniendo problemas, es posible que no hayamos entrado bien en el modo de programación: nos aseguraremos de que todos los parámetros están puestos tal y como se dice en el punto 2, desconectaremos y volveremos a entrar en modo programación.
Una vez que subamos el software, podemos desconectar el programador del ordenador y volver a conectarlo sin pulsar nada. Le daremos unos segundos y podemos comprobar si se conecta a la WIFI y que podamos encender y apagar el LED mediante el pulsador.

Paso 5: Modificaciones

En el caso del SonOff Basic, como ya se ha dicho, podemos conectarle cualquier sensor utilizando el GPIO 14 que tenemos disponible. Por ejemplo, siguiendo este esquema podríamos añadirle un sensor DHT11 o DHT22:
Esquema DHT
Si lo que tenemos es un sensor de temperatura Dallas DS18B20, utilizaríamos un esquema parecido, intercalando una resistencia de 4K7Ω entre la línea de datos y la de alimentación.
En lugar de utilizar la librería DHT.h, utilizaríamos:
  • OneWire.
  • DallasTemperature
Las modificaciones en el código serían muy simples:
Antes del método setup, añadiríamos:
OneWire one(PINDS18B20);
DallasTemperature sensorDallas(&one);
Dentro del método setup:
sensorDallas.begin();
Y finalmente, el método getTemp se quedaría así:
void getTemp() {
    Serial.print("DS18B20 read . . . . . . . . . . . . . . . . . ");
    char message_buff[60];

    // Lanzamos una petición para leer temperaturas...
    sensorDallas.requestTemperatures();

    // ... y obtenemos las del primero (y único, en principio)
    float temp = sensorDallas.getTempCByIndex(0);

    if (digitalRead(LED) == LOW) {
        blinkLED(LED, 100, 1);
    } else {
        blinkLED(LED, 100, 1);
        digitalWrite(LED, HIGH);
    }
    if (isnan(temp)) {
        mqttClient.publish(
                MQTT::Publish(MQTT_TOPIC"/debug", "\"DS18B20 Read Error\"").set_retain().set_qos(
                        1));
        Serial.println("ERROR");
        tempReport = false;
        return;
    }
    String pubString = "{\"Temp\": " + String(temp) + "}";
    pubString.toCharArray(message_buff, pubString.length() + 1);
    mqttClient.publish(
            MQTT::Publish(MQTT_TOPIC"/temp", message_buff).set_retain().set_qos(
                    1));
    Serial.println("OK");
    tempReport = false;
}

Integración en HomeAssistant

Finalmente, una vez que tenemos el software funcionando en nuestro dispositvo, tendremos que definirlo en nuestro HomeAssistant como interruptor o como luz. Para ello añadiremos a nuestro fichero configuration.yaml las siguientes líneas:
# Podríamos utilizarlo como interruptor (switch) o como luz (light)
switch:
  - platform: mqtt
    name: Interruptor 1
    state_topic: "micasa/sonoff/cocina/1/stat"
    command_topic: "micasa/sonoff/cocina/1"
    qos: 0
    payload_on: "on"
    payload_off: "off"
    retain: true
Además, en el caso de que le hayamos conectado un sensor de temperatura, habría que definir los sensores:
sensor:
- platform: mqtt
  name: "Temperatura cocina"
  state_topic: "micasa/sonoff/cocina/1/temp"
  unit_of_measurement: "°C"
  value_template: '{{ value_json.Temp | default(0) }}'

- platform: mqtt
  name: "Humedad cocina"
  state_topic: "micasa/sonoff/cocina/1/temp"
  unit_of_measurement: "%"
  value_template: '{{ value_json.Humidity | default(0) }}'

Montaje físico

Como ejemplo, en la siguiente imagen se muestra cómo integrar un SonOff Basic modificado con un sensor de temperatura dentro de un ventilador:
Montaje ventilador
Related Posts Plugin for WordPress, Blogger...

No hay comentarios:

Publicar un comentario