Ajouter le bluetooth à Gladys 4

Gna gna gna :stuck_out_tongue:

Si on part la dessus (noble), comment je peux aider ?

J’ai vu que ton code (déjà bien conséquent) supporte déjà les nut mais rien sur des capteurs de température xiaomi par exemple.

Faut il créer un nouveau fichier dédié à cet équipement ou la communication se fait avec la fonction générique ?

Salut, je voyais :

  • 1 service Bluetooth générique qui connait les standards, et surtout implémente le cœur
  • 1 servicr par “marque” se basant sur le service Bluetooth, et contenant ses propres caractéristiques : nut, awox… xiaomi…

Aujourd’hui si mon code supporte encore les nut, c’est une erreur de ma part. Je pensais avoir supprimé toutes traces des “marques”.

En regardant les fichiers de la pull request sur GitHub j’ai cru lire nut quelque part. Mais c’était peut être pas le dernier commit.

Je pense que c’est la meilleure idée de partir sur un service générique, avec ensuite un fichier par marque.

Ça permettra surtout de supporter plus rapidement quelques modèles dans Gladys et d’améliorer le support au fil des mises à jour.

As-tu une todo list ou quelque chose dans le genre pour lister les points à résoudre avant une PR ?
ça me permettrait de t’aider sur un point en particulier sans se marcher dessus !

Je pense que ça va être difficile de travailler en parallèle, mais j’ai tout de même une todo liste Bluetooth · GitHub

J’ai pas mal avancé, je suis en train de valider les fonctions de base, puis je compte avancer sur les fonctions avancées.

Je pense pouvoir être prêt pour le retour de Pierre-Gilles, même si j’aimerai fournir une image de test stable à la communauté avant.

2 « J'aime »

En y repensant, il faudrait pouvoir contrôler le temps entre deux requêtes sur un capteur.

C’est plus une réflexion globale à Gladys. Pour certains capteurs ça fait sens de récolter les valeurs toutes les 1 minutes (capteur d’ouverture de porte par exemple ?) mais un capteur de température à pas besoin d’être contacté aussi souvent.

@pierre-gilles tu nous donnes ton avis (à ton retour de congés evidemment)?

Je suis d’accord avec toi, c’est une information à paramétrer au niveau du device, mais défaut j’ai mis la valeur max définie pour le moment.
Cette valeur sera éditable via un composant graphique commun. La modification a déjà été faite sur la PR Tasmota HTTP qui est en attente de testeurs… Ne voulant pas risquer les conflits, je considère que ce formulaire ne fait pas parti de ce service.

C’est tout à fait ça, il faut que ça soit fait au niveau global. Tant mieux si c’est déjà fait, je le testerais avec le module Bluetooth des que possible (pour le moment je n’ai que ca).

Le must serait même de pouvoir faire quelque chose comme :

  • la journée je récupère les valeurs toutes les 15 minutes
  • la nuit ce sera toutes les 30 minutes

Les capteurs fonctionnant sur pile généralement, il faut économiser le plus possible l’énergie et ne pas requeter pour rien.

@pierre-gilles je relance un sujet, qui devient d’actualité pour le service Bluetooth : s’abonner à un événement côté serveur afin de détecter la création d’un nouveau device via l’API classique.

Le but est de pouvoir s’inscrire aux messages “notify” émis par le périphérique Bluetooth dès sa création. Cela permet de ne pas faire de poll sur ce device, mais laisser le device envoyer les données.

Mais pour cela, je dois :

  • soit créer un nouvel endpoint dans le service Bluetooth pour gérer la création du device (mais je n’aime pas cette option),
  • soit être averti de la création d’un nouveau périphérique

Dans ce cas, j’ai besoin de connaître cette information uniquement pour les devices Bluetooth, mais à terme (connecteur GoogleHome) on pourrait avoir besoin d’être informé de la création de n’importe quel device.

Salut @AlexTrovato

Ce que tu veux faire ressemble au principe du broker MQTT ou j’ai pas bien compris ?

Salut @Reno,
qu’entends tu par le principe du broker MQTT ?

En rapport à mon dernier message, je veux surtout que le core Gladys envoie un event une fois que la création d’un device est en succes pour que les services puisse le recevoir et faire un traitement si besoin. Dans le cas du Bluetooth, ce serait souscrire aux notifications du périphérique.

Bonsoir tout le monde,
une première version testable du service Bluetooth est disponible : v4.0.0-bluetooth.1.

Seul le service Bluetooth « pur » est disponible, les fonctionnalités génériques définies par les spécifications reconnues sont :

  • le niveau de batterie
  • le capteur de température (sous ses 3 formes selon la spec GATT)

Ici les spécifications Bluetooth GATT, n’hésitez à mes signaler une fonctionnalité comptatible avec Gladys, je tenterai de l’ajouter.

En théorie, Gladys devrait s’abonner aux appareils permettant les notifications, mais pour les moment uniquement au démarrage de Gladys.
Cela permet de recevoir les données envoyées directement par le périphérique, plutôt que de boucler pour demander les données au périphérique.

Je n’ai pas réussi à faire fonctionner le service sous Windows, même via Docker, mais Gladys démarre quand même.

Je continue à travailler si l’ouverture du service à d’autres services spécifiques (dont AwoX et les migrations de modules connus dans la v3).

Pour rappel, les images de test sont disponible ici :

Merci, j’attends vos retours avec impatience.

4 « J'aime »

Salut, j’ai voulu l’essayer mais impossible d’y accéder via le navigateur.

De base sur le raspberry j’ai gladys sur le port 80, gladys zigbee2mqtt sur le port 81 et don je voulais faire suivre le mouvement, donc sur le port 82, résultat le navigateur n’y accède pas.

j’utilise cette insertion sur docker :

docker run -d \
--restart=always \
--privileged \
--network=gladys-net \
--name gladys-BT \
-p 82:82 \
-e NODE_ENV=production \
-e SERVER_PORT=82 \
-e TZ=Europe/Paris \
-e SQLITE_FILE_PATH=/var/lib/gladysassistant/gladys-production-bt.db \
-v /var/run/docker.sock:/var/run/docker.sock \
-v ${PWD}/gladysassistant:/var/lib/gladysassistant \
-v /dev:/dev \
atrovato/gladys

Pourtant je pense avoir bon non ?

Salut,
je pense que tu dois ajouter le tag sur l’image (sur cette version, je n’ai pas réussi à générer le manifest).

Une autre version avec quelques changement UI est en cours de génération.

Je te conseille donc de remplace atrovato/gladys par atrovato/gladys:v4.0.0-bluetooth.1-arm.

1 « J'aime »

@AlexTrovato , merci, je m’en rappelerais d’ajouter le tag maintenant.

J’accède bien a gladys cependant j’ai un message d’erreur dans la config du bluetooth :
Le module Bluetooth n’est pas disponible, merci de vérifier qu’il est bien activé.

Pourtant en ligne de commande le bluetooth fonctionne bien.

Bizarre…
Je sais que pour noble (node-ble) il faut autoriser node a acceder au bluetooth, mais avec docker, je ne sais pas comment l’appliquer. Je ne suis pas sûr que ce soit nécessaire pour Docker.

Tu as peut-être des infos dans les logs ?

Oup’s oublié désolé
pi@gladys:~ $ docker logs gladys-BT

> gladys-server@ start:prod /src/server
> cross-env NODE_ENV=production node index.js

Initialising OpenZWave 1.6.1051 binary addon for Node.JS.
    OpenZWave Security API is ENABLED
    ZWave device db    : /usr/local/etc/openzwave
    User settings path : /src/server/services/zwave/node_modules/openzwave-shared/build/Release/../../
    Option Overrides : --Logging false --ConsoleOutput false --SaveConfiguration true
2020-10-03T21:16:02+0200 <info> index.js:19 (Object.start) Starting telegram service
2020-10-03T21:16:02+0200 <info> index.js:13 (Object.start) Starting usb service
2020-10-03T21:16:02+0200 <info> index.js:16 (Object.start) Starting zwave service
2020-10-03T21:16:02+0200 <info> index.js:15 (Object.start) Starting Bluetooth service
2020-10-03T21:16:03+0200 <info> index.js:20 (Object.start) Starting Open Weather service
2020-10-03T21:16:03+0200 <warn> service.start.js:18 (Service.start) Unable to start service bluetooth
2020-10-03T21:16:03+0200 <warn> service.start.js:19 (Service.start) Error: EAFNOSUPPORT, Address family not supported by protocol
at new Hci (/src/server/services/bluetooth/node_modules/@abandonware/noble/lib/hci-socket/hci.js:74:18)
at new NobleBindings (/src/server/services/bluetooth/node_modules/@abandonware/noble/lib/hci-socket/bindings.js:25:15)
at Object.<anonymous> (/src/server/services/bluetooth/node_modules/@abandonware/noble/lib/hci-socket/bindings.js:546:18)
at Module._compile (internal/modules/cjs/loader.js:1137:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1157:10)
at Module.load (internal/modules/cjs/loader.js:985:32)
at Function.Module._load (internal/modules/cjs/loader.js:878:14)
at Module.require (internal/modules/cjs/loader.js:1025:19)
at require (internal/modules/cjs/helpers.js:72:18)
at module.exports (/src/server/services/bluetooth/node_modules/@abandonware/noble/lib/resolve-bindings.js:13:12)
at Object.<anonymous> (/src/server/services/bluetooth/node_modules/@abandonware/noble/index.js:2:49)
at Module._compile (internal/modules/cjs/loader.js:1137:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1157:10)
at Module.load (internal/modules/cjs/loader.js:985:32)
at Function.Module._load (internal/modules/cjs/loader.js:878:14)
at Module.require (internal/modules/cjs/loader.js:1025:19)
at require (internal/modules/cjs/helpers.js:72:18)
at BluetoothManager.start (/src/server/services/bluetooth/lib/commands/bluetooth.start.js:16:20)
at Object.start (/src/server/services/bluetooth/index.js:16:22)
at Service.start (/src/server/lib/service/service.start.js:13:19)
at /src/server/lib/service/service.startAll.js:9:79
at Array.map (<anonymous>)
at Service.startAll (/src/server/lib/service/service.startAll.js:9:54)
at Object.start (/src/server/lib/index.js:104:23)
at async /src/server/index.js:18:3 {
  errno: 97,
  code: 'EAFNOSUPPORT',
  syscall: 'socket'
}
2020-10-03T21:16:03+0200 <info> service.start.js:16 (Service.start) Service telegram is not configured, so it was not started.
2020-10-03T21:16:03+0200 <info> service.start.js:16 (Service.start) Service zwave is not configured, so it was not started.
2020-10-03T21:16:03+0200 <info> service.start.js:16 (Service.start) Service openweather is not configured, so it was not started.
2020-10-03T21:16:03+0200 <info> service.start.js:16 (Service.start) Service mqtt is not configured, so it was not started.
2020-10-03T21:16:03+0200 <info> index.js:63 (Server.<anonymous>) Server listening on port 82
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! gladys-server@ start:prod: `cross-env NODE_ENV=production node index.js`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the gladys-server@ start:prod script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2020-10-03T19_33_41_998Z-debug.log

> gladys-server@ start:prod /src/server
> cross-env NODE_ENV=production node index.js

Initialising OpenZWave 1.6.1051 binary addon for Node.JS.
    OpenZWave Security API is ENABLED
    ZWave device db    : /usr/local/etc/openzwave
    User settings path : /src/server/services/zwave/node_modules/openzwave-shared/build/Release/../../
    Option Overrides : --Logging false --ConsoleOutput false --SaveConfiguration true
2020-10-03T21:35:36+0200 <info> index.js:16 (Object.start) Starting zwave service
2020-10-03T21:35:36+0200 <info> index.js:13 (Object.start) Starting usb service
2020-10-03T21:35:36+0200 <info> index.js:19 (Object.start) Starting telegram service
2020-10-03T21:35:36+0200 <info> index.js:15 (Object.start) Starting Bluetooth service
2020-10-03T21:35:37+0200 <info> index.js:20 (Object.start) Starting Open Weather service
2020-10-03T21:35:37+0200 <warn> service.start.js:18 (Service.start) Unable to start service bluetooth
2020-10-03T21:35:37+0200 <warn> service.start.js:19 (Service.start) Error: EAFNOSUPPORT, Address family not supported by protocol
at new Hci (/src/server/services/bluetooth/node_modules/@abandonware/noble/lib/hci-socket/hci.js:74:18)
at new NobleBindings (/src/server/services/bluetooth/node_modules/@abandonware/noble/lib/hci-socket/bindings.js:25:15)
at Object.<anonymous> (/src/server/services/bluetooth/node_modules/@abandonware/noble/lib/hci-socket/bindings.js:546:18)
at Module._compile (internal/modules/cjs/loader.js:1137:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1157:10)
at Module.load (internal/modules/cjs/loader.js:985:32)
at Function.Module._load (internal/modules/cjs/loader.js:878:14)
at Module.require (internal/modules/cjs/loader.js:1025:19)
at require (internal/modules/cjs/helpers.js:72:18)
at module.exports (/src/server/services/bluetooth/node_modules/@abandonware/noble/lib/resolve-bindings.js:13:12)
at Object.<anonymous> (/src/server/services/bluetooth/node_modules/@abandonware/noble/index.js:2:49)
at Module._compile (internal/modules/cjs/loader.js:1137:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1157:10)
at Module.load (internal/modules/cjs/loader.js:985:32)
at Function.Module._load (internal/modules/cjs/loader.js:878:14)
at Module.require (internal/modules/cjs/loader.js:1025:19)
at require (internal/modules/cjs/helpers.js:72:18)
at BluetoothManager.start (/src/server/services/bluetooth/lib/commands/bluetooth.start.js:16:20)
at Object.start (/src/server/services/bluetooth/index.js:16:22)
at Service.start (/src/server/lib/service/service.start.js:13:19)
at /src/server/lib/service/service.startAll.js:9:79
at Array.map (<anonymous>)
at Service.startAll (/src/server/lib/service/service.startAll.js:9:54)
at Object.start (/src/server/lib/index.js:104:23)
at async /src/server/index.js:18:3 {
  errno: 97,
  code: 'EAFNOSUPPORT',
  syscall: 'socket'
}
2020-10-03T21:35:37+0200 <info> service.start.js:16 (Service.start) Service zwave is not configured, so it was not started.
2020-10-03T21:35:37+0200 <info> service.start.js:16 (Service.start) Service telegram is not configured, so it was not started.
2020-10-03T21:35:37+0200 <info> service.start.js:16 (Service.start) Service openweather is not configured, so it was not started.
2020-10-03T21:35:37+0200 <info> service.start.js:16 (Service.start) Service mqtt is not configured, so it was not started.
2020-10-03T21:35:37+0200 <info> index.js:63 (Server.<anonymous>) Server listening on port 82
pi@gladys:~ $

Tu n’es pas sur Windows ?

non sur raspberry pi 3b+