[V4] Integración enocean

Hola Pierre-Gilles,

Llevo un tiempo bastante ausente de Gladys, pero me gustaría retomar el trabajo de integración del protocolo enocean en Gladys 4.

Sin embargo, el módulo enocean-js no me convence del todo, el tipo que lo desarrolla hace un trabajo increíble, pero está solo, no hay documentación y me cuesta mucho…

Como en el trabajo hago bastante Python, estoy mirando hacia ese lado y encuentro cosas que me gustaría experimentar.
Pero, en ese caso, sería más bien en modo módulo externo basado en intercambio MQTT.

¿Cuál sería el mejor enfoque desde Gladys? ¿Desarrollar una integración de Gladys encargada de la comunicación a través de MQTT con Python/Enocean o hay una interfaz estándar para eso?

Reconozco que no me he puesto mucho con la V4 hasta ahora, pero es hora de empezar :smiley:

¡Hasta luego!

¡Hola @Jean-Philippe!

He hecho público tu mensaje para que sea visible para todos :slight_smile:

Entonces tres opciones:

  1. En sí, podrías llamar perfectamente código Python desde Gladys y mantener esta integración en Gladys. Después, a ver, si es realmente un programa Python que funciona permanentemente, no es ideal.

  2. Puedes inspirarte en lo que se ha hecho en el módulo zigbee2mqtt, que es un servicio cuyo trabajo se realiza mediante un contenedor Docker que habla en MQTT con Gladys. Por lo tanto, sería necesario desarrollar el servicio externo, crear una interfaz de usuario en Gladys para poder controlar todo, y desarrollar una API MQTT entre los dos para que se comuniquen. Después, en el módulo zigbee2mqtt, se hizo así porque zigbee2mqtt es un proyecto externo que no controlamos y que ha hecho un trabajo formidable de convertir los mensajes zigbee de muchas integraciones en MQTT.

  3. Más profundo, explorar el código de encoean-js y hacer una integración nativa en Gladys.. :slight_smile: Fui a ver el repositorio de oncean-js, esperaba un proyecto abandonado y francamente parece sólido y bien diseñado. La v4 no es la v3, el objetivo de la v4 es diseñar un software para el público en general que sea fácil de usar y que funcione « out of the box ». Una integración nativa cuando es posible, cambia todo.

Puedes inspirarte en otros proyectos que utilizan enocean-js como node-red-contrib-enocean, el código es legible y creo que podríamos transponer eso en Gladys bastante fácilmente :slight_smile:

Bueno, finalmente he comenzado a desarrollar una integración Enocean.
Después de unas horas dándome dolor de cabeza para entender cómo funciona la V4, obtengo un servicio que se inicia y se conecta a mi dongle USB :cowboy_hat_face:

Voy a intentar integrar el módulo enocean-js directamente en gladys, lo cual no sé es la capacidad de soportar toda la variedad de equipos existentes… así que primero voy a ver para soportar los sensores simples (tipo temperatura, movimiento, etc.) y luego iremos poco a poco.

Lo que puedo hacer es subir mi rama a git y tal vez podrías decirme si es « Gladys compliant » lo que he comenzado. Me basé en la integración Z-wave.

Una pregunta sobre la gestión de dispositivos y sus características.

Al mirar las integraciones de Xiaomi y Zwave, en realidad tengo la impresión de que cuando se recibe un valor de un sensor, se envía un mensaje a Gladys con el tipo EVENTS.DEVICE.NEW_STATE reconstruyendo sistemáticamente el objeto dispositivo.

Creía que primero debía registrar los dispositivos conocidos / emparejados / registrados / escaneados antes de poder enviar / recibir datos.

Estoy un poco perdido aquí sobre el algoritmo a escribir.

¡Hola @Jean-Philippe! ¡Genial por este módulo EnOcean :slight_smile:

No, solo debes emitir un evento con el external_id del dispositivo (el identificador único del lado de EnOcean) y el nuevo estado.

Ejemplo en el caso del servicio Xiaomi:

Sí, es lo que hay que hacer, inspírate en el servicio Z-Wave, por ejemplo. Hay 2 pestañas: 1 pestaña para los dispositivos que ya están conectados a Gladys, y una pestaña para conectar nuevos dispositivos Z-Wave a Gladys.

Si hay algo más que no entiendas, no dudes en preguntar :slight_smile:

gracias, me defiendo cada vez mejor a medida que avanzo.
Mi repositorio si quieres echarle un vistazo y decirme si he tomado la dirección correcta:

https://github.com/Jean-PhilippeD/Gladys/tree/enocean

Si miro el ejemplo de Xiaomi.

Es la función addDevice.js la que se encarga de emitir un evento con el nuevo dispositivo en el payload. Pero no entiendo cómo Gladys registra este dispositivo en la base de datos… No veo la llamada a gladys.device.create()

Solo el front parece escuchar el evento XIAOMI.NEW_DEVICE y, si he entendido bien, solo para recargar la lista de dispositivos.

Aún me escapan algunas cosas :smiley:

Por el momento, en lo que he escrito, yo mismo llamo a gladys.device.create(), no paso por un evento.

Acepto un poco de luz aquí :stuck_out_tongue:

Edición: ¡Vale, acabo de ver action.js en Xiaomi! ¡Lo entiendo mejor! ¡Me inspiraré en eso!

En realidad, en Gladys v4, nunca es el backend el que crea los dispositivos: es demasiado oscuro y en caso de error no hay ningún retorno.

En Gladys v4, es la interfaz de usuario la que está en el centro del producto. ¡Es el front el que llama a la ruta de creación de dispositivos!

Para el servicio EnOcean, inspírate mejor en el servicio Z-Wave, que es más cercano.

Hola Pierre-Gilles,

Por fin estoy retomando el servicio en Gladys… esta vez va a funcionar :smiley:
Actualmente, estoy haciendo desarrollo en el trabajo, por lo que por la noche me cuesta volver a desarrollar… salvo que la V3 está al límite… Tengo muchos dispositivos enocean que no uso, y eso me pone de mal humor…

Incluso estuve a punto de probar Jeedom… en serio…

Así que me armé de valor y acabo de meterme de nuevo en el ajo!

He retomado el desarrollo de la integración enocean, y empieza a parecerse a algo, me siento más cómodo con la estructura del código.

He logrado añadir dispositivos y verlos correctamente en el tablero de control.

Me queda por:

  • gestionar más perfiles de equipo.
  • gestionar los mensajes cuando un equipo envía algo
  • enviar un mensaje a un equipo
  • escribir las pruebas

Tengo buenas esperanzas de tener algo funcional rápidamente!
Y después no tengo más integraciones que hacer sobre lo que hice en V3 que uso a diario :wink: (imprescindible para migrar y apagar la V3 en casa)

Ahí tienes un poco de noticias, espero que no me vuelva a caer en un agujero negro después de este correo :smiley:

Hola Jean-Philippe :slight_smile:

¡Yeees! :slight_smile:

Mantenos al tanto aquí, y no dudes en preguntar si tienes alguna duda.

¡Hola!

Algunas novedades.

He avanzado mucho, puedo recuperar los valores de varios tipos de equipos.
Actualmente estoy trabajando en los equipos que pueden recibir órdenes.

También me quedan los tests por escribir.

Me dirijo a los poseedores de dispositivos enocean, ¿podrían indicarme los equipos y los perfiles EEP que tienen en casa?
Porque la dificultad va a ser poder soportar la mayor cantidad de equipos posible.
Para información, me apoyo en el módulo enocean-js del cual se pueden ver los perfiles que son soportados aquí:
https://enocean-js.github.io/enocean-js

Si alguien quiere probar, aquí hay una primera versión en mi rama.

Funcionan por el momento:

  • Sensor de temperatura (a5-02-05)
  • Sensor de movimiento (a5-07-01)
  • Sensor de apertura de puerta/ventana (d5-00-01)
  • Interruptor basculante (f6-02-01)
  • Interruptor de pared (d2-01-0f)

hola, llevo tiempo siguiendo tu proyecto, creo que sí, los interruptores son importantes, también los micro módulos tipo nodon para iluminación y persianas, lo más importante. Personalmente, yo uso material eltako que es un enocean bastante completo. Por cierto, probaré tu programa cuando entienda cómo instalarlo jajaja

Hola,

Actualmente tengo un problema para hacer funcionar los interruptores de pared (d2-01). De hecho, logro controlar uno, pero si tengo varios, todos están emparejados juntos, por lo que no es práctico.
No he podido avanzar más por el momento.

Hola, algunas noticias… definitivamente es complicado encontrar tiempo :frowning:

Estos días me he motivado y he logrado hacer funcionar correctamente mis interruptores con un perfil D2-01-00.

No tengo un módulo para las persianas @eric2-6, si puedes darme un enlace a lo que tienes para que vea cómo integrarlas.

Por lo tanto, he empezado a mirar para escribir las pruebas, pero tengo problemas @pierre-gilles
No he instalado la librería zwave, y eslint me está dando errores en la importación en la integración z-wave:

gladys-server@ pretest /home/jp/Gladys4/Gladys/server
> npm run eslint


> gladys-server@ eslint /home/jp/Gladys4/Gladys/server
> eslint .


/home/jp/Gladys4/Gladys/server/services/zwave/index.js
  7:25  error  Unable to resolve path to module 'openzwave-shared'  import/no-unresolved

Entonces, para evitarlo, he eliminado el pretest de los scripts npm. (bueno, he querido instalarlo, pero también hay que instalar el binario y me he encontrado con errores en el make… así que he optado por lo más simple)

Pero después, me encuentro con este error:

> gladys-server@ test /home/jp/Gladys4/Gladys/server
> cross-env NODE_ENV=test ./node_modules/mocha/bin/mocha --recursive ./test/bootstrap.test.js "./test/**/*.test.js" --exit

/home/jp/Gladys4/Gladys/server/services/mqtt/node_modules/mqtt/mqtt.js:1
(function (exports, require, module, __filename, __dirname) { #!/usr/bin/env node
                                                              ^

SyntaxError: Invalid or unexpected token
    at new Script (vm.js:100:7)

@Jean-Philippe ¿has logrado resolver tu problema?

¿Qué versión de Node.js estás usando? (node -v), deberías estar en Node >= 14.

Sí, lo he resuelto, tuve que tomarme un tiempo y profundizar por enésima vez para entender el funcionamiento, el problema es que el tipo que mantiene la lib no responde desde hace 6 o 7 meses :frowning:
La idea es que lo voy a ejecutar en mi casa un tiempo antes de enviar una PR, no sé cómo compartir mi código si otros quieren probarlo, vi un post donde se puede hacer imágenes por integración..

Del lado de node, estoy en v14.12.0

Ah :sweat_smile: ¿Y no hay algo más reciente en cuanto a libs? No es muy bueno para el futuro de la integración si la dependencia ya no se mantiene ^^

No he encontrado nada mejor, al menos en JS, he visto una librería de Python pero apenas más mantenida :confused: