Integrar Sonoff en Eedomus con firmware modificado

Integrar Sonoff en Eedomus con firmware modificado
« en: Agosto 22, 2018, 14:16:04 pm »
Primero saludos a todos, comentaros que no podemos realizar esta operación sin modificar nuestros Sonoff, voy a usar la versión básica y he reutilizado un código muy básico adaptado para Sonoff para integrarlo un poco mas con eedomus.

Lo primero es soldar unos header pin female a nuestro sonoff a si nos quedara mas profesional.

Necesitamos un adaptador USB a serie que podemos encontrar fácilmente entre los 7 / 10 Euros.

Descargamos Arduino en nuestro pc y también tenemos que descargar las librerías del microcontrolador ESP2688 para incluirlas en nuestro Arduino.

Una vez hecho esto se compila el código y se sube al microcontrolador y ya tendríamos nuestro sonoff listo e integrado con eedomus.

Voy a preparar unas fotos y el código, no es muy difícil  realizarlo, si acaso lo mas difícil sería soldar los pines.

phroc

  • *
  • 5703
  • Belle époque
    • Ver Perfil
    • PR-DOMOTICA
Re:Integrar Sonoff en Eedomus con firmware modificado
« Respuesta #1 en: Agosto 22, 2018, 15:03:16 pm »
Yo he desarrollado un firmware para Sonoff Basic que se integra con eedomus mediante la API eedomus.

Permite no sólo controlar el Sonoff desde eedomus, sino obtener retorno de estado en eedomus en el mismo periférico. De esta forma, eedomus sabe el estado también si se pulsa el pulsador físico.

Ese firmware va de la mano de un plugin para la Store eedomus que he desarrollado, para crear automáticamente el periférico necesario en eedomus. El plugin no está publicado aún. Estoy finalizando todo.

Es estupendo que hayas hecho tu otro firmware para eedomus, seguro que nos sirve para mejorar ambos desarrollos.

En efecto, no es complicado con IDE Arduino, ya sea en PC o en Mac.

Yo he optado por usar el gpio0, es decir el pulsador físico que trae el Sonoff, y le he soldado dos cables para poder conectarlo a uno o varios pulsador para poder controlar conmutadas, ya que en el Sonoff Basic el gpio14, que sería la otra alternativa, tiene un comportamiento errático en mi caso. No sé si será el Sonoff que estoy usando o son todos, pero no se comporta como el gpio0.

¿Como has enfocado tu esto del pulsador físico?

https://pr-domotica.es/

Communication Manager & Business Manager Spain at  NodOn
Consultoría en domótica inalámbrica e IoT
Formación Oficial Jeedom
Formación LoRa

Re:Integrar Sonoff en Eedomus con firmware modificado
« Respuesta #2 en: Agosto 22, 2018, 18:01:42 pm »
Del pulsador físico aún no le he metido mano, ahora mismo en resumidas cuentas cambio el estado de sonoff con un actuador http , cuando esté cambia el estado del relé se encarga de devolver el estado a eedomus atraves del API , tengo 4 valores en el actuador on off encendido y apagado. Además de poder ver tb el estado atraves de xml o en la web de labio de sonoff. Estoy esperando recibir una sonda de temperatura para integrarla en el gpio libre y poder conocer la temperatura de la misma envía dosela a eedomus y en mi caso ejecutar una escena.

La verdad que el botón aún no lo he probado pero  entiendo que podemos encender y apagar el relé. Por otra parte estaría muy bien cambiar el led por uno RGB y mostrarnos más información.

Voy a probarlo y te digo.

Enviado desde mi Nexus 5X mediante Tapatalk


Re:Integrar Sonoff en Eedomus con firmware modificado
« Respuesta #3 en: Agosto 22, 2018, 19:58:57 pm »
Bueno aun me queda pulir mas el código pero ya es funcional, he incluido el propio boton de sonoff, a ver si puedes explicarme un poco mas que querías phroc hacer con los cables que soldaste.

Código: [Seleccionar]
/*
  Simple Wifi Switch
*/

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <ESP8266HTTPClient.h>
MDNSResponder mdns;

// Replace with your network credentials
 const char* ssid = "TU_RED_WIFI";
 const char* password = "CLAVE_WIFI";

const char* device = "LED COCINA";

ESP8266WebServer server(80);

String web_on_html = "<h1>SONOFF switch is ON</h1><p><a href=\"on\"><button>ON</button></a>&nbsp;<a href=\"off\"><button>OFF</button></a></p>";
String web_off_html = "<h1>SONOFF switch is OFF</h1><p><a href=\"on\"><button>ON</button></a>&nbsp;<a href=\"off\"><button>OFF</button></a></p>";
String web_on_xml = "<?xml version='1.0'?><sonoff><estado>100</estado></sonoff>";
String web_off_xml = "<?xml version='1.0'?><sonoff><estado>0</estado></sonoff>";
String config_on_html = "<html> <title>Tuknet Wifi Rele</title> <div style='vertical-align:middle; position: absolute; left: 50%; top: 50%;  transform: translate(-50%, -50%); -webkit-transform: translate(-50%, -50%);'  > <table style='margin: 0 auto;'   border='0' cellpadding='0' cellspacing='0' width='100%'> <tr> <td style='padding: 10px 0 30px 0;'> <table align='center' border='0' cellpadding='0' cellspacing='0' width='600' style='border: 1px solid #cccccc; border-collapse: collapse;'> <tr> <td align='center' style='padding: 20px 0px 20px 0;'> <img src='https://www.tuknet.es/wp-content/uploads/2018/07/logo-tuknet_small.png' srcset='https://www.tuknet.es/wp-content/uploads/2018/07/logo-tuknet_small.png' alt='Tuknet 2018' width='203' height='55'  /> </td> </tr> <tr> <td bgcolor='#ffffff' style='padding: 40px 30px 40px 30px;'> <table border='0' cellpadding='0' cellspacing='0' width='100%'> <tr> <td> <table border='0' cellpadding='0' cellspacing='0' width='100%'> <p style='font-size:20px;text-align:center;'>El LED COCINA esta <b>encendido</b></p></table> </td> </tr> </table> </td> </tr> <tr> <td bgcolor='#2a70d3' style='padding: 30px 30px 30px 30px;'> <table border='0' cellpadding='0' cellspacing='0' width='100%'> <tr> <td style='text-align:center;color: #ffffff; font-family: Arial, sans-serif; font-size: 14px;' > &reg; Tuknet 2018 <br/></td></tr> </table> </td> </tr> </table> </div> </td> </tr> </table> </div> </html>";
String config_off_html = "<html> <title>Tuknet Wifi Rele</title> <div style='vertical-align:middle; position: absolute; left: 50%; top: 50%;  transform: translate(-50%, -50%); -webkit-transform: translate(-50%, -50%);'  > <table style='margin: 0 auto;'   border='0' cellpadding='0' cellspacing='0' width='100%'> <tr> <td style='padding: 10px 0 30px 0;'> <table align='center' border='0' cellpadding='0' cellspacing='0' width='600' style='border: 1px solid #cccccc; border-collapse: collapse;'> <tr> <td align='center' style='padding: 20px 0px 20px 0;'> <img src='https://www.tuknet.es/wp-content/uploads/2018/07/logo-tuknet_small.png' srcset='https://www.tuknet.es/wp-content/uploads/2018/07/logo-tuknet_small.png' alt='Tuknet 2018' width='203' height='55'  /> </td> </tr> <tr> <td bgcolor='#ffffff' style='padding: 40px 30px 40px 30px;'> <table border='0' cellpadding='0' cellspacing='0' width='100%'> <tr> <td> <table border='0' cellpadding='0' cellspacing='0' width='100%'> <p style='font-size:20px;text-align:center;'>El LED COCINA esta <b>apagado</b></p></table> </td> </tr> </table> </td> </tr> <tr> <td bgcolor='#2a70d3' style='padding: 30px 30px 30px 30px;'> <table border='0' cellpadding='0' cellspacing='0' width='100%'> <tr> <td style='text-align:center;color: #ffffff; font-family: Arial, sans-serif; font-size: 14px;' > &reg; Tuknet 2018 <br/></td></tr> </table> </td> </tr> </table> </div> </td> </tr> </table> </div> </html>";
int gpio_13_led = 13;
int gpio_12_relay = 12;
int gpio_0_button = 0;
int value = 0;
int estado = 0;

void setup(void){ 
  //  Init
  pinMode(gpio_13_led, OUTPUT);
  digitalWrite(gpio_13_led, LOW);
 
  pinMode(gpio_12_relay, OUTPUT);
  digitalWrite(gpio_12_relay, LOW);

  HTTPClient http;
  http.begin("http://api.eedomus.com/set?api_user=[TU_API_USER]&api_secret=[TU_API_SECRET]&action=periph.value&periph_id=[TU_ID_PERIFERICO]8&value=101");
 
  Serial.begin(115200);
  delay(5000);
  pinMode(gpio_0_button, INPUT);
 
  WiFi.begin(ssid, password);
  Serial.println("Connecting to wifi..");
     
   
  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    digitalWrite(gpio_13_led, LOW);
    delay(500);
    Serial.print(".");
    Serial.println(WiFi.localIP());
    Serial.println(WiFi.status());
    digitalWrite(gpio_13_led, HIGH);
    delay(500);
  }
 
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  Serial.print("Dispositivo: ");
  Serial.println(device);
 
  if (mdns.begin("esp8266", WiFi.localIP())) {
    Serial.println("MDNS responder started");
  }
 
  server.on("/", [](){
    if(digitalRead(gpio_12_relay)==HIGH) {
      server.send(200, "text/html", config_on_html);
    } else {
      server.send(200, "text/html", config_off_html);
    }
  });
  //Inicio prueba
  server.on("/xml", [](){
    if(digitalRead(gpio_12_relay)==HIGH) {
      server.send(200, "text/html", web_on_xml);
    } else {
      server.send(200, "text/html", web_off_xml);
    }
  });
  //Fin de prueba
 
  server.on("/onapi[HASH_API]", [](){
    server.send(200, "text/html", config_on_html);
    digitalWrite(gpio_13_led, LOW);
    digitalWrite(gpio_12_relay, HIGH);
    HTTPClient http;
    http.begin("http://api.eedomus.com/set?api_user=[TU_API_USER]&api_secret=[TU_API_SECRET]&action=periph.value&periph_id=[TU_ID_PERIFERICO]8&value=101");
    int httpCode = http.GET();
    delay(1000);
  });
 
  server.on("/offapi[HASH_API]", [](){
    server.send(200, "text/html", config_off_html);
    digitalWrite(gpio_13_led, HIGH);
    digitalWrite(gpio_12_relay, LOW);
     HTTPClient http;
    http.begin("http://api.eedomus.com/set?api_user=[TU_API_USER]&api_secret=[TU_API_SECRET]&action=periph.value&periph_id=[TU_ID_PERIFERICO]8&value=102");
    int httpCode = http.GET();
    delay(1000);
  });
 
  server.begin();
  Serial.println("Server ready..");
}
 
void loop(void){
  value = digitalRead(gpio_0_button);
   if (value == HIGH) {
      Serial.println("Suelto");
  }
  else {
      Serial.println("Pulsado");

      estado = digitalRead(gpio_12_relay);
      if (estado == 1){
       
        Serial.println("El rele estaba encendido lo apago");
        digitalWrite(gpio_13_led, HIGH);
        digitalWrite(gpio_12_relay, LOW);
        HTTPClient http;
        http.begin("http://api.eedomus.com/set?api_user=[TU_API_USER]&api_secret=[TU_API_SECRET]&action=periph.value&periph_id=[TU_ID_PERIFERICO]8&value=102");
        int httpCode = http.GET();
        delay(1000);
        }
     else{
        Serial.println("El rele estaba apagado lo enciendo");
        digitalWrite(gpio_13_led, LOW);
        digitalWrite(gpio_12_relay, HIGH);
        HTTPClient http;
        http.begin("http://api.eedomus.com/set?api_user=[TU_API_USER]&api_secret=[TU_API_SECRET]&action=periph.value&periph_id=[TU_ID_PERIFERICO]8&value=101");
        int httpCode = http.GET();
        delay(1000);
     
     
      }   
  }
  delay(1000);
  server.handleClient();
 
}

Re:Integrar Sonoff en Eedomus con firmware modificado
« Respuesta #4 en: Agosto 22, 2018, 20:00:51 pm »
Sería bueno hacer un tutorial completo para configurar el arduino y subir el código.

phroc

  • *
  • 5703
  • Belle époque
    • Ver Perfil
    • PR-DOMOTICA
Re:Integrar Sonoff en Eedomus con firmware modificado
« Respuesta #5 en: Agosto 22, 2018, 21:40:54 pm »
Fantástico.

Sí, sería bueno un tutorial completo. Podemos publicarlo en el blog.

Vamos a avanzar si te parece con los firmware y cuando lo tengamos todo lo documentamos paso a paso.

Voy a subir mi firmware aquí por si sirve. Así a bote pronto, el plugin que he hecho para la eedomus Store creo que valdría tanto para mi firmware como para el tuyo.

https://pr-domotica.es/

Communication Manager & Business Manager Spain at  NodOn
Consultoría en domótica inalámbrica e IoT
Formación Oficial Jeedom
Formación LoRa

phroc

  • *
  • 5703
  • Belle époque
    • Ver Perfil
    • PR-DOMOTICA
Re:Integrar Sonoff en Eedomus con firmware modificado
« Respuesta #6 en: Agosto 22, 2018, 21:48:19 pm »
Este es el firmware que he desarrollado yo. Muy parecido al tuyo en algunas cosas, y un enfoque distinto en otras.

Se puede controlar tanto desde eedomus como desde el pulsador del Sonoff, con reporte de estado en eedomus en ambos casos. Como te comentaba, lo he hecho con el pulsador porque el gpio14 tiene un comportamiento errático configurado como input. No sé en tu caso.


[EDITO: He modificado un poco el código. Lo que viene a continuación en la última versión]

Código: [Seleccionar]
/*********

  ESPeedomus v1.0
 
  Sketch para controlar módulos Sonoff desde eedomus

  Puede usarse, copiarse, distribuirse y modificarse libremente,
  siempre que se mencione su origen y su autor.

  Se proporciona sin ningún tipo de garantía, expresa o implícita,
  sobre su funcionamiento y uso.

  Desarrollado por Philippe Rochette
  Web: http://pr-domotica.es
  mail: contacto@pr-domotica.es
 
*********/

// Librerías que necesitamos

#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <ESP8266WebServer.h>
#include <ESP8266HTTPClient.h>


MDNSResponder mdns;
//--------------------------------------------------------------------
// En este apartado, el usuario debe indicar los datos de conexión
// a su red Wifi:
const char* ssid = "NOMBRE_DE_TU_RED_WIFI";
const char* password = "CONTRASEÑA_WIFI";
//--------------------------------------------------------------------

//--------------------------------------------------------------------
// En la siguiente cadena, el usuario debe sustituir los datos
// entre corchetes por los suyos propios (los corchetes deben
// suprimirse):
String http_request = "http://[IP_LOCAL_EEDOMUS]/api/set?api_user=[TU_API_USER_EEDOMUS]&api_secret=[TU_API_SECRET_EEDOMUS]&action=periph.value&periph_id=[CODIGO_API_PERIFERICO_SONOFF]&value=";
//--------------------------------------------------------------------

// Puerto del servidor http
ESP8266WebServer server(80);

// GPIO's usados
int gpio13Led = 13;
int gpio12Relay = 12;
int gpio0Switch = 0;


void setup(void) {

  // Configuración de los GPIO's
  pinMode(gpio13Led, OUTPUT);
  digitalWrite(gpio13Led, HIGH);

  pinMode(gpio12Relay, OUTPUT);
  digitalWrite(gpio12Relay, HIGH);

  pinMode(gpio0Switch, INPUT);

  Serial.begin(115200);
  delay(5000);
  WiFi.begin(ssid, password);
  Serial.println("");


  // Delay hasta conexión a Wifi
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Conectado a la red Wifi ");
  Serial.println(ssid);
  Serial.print("Dirección IP: ");
  Serial.println(WiFi.localIP());

  if (mdns.begin("esp8266", WiFi.localIP())) {
    Serial.println("MDNS responder operativo");
  }
 
  // Servidor http
  server.on("/sonoff/espeedomus/", []() {
  });
  server.on("/sonoff/espeedomus/100", []() {
    server.send(200, "text/html", "Sonoff ON");
    digitalWrite(gpio13Led, LOW);
    digitalWrite(gpio12Relay, HIGH);
    delay(1000);
  });
  server.on("/sonoff/espeedomus/10", []() {
    server.send(200, "text/html", "Sonoff OFF");
    digitalWrite(gpio13Led, HIGH);
    digitalWrite(gpio12Relay, LOW);
    delay(1000);
  });

  server.begin();
  Serial.println("Servidor HTTP operativo");
}

void loop(void) {
  server.handleClient();

  // Condiciones en caso de que el pulsador esté pulsado
  if ((digitalRead(gpio0Switch)==LOW) && (digitalRead(gpio12Relay)==HIGH)) {
  digitalWrite(gpio13Led, HIGH);
  digitalWrite(gpio12Relay, LOW);
  HTTPClient Post;
  Post.begin(http_request + 0);
  Post.POST(http_request + 0);
  Post.end();
  delay(350);
  };

 if ((digitalRead(gpio0Switch)==LOW) && (digitalRead(gpio12Relay)==LOW)) {
  digitalWrite(gpio13Led, LOW);
  digitalWrite(gpio12Relay, HIGH);
  HTTPClient Post;
  Post.begin(http_request + 1);
  Post.POST(http_request + 1);
  Post.end();
  delay(350);
  };
}
« Última modificación: Agosto 23, 2018, 14:05:05 pm por phroc »
https://pr-domotica.es/

Communication Manager & Business Manager Spain at  NodOn
Consultoría en domótica inalámbrica e IoT
Formación Oficial Jeedom
Formación LoRa

Re:Integrar Sonoff en Eedomus con firmware modificado
« Respuesta #7 en: Septiembre 03, 2018, 16:40:24 pm »
Espero impaciente este tutorial para comprarme 5 ó 6 :P

Prefieres tener una red mallada dedicada como Z-Wave o abrazas las bondades de wifi? Al tener otros dispositivos no domóticos en la red wifi, no podría llegar a dar algún problema?

Gracias Philip

phroc

  • *
  • 5703
  • Belle époque
    • Ver Perfil
    • PR-DOMOTICA
Re:Integrar Sonoff en Eedomus con firmware modificado
« Respuesta #8 en: Septiembre 03, 2018, 18:22:37 pm »
El tutorial de como falshear los Sonoff llegará, lo prometo, pero no puedo decir cuando aún porque tengo muchas cosas entre manos...

En cualquier caso, hay tutoriales sobre eso en la red y en español para los impacientes ;)


Por lo general no me gustan los periféricos domóticos Wifi, entre otras cosas porque las redes wifi, desde mi experiencia, son mucho menos estables que las redes Z-Wave. Lo que ocurre es que hoy en día no te puedes mantener al margen de lo que sucede en el mercado. El Wifi tiene su cuota de mercado en la domótica, y más ahora con los asistentes de voz como Google Home, ya que la integración con éstos se hace por Wifi y API.

En cuanto a los Sonoff, era más por investigar y cacharrear que otra cosa, y porque sé que estos dispositivos tienen mucho éxito por su precio y por tanto interesan a mucha gente. Están basados en el chip ESP8266, que es un must ahora mismo en el campo del IoT. Muchísimos dispositivos los usan y está bien saber qué es, cómo funciona, cómo programarlo... Pero no todo es oro lo que reluce ni en Sonoff ni en el ESP8266. La conexión Wifi que ofrecen puede llegar a fallar con cierta frecuencia según tu red Wifi y el router que uses. A mi me han dado quebraderos de cabeza con un router concreto de Asus y en cambio van como la seda con un Airport Extreme "viejito" de Apple. Ahora que tengo la fibra recién instalada, los volveré a probar con el router de fibra de Movistar, a ver qué estabilidad ofrecen.

https://pr-domotica.es/

Communication Manager & Business Manager Spain at  NodOn
Consultoría en domótica inalámbrica e IoT
Formación Oficial Jeedom
Formación LoRa

Re:Integrar Sonoff en Eedomus con firmware modificado
« Respuesta #9 en: Septiembre 03, 2018, 18:43:10 pm »
Tendremos que esperar! Gracias phroc


Enviado desde mi iPhone utilizando Tapatalk

Re:Integrar Sonoff en Eedomus con firmware modificado
« Respuesta #10 en: Septiembre 03, 2018, 20:28:40 pm »
Por cierto que sonoff me recomendáis comprar para integrar en eedomus un calefactor que tengo en el baño de 1000/2000w. Quiero que se active y se apague con el interruptor y así nunca me lo dejo encendido.... gracias!


Enviado desde mi iPhone utilizando Tapatalk

phroc

  • *
  • 5703
  • Belle époque
    • Ver Perfil
    • PR-DOMOTICA
Re:Integrar Sonoff en Eedomus con firmware modificado
« Respuesta #11 en: Septiembre 03, 2018, 20:36:14 pm »
Si quieres flashearlo con el firmware ESPeedomus, de momento tiene que ser el SonOff Basic, es el único compatible.

Si lo flasheas con ESPurna o Tasmota, tienes más para elegir. Quizá el que reporta consumo te interese.

https://pr-domotica.es/

Communication Manager & Business Manager Spain at  NodOn
Consultoría en domótica inalámbrica e IoT
Formación Oficial Jeedom
Formación LoRa

Re:Integrar Sonoff en Eedomus con firmware modificado
« Respuesta #12 en: Septiembre 03, 2018, 20:39:55 pm »
Cualquiera se puede integrar en eedomus?


Enviado desde mi iPhone utilizando Tapatalk

Bull

  • *****
  • 1341
  • IA unipersonal @1975
    • Ver Perfil
    • Domótica Domestica
Re:Integrar Sonoff en Eedomus con firmware modificado
« Respuesta #13 en: Septiembre 03, 2018, 20:42:04 pm »
Sonos son 10A máximo de carga, me da que vas un poco justo para manejar un calentador, si tienes zwave yo tiraría a por un schuko Aeon labs S3 que aguanta 16A 3500w.

http://amzn.eu/d/1f5CRps

Por cierto que sonoff me recomendáis comprar para integrar en eedomus un calefactor que tengo en el baño de 1000/2000w. Quiero que se active y se apague con el interruptor y así nunca me lo dejo encendido.... gracias!


Enviado desde mi iPhone utilizando Tapatalk
Todos nos equivocamos, por eso los lápices llevan goma.

phroc

  • *
  • 5703
  • Belle époque
    • Ver Perfil
    • PR-DOMOTICA
Re:Integrar Sonoff en Eedomus con firmware modificado
« Respuesta #14 en: Septiembre 03, 2018, 20:56:44 pm »
Sonos son 10A máximo de carga, me da que vas un poco justo para manejar un calentador, si tienes zwave yo tiraría a por un schuko Aeon labs S3 que aguanta 16A 3500w.

http://amzn.eu/d/1f5CRps

Por cierto que sonoff me recomendáis comprar para integrar en eedomus un calefactor que tengo en el baño de 1000/2000w. Quiero que se active y se apague con el interruptor y así nunca me lo dejo encendido.... gracias!


Enviado desde mi iPhone utilizando Tapatalk

Tienes toda la razón, no hay que llevar estar plaquitas a extremos... Mejor ser conservador en ese sentido y no llegar a los 10A.
https://pr-domotica.es/

Communication Manager & Business Manager Spain at  NodOn
Consultoría en domótica inalámbrica e IoT
Formación Oficial Jeedom
Formación LoRa