Node-Red / Xiaomi

Hola a todos,

Con la llegada de Node-Red a Gladys, me preguntaba si alguien podría ayudarme a configurar mis interruptores dobles y uno simple para poder gestionarlos a través de Gladys.

He seguido el video de Pierre Gilles al pie de la letra y hasta ahora no hay problemas.

He instalado node-red-contrib-xiaomi-smart-devices para conectar mis dispositivos Xiaomi y logro detectar mis interruptores y sensores.

Sin embargo, me bloqueo en la gestión de mi interruptor simple (para empezar antes de intentar los dobles) para conectarlo a Gladys.

En Gladys, he creado mi tema Mqtt y he añadido mi interruptor en el panel de control.

En Node-red, he creado y conectado el nodo Mqtt, el nodo switch con el debug on/off también funciona. Mi dispositivo Xiaomi también es reconocido y conectado.

Me falta el enlace entre los dos, con la función correcta entre el switch y el dispositivo, creo.

Un poco de ayuda :cry: por favor. Aclaro que no soy experto y mucho menos en Node-Red, soy más bien un manitas.

Decidme las capturas de pantalla que necesitaréis

¡Hola @jerome, lo vamos a mirar juntos! :slight_smile:

¿No funciona simplemente conectar el interruptor con tu « interruptor habitación » como hago en el video?

¿Puedes encender/apagar tu interruptor desde Node-RED?

Hola @pierre-gilles

No, no puedo encender/apagar el interruptor tampoco, está conectado pero cuando conecto un switch o un inyector no hay resultado. Aquí está lo que se especifica en node red :

Inputs

payload.channel_0. string

on - si quieres encender
off - apagar
switch - cambiar estado encendido → apagado, apagado → encendido

payload.channel_1 string

on - si quieres encender
off - apagar
switch - cambiar estado encendido → apagado, apagado → encendido

Outputs

Pasa el objeto json completo recibido del nodo a la salida

Mensaje de ejemplo de Wired Single-Button:

{ « fromip »:« 192.168.0.110:4321 », « ip »:« 192.168.0.110 », « port »:4321, « payload »:{ « channel_0 »:« on », « time »:1556987229523, « sid »:« 158d000128f9dd », « model »:« ctrl_ln1 » } }

Mensaje de ejemplo de Wireless Double-Buttons:

{ « fromip »:« 192.168.0.110:4321 », « ip »:« 192.168.0.110 », « port »:4321, « payload »:{ « channel_1 »:« click », « time »:1556987769175, « sid »:« 158d000242275f », « model »:« 86sw2 » } }

¿Hay que añadir una función entre los dos? ¿Hay que indicar el channel_0 en algún sitio?

Gracias por tu ayuda, porque por mucho que busque tutoriales o información en internet no encuentro gran cosa sobre node-red-contrib-xiaomi-smart-devices

Tienes que usar un nodo « Inject »

Puedes inyectar datos en el payload:

Luego conectas tu nodo « inject » a tu nodo xiaomi

Puedes probar si funciona haciendo clic en el botón del nodo « inject » :slight_smile:

He probado esta manipulación, pero no pasa nada. En modo depuración obtengo este mensaje:

msg : string[62]
« Error: Expresión de propiedad no válida: inesperado en la posición 8 »

¿Podrías enviarme una captura de pantalla de tu nodo inyectado y una exportación del JSON si es posible?

El error que encontré fue porque probé con el espacio después de payload. channel_0 como en tu captura de pantalla me parecía raro.

Pero lo había probado sin espacio antes, tampoco hubo retorno de depuración

¿Exportar el json? ¿Es eso lo que me falta entre los dos?

Ah no, pero no hay espacio después de payload., es un error mío, solo hice una captura de pantalla rápido ^^

¿Puedes poner tu depuración justo después de tu inyección para ver cómo se ve tu payload?

No, solo te pedí un export para que yo pueda ver lo que haces. No pasa nada, la captura de pantalla también está bien :slight_smile:

Hola @pierre-gilles

Gracias al depurado, finalmente logré encender y apagar la luz mediante mi interruptor

Aquí está el resultado :

Voy a intentar controlarlo mediante gladys ahora

¡Genial! ¡Mantenos informados, y si puedes, cuando lo logres, haz un pequeño tutorial en la categoría « Tutoriales » del foro, ¡eso ayudará a otras personas!

Bueno, estoy un poco atascado.

No logro conectar MQTT con el actuador de mi interruptor Xiaomi.

Fase 1: como en el video, OK, en modo depuración recibo bien los valores 0 y 1
Fase 2: con el input logro encender o apagar la luz

Pero entre el switch y el actuador, ¿qué nodo debo añadir? Había pensado en function, pero como no domino mucho el código, no es sencillo.

Para mí, hay que decirle que:
msg.payload = msg.payload.channel_0
que 0 = Off y 1 = On
y que el dispositivo es el SID: …

¿Voy por mal camino o no?

Del interruptor al botón « Off » solo tienes que hacer una línea con tu ratón, todo el trabajo ya está hecho :smiley: Estás a solo 1 milímetro del resultado jaja :slight_smile:

Ya lo he intentado y no es posible con estas dos salidas. No tengo entrada en el inyector.

¡Ah, mi error! Sé que hay un nodo que hace lo mismo que el inject pero con una entrada

Hay un interruptor o un botón en el panel de control, pero no logro configurarlos.

Para mí el switch no sirve de nada, solo hay que formatear el payload si es necesario para tu actuador.

¿Formatear el payload? Perdona, pero no te sigo :sweat_smile:

Si msg.payload = 1 entonces msg.payload.channel0 = on

Lo que recibe tu actuador es el payload (que debe estar en el formato correcto)

Esta transformación puedes hacerla con un bloque de función

if (msg.payload === 0) {
msg.payload.channel0 = off
} else {
....

¿Algo así?

if (msg.payload === 0) {
var cmd = {
« sid » : « XXXXXXXXXXX »
}
msg.payload.channel0 = off
}
else { (msg.payload === 1)
msg.payload.channel0 = on
}
return msg;

Sinon @jerome @VonOx, la fonction « Change » es quizás más adecuada si no te sientes cómodo con el código :slight_smile: The Core Nodes : Node-RED

En tu caso, puedes colocarte después de tu switch, y hacer un « set » donde estableces la propiedad correcta, no sé si es claro para ti @jerome …