Forum Navigation
You need to log in to create posts and topics.

Integracion zigbee2mqtt en Excontrol (COLABORATIVO)

Vaya... Voy a crear un hilo en GitHub a ver si el autor da una solución

Desgraciadamente temporalmente no disponemos de tiempo para atender el foro... Si es muy urgente puede solicitar un presupuesto y fecha en el formulario de contacto....disculpen las molestias...

coloco y explico algunos avances que he echo con la central, yo tengo funcionando la central megamqtt pero le añadido codigo del ejemplo que subio roberto en este post de la zbigee2mqtt ya que tengo ese sistema implementado y otros por mqtt (tasmota) asi funciona todo en conjunto con la misma central.

Tengo funcionando 2 bombillas osram zbigee atraves de la pasarela zbigee2mqtt decir que esto nos sirve tambien para los sensores y todo tipo de dispositivos compatibles ya que la forma de comunicarse es la misma, a la bombillas les controlo el ON/OFF y el brillo desde la app, server o msg mqtt esternos y todo se refleja en app y server.

Al lio:

partiendo del rcc megamqtt

USER CODE LIBRARY

//LIBERIA PARA JSON//

#include <ArduinoJson.h>  esto lo he añadido es libreria para crear y leer formato JSON ejemplo {"stat":ON,"brightness":100, etc.....}

 

USER LOOP este parte creo que en los mkrmqtt esta en USER FUNCTIONS del editor

 

if (!clientMQTT.connected()) {connect();}

else{

int n=0;

for (n=0;n<Number_Circuit;n++){

if(mqttCircuit[n]!=circuits[n].Value){ //aca comparo para sólo enviar el mqtt una sola vez

boolean EvOk=false;//Variable que indica que todo comunico ok

if (circuits[n].Type==Dimmer){//Si el circuito es dimmer

int s= map(circuits[n].Value,0,100,0,254); // mapeamos valor app por valor bombilla total//

String a= String(s); // creamos variable tipo string del valor variable s//

EvOk=clientMQTT.publish(TopicCircuit[n],a,true,MqttQoS); //mandamod valor de variable "a" al circuito//

}

else{

if (circuits[n].Value>0){EvOk=clientMQTT.publish(TopicCircuit[n],"ON", true,MqttQoS);}

else{EvOk=clientMQTT.publish(TopicCircuit[n],"OFF",true,MqttQoS);}

}

if (EvOk){mqttCircuit[n]=circuits[n].Value;}//Si comunicacion ok actualizamos

#ifdef EXC_ENABLE_WATCH_DOG

wdt_reset();

#endif

}

}

con este codigo conseguimos que si el circuito es tipo dimmer mande el valor y no solo ON o OFF como estava de primeras ( Gracias Roberto)

USER FUNCTIONS 

for (n=0;n<Number_Circuit;n++){

//topic 'zigbee2mqtt/pizza', payload '{"color":{"x":0.381,"y":0.377},"state":"ON","brightness":30,"color_temp":50}'//

//FUNCION CAMBIAR ESTADO CIRCUITO 0 CON CIRCUITO 1 BRILLO//

if (topic==TopicEstado[1]){

DynamicJsonDocument doc(256);

deserializeJson(doc, payload);

JsonObject obj = doc.as<JsonObject>();

String z=doc["state"]; // valor de la parte state o ON/OFF//

if (z=="ON"){v=1;} // convierto valores de ON a 1//

else if(z=="OFF"){v=0;} // convierto valores de OFF a 0//

int x = map(doc["brightness"],0,254,0,100); // valor de la parte brillo que mapeo ya que la app es solo de 0 a 100/

mqttCircuit[1]=x;circuits[1].Value=x; // cambio valor circuito dimmer//

//extreaemos datos de brillo

Sensors[0].Value = doc["brightness"]; // paso valor brillo real bombilla a sensor ( solo era para probar)

mqttCircuit[0]=v;circuits[0].Value=v;return; // cambio valor circuito//

// con este codigo si actuamos directamente desde el circuito de brillo tambien se refleja el ON/OFF en su circuito de solo encendido o apagado.//

}

 

else {

if (topic==TopicEstado[n]){mqttCircuit[n]=v;circuits[n].Value=v;return;}

}}}

esta parte es la que la central comprueba los mensajes publicados por los dispositivos, con este codigo que es el que hay colgado en este post descomponemos el mensaje tipo JSON y con los valores extraidos actuamos.

 

GLOBAL VARIABLES

 

//Topic para actuar sobre los circuitos

const String   TopicCircuit[Number_Circuit]={"zigbee2mqtt/pizza/set","zigbee2mqtt/pizza/set/brightness","cmnd/calefactor/POWER","cmnd/ledmueble/POWER" }; //topic que mando desde la central//

//Topic de sensores... para sensores por mqtt

const String   TopicSensors[Number_Sensor]={"Sensor00"};

//Topic de retroaviso cambio  estado equipos

const String   TopicEstado[Number_Circuit]={"zigbee2mqtt/pizza","zigbee2mqtt/pizza","cmnd/calefactor/POWER","stat/ledmueble/POWER"}; //Topic que recibo desde la pasarle zbigee2mqtt cuando publico topic 'zigbee2mqtt/pizza', payload '{"color":{"x":0.381,"y":0.377},"state":"ON","brightness":0,"color_temp":50}'

 

bueno con esto espero que este un poco claro ahora me queda averiguar como generalizar un poco el codigo ya que como veis al recibir el mensaje de estado con ese mensaje actuamos sobre el estado de dos circuitos en este caso y entonces creo que no se puede hacer como estaba al principio en plan

ejemplo

if (topic==TopicEstado[n]){mqttCircuit[n]=v;circuits[n].Value=v;return;}

bueno si alguien sabe como hacerlo mejor jejejjejeje que seguro que todo esto se puede mejorar.

Cuelgo el rcc tambien que se ve mas claro recordar que el rcc es del mega no del mkr

Uploaded files:

Que buen aporte, gracias por compartir.

Desgraciadamente temporalmente no disponemos de tiempo para atender el foro... Si es muy urgente puede solicitar un presupuesto y fecha en el formulario de contacto....disculpen las molestias...

haber si alguien me echa una manita,que llevo dos dias que no soy capaz de integrar el codigo colgado en este post,el de zbigee2mqtt en el scketch de la central de megamqtt o la mkrmqtt que es lo mismo,el fallo esta en que paso el codigo en las mismas funciones donde esta en el ejemplo y cuando arranca la central me sale todo el rato mqtt conected en bucle,he probado varaias cosas y no  hay manera ya que en si que el ejemplo lo he echo funcionar de que atraves de un mensaje que recibo tipo  json me marque el valor en el sensor,  pero el codigo de el sensor de xiaomi no soy capaz.

decir que tambien consegui recibir y leer y actuar con el con el sensor de movimiento de xiaomi pero ese lo coloque en circuitos no en sensorer y creo que el fallo esta en que lo coloco en sensores pero no se porque me da el fallo, bueno yo cuelgo el scketch por si alguien se lo puede mirar y echarme una mano muchas gracias.

Uploaded files:

Hola Doverman.

En el void UserSetup() tienes comentada (desabilitada) la linea

//connect();

habilitala y prueba

Aprovecho para preguntarte, lo estas probando con ExControl server o con ExcServer.

En las pruebas que yo he hecho, el MKRMQTT solo se conecta con el ExcServer, no se si es asi o estoy haciendo algo mal.

Gracias.

No esa línea ya estaba desconectada cuando bajé el ejemplo esa función la hace por otro lado .

Las hago con Exserver pero para ver el log pero lo tengo todo funcionando con el servicio exserver a mi me paso igual es tema de firewall de windows y puertos

 

Ya aprovecho y pongo avances de momento tengo un sensor de movimiento de xiaomi (que por cierto es muy muy pequeño y lleva hasta sensor de lux) funcionando para que active circuitos del mkr principal y haciendo la función de alarma también.

bueno pongo otro pequeño avance es el rcc de xiaomkrmqtt pero tiene el codigo añadido para poder recibir los mensajes desde los sensores de xiomi en este ejemplo es con el sensor de temperatura y humedad, he tenido que añadir otro topicestadoSensores ya que sino estaba el arduino todo el rato conectando y desconectando ahora digamos que recibe los valores por un topic y los manda por otro como los circuitos, ahora desde esta central podemos mandar el valor del sensor donde queramos a la central que controla la calefaccion por ejemplo, a node red para que alexa lo cante, os dejo el ejemplo para que lo veais claro ya que solo esta con el sensor de temperatura.

Uploaded files:

Buen aporte, gracias por compartir

Desgraciadamente temporalmente no disponemos de tiempo para atender el foro... Si es muy urgente puede solicitar un presupuesto y fecha en el formulario de contacto....disculpen las molestias...

Doverman, me he descargado tu rcc he modificado red wifi e IP para probar, no he modificado nada mas.

Tambien me he bajado e instalado el ultimo archivo que ha puesto Roberto Service-2.0

Posiblemente mis conceptos son erroneos  o estoy haciendo algo mal pero por si me aclaras una duda.

Reinicio el server (Pc) por defecto sale Excontrol Server(32bits) (en este caso, anteriormente no ponia lo de 32bites) corriendo normalmente.

Conecto la shield MKRMQTT con tu codigo y mis IPs, si dejo el debug mode activo solo se conecta a la wifi y en el ordenador se escucha el clasico sonido de cuando conectas y desconectas un nuevo dispositivo en el ordenador.

Administrador de tareas, finalizo Excontrol Server(32bits) y activo ExcServer, se conecta perfectamente la central MKRMQTT y puedo ver los topic que tienes puestos en el monitor del server.

Adjunto pantallazo con los programas que tiene el PC donde esta alojado el servidor y administrador de tareas.

Me puedes indicar si los programas señalados son los mismos que tienes tu y si te conectas correctamente con Excontrol Server y con ExcServer.

Muchas gracias

 

Uploaded files:
  • Datos-servidor.png

Buenos días!

Has abierto el puerto mqtt en el cortafuegos? Para el servicio el puerto tiene que estar abierto de forma manual. Exserver pregunta para crear la regla al iniciar.

 

Otra vez no pude conectar al servicio lo arregle simplemente actualizando firmware de wifi y definición de la placa Arduino.

Las versiones nuevas de mqtt net son más estrictas q las viejas, o se ejecuta perfectamente el protocolo o se rechaza el cliente y visto lo visto el firmware viejo de la placa tenía algún defecto.

No sé porque realizaron este cambio, pero supongo q por algún tipo de ataque, es en único sentido para un cambio tan radical....pues después de ese cambio han hecho un montón de actualizaciones y no lo han movido.

Desgraciadamente temporalmente no disponemos de tiempo para atender el foro... Si es muy urgente puede solicitar un presupuesto y fecha en el formulario de contacto....disculpen las molestias...