Si alguna vez quieres hacerlo más simple y permitir que otras personas utilicen esta integración, podrías escribir un pequeño plugin Matterbridge (con la ayuda de la IA, relativamente fácil), así este dispositivo se convertiría en Matter y, por lo tanto, compatible con Gladys (¡pero no solo con Gladys!)
El plugin es solo un simple archivo JS donde mapeas tus comandos LED Magic Home a un SDK Matter, y luego solo necesitas alojar el plugin en un repositorio Git para luego instalarlo en Matterbridge.
Te confieso que había explorado esa posibilidad. Pero me encontré con varios problemas para activar IPv6 en mi red. Y también tengo servicios profesionales funcionando en mi casa, así que tengo un poco de miedo de liarlo todo.
Pero podría ser interesante explorarlo porque, de todos modos, aunque lo que he hecho funciona, está lejos de ser perfecto. Hay retraso, y si queremos empezar a cambiar los colores de varias cosas a la vez, eso plantea un problema.
En sí, si solo ejecutas Matterbridge en la misma máquina que Gladys, ni siquiera pasará por tu red, por lo que puedes « ignorar » la advertencia que dice que necesitas una interfaz ipv6. En mi opinión, funcionará de todos modos (no estoy seguro al 100%, pero por experiencia, funciona).
He creado un plugin Matterbridge personalizado para mis tiras LED Magic Home (5 controladores RGBWW expuestos en extendedColorLight). El encendido/apagado y el brillo funcionan perfectamente, pero los colores nunca se aplican.
Error en los registros de Gladys
ValidationDatatypeMismatchError/128: Se esperaba un número, se obtuvo un objeto.
at TlvNumberSchema.validate (/src/server/services/matter/node_modules/@matter/types/src/tlv/TlvNumber.ts:110:19)
at ObjectSchema.validate (…)
at Object.ClusterClient.commands. [as moveToHueAndSaturation]
at MatterHandler.setValue (/src/server/services/matter/lib/matter.setValue.js:160:24)
Causa identificada en matter.setValue.js línea ~160
await colorControl.moveToHueAndSaturation({
hue: matterHue,
saturation: matterSaturation,
transitionTime: null, // ← debería ser 0
optionsMask: { executeIfOff: true }, // ← objeto en lugar de un número (bitmap)
optionsOverride: {}, // ← objeto en lugar de 0
});
El optionsMask se pasa como objeto JS, pero ColorControl.moveToHueAndSaturation de la lib @matter/main espera un número (bitmap). El mismo patrón funciona para LevelControl.moveToLevel porque este cluster acepta objetos, pero
ColorControl los rechaza.
Solución propuesta
await colorControl.moveToHueAndSaturation({
hue: matterHue,
saturation: matterSaturation,
transitionTime: 0,
optionsMask: 1,
optionsOverride: 0,
});
Entorno
- Gladys v4 (imagen gladysassistant/gladys:v4)
- Matterbridge 3.6.1 (luligu/matterbridge:latest)
- Plugin personalizado matterbridge-magic-home con tipo de dispositivo extendedColorLight
- NAS Synology DS1520+, Docker, --network=host