Données brutes BLEA

Bonjour,
Je viens d’installer le plugin BLEA pour récupérer des informations d’une balance connectée Omron.
La connexion se passe correctement, et apparaît en équipement inconnu, mais il n’y a pas de commande créé pour récupérer les données brutes.
Comment récupérer les données brutes???

Merci.

Olivier.

Il faut créer le.JSON correspondant.
Après, je n’arrive pas à décrypter les données brutes.

Bonjour

Les données bruts se récupère avec la log en mode début.
Ensuite il faut voir comment sont construit les autres fichiers de configuration, comme l’indique @swr.

A une époque, il suffisait de donner à l’équipe Jeedom les données bruts pour qu’ils créent les fichiers de configuration.

Bonjour
J’ai la même problématique pour un régulateur d’éolienne win-power. Comment au moins afficher les donnée brut (à défaut de les décodé…) avant on pouvait, je ne retrouve plus l’option, pourtant en choisissant inconnu il parle bien de donné brut dans la description.

Bonjour.

Il faut mettre en mode debug il me semble.

Bonjour,

Comme le plugin blea est devenu un indispensable pour mon utilisation.

Je déterre ce sujet d’ajout de périphérique inconnu dans BLEA.

Quelqu’un aurait il réussi à inclure un périphérique inconnu et créer le fichier de configuration ?

J’essaye d’avancer quand même.
La procédure que j’utilise :
Utiliser un téléphone Android en mode développeur
puis dans « Settings » / « Developer » Options activer « Enable Bluetooth HCI snoop log »
les données brutes sont sauvegardée ici /sdcard/btsnoop_hci.log

utiliser Wireshark et charger le fichier
il est possible de filter avec
bluetooth.addr==F0:XX:DD:XX:C4:XX à modifier avec l’adresse de votre Beacon

Maintenant je bloque

1 « J'aime »

Bonjour,

Je cherche aussi à envoyer des données brutes vers un periph bluetooth qui n’est pas encore supporté.
Il s’agit des strip led Govee.
Par contre j’ai trouvé un github ou un user a dejà fait le reverse engineering pour connaitres quel trames envoyer : https://github.com/BeauJBurroughs/Govee-H6127-Reverse-Engineering

Maintenant j’aimerais savoir comment faire pour créer les commandes afin d’envoyer ces trames.

Bonjour,

Si le reverse engineering a déjà été fait ou qu’il existe une doc sur le fonctionnement de l’équipement ce sera plus simple sinon cela demande pas mal de temps pour le faire. Pour le reverse, il y a la solution donnée par @SWR en capturant le traffic et en l’analysant. On peut aussi décompiler l’apk de l’application s’il y en a une afin d’y trouver des infos par exemple.

Pour l’intégration dans le plugin Blea, il faut regarder ce qui existe déjà pour d’autres équipements dans le plugin Blea et adapter pour l’équipement concerné. Voici déjà quelques infos mais ce n’est pas exhaustif. N’hésitez pas à compléter ou corriger si je me trompe. Il y a des adaptations à faire en fonction de chaque équipement.

Si on prend par exemple la Miscale2.

Dans le répertoire /plugins/blea/core/config/devices/miscale2/ se trouvent :

  • le fichier miscale2.json qui se divise en 3 parties:
  1. la configuration spécifique pour l’équipement :
    "miscale2": {
        "name": "MiScale 2",
        "groupe" : "Santé",
		"configuration" : {
			"specificmodal" : 1,
			"specificclass" : 1,
			"xiaomi" : 1,
			"name" : "miscale2",
			"battery_type": "4x1.5V AA"
		},

dans lequel on retrouve les paramètres suivants :

ainsi que les spécificités concernant le widget, un eventuel modal et une eventuelle class dédiée…

  1. les commandes à créer :
        "commands": [
			{
                "name": "Dernier Poids",
                "type": "info",
                "subtype": "numeric",
                "display": {
                    "generic_type": "GENERIC"
                },
				"unite": "kg",
                "isVisible": 1,
                "logicalId": "poids",
                "isHistorized": 0,
                "template": {
                    "mobile": "line",
					"dashboard" : "line"
				}
			},
.
.
.
            ],
  1. La référence à l’image, d’eventuelles remarques, le type, la batterie …
		"compatibility": [
            {
                "manufacturer": "Xiaomi",
                "name": "MiScale V2",
				"doc": "",
				"type": "Scale",
				"battery_type": "4x1.5V AA",
				"ref" : "",
				"comlink": "",
				"remark": "Gestion de profils complète",
				"inclusion" : "Mode inclusion",
				"imglink": "miscale"
            }
        ]
  • le/les fichier(s) miscale2.jpg correspondant à l’image que l’on souhaite afficher dans la page de configuration de l’équipement.

  • La Miscale2 ayant une classe spécifique (qui n’est pas obligatoire) pour la gestion des profils utilisateurs, le fichier se trouve dans /plugins/blea/core/config/devices/miscale2/miscale2.class.php. S’il y avait un Widget specifique pour ce device, il faudrait ajouter la fonction convertHtml() dans ce fichier et mettre le fichier html correspondant dans /plugins/blea/core/template/dashboard/ et/ou /plugins/blea/core/template/mobile/.

Dans le répertoire /plugins/blea/resources/blead/devices/ se trouve :

  • le fichier miscale2.py. C’est dans ce fichier python que l’on va pouvoir définir les actions à réaliser.

La fonction isValid() va par exemple permettre d’identifier une équipement par son nom (s’il l’annonce) ou par le début de son adresse MAC.

La fonction parse() est apellée lorsque le plugin recoit des trames qui sont « advertisées » par l’équipement. Dans cette fonction, on va par exemple lire ces informations reçues en hexa et les convertir pour les rendre lisible dans une commande « Info ».

La fonction read() est apellée lorsque le plugin fait une « Refresh forcé » par exemple pour aller lire une information sur l’équipement. Dans cette fonction, on va par exemple lire les informations en hexa et les convertir pour les rendre lisible dans une commande « Info ».

La fonction action() est appelée lorsque l’on utlise une commande « Action » de l’équipement. Dans cette fonction, on va par exemple prendre les informations lisibles d’une commande « Action » pour les convertir en hexa et les envoyer à l’équipement.

La fonction handlenotification() pour gérer les notifications recues de la part de l’équipement si ce dernier le supporte et que l’on peut les activer.

Tout cela est bien sur à adapter pour chaque type d’équipement.

Bon courage à ceux qui se lanceront :wink:

3 « J'aime »

Merci bcp pour ce pied à l’étrier, ça va surement nous donner le point de départ sur nos investigations.
J’ai dupliqué grace à JeeXplorer, les fichiers que tu as mentionné (à partir du device dreamscreen, car c’est une lumière que je veux piloter, donc la base me parait plus facilement adaptable)
J’ai donc dupliqué et renommé le dossier plugins/blea/core/config/devices/dreamscreen et adapté la config dans dans le .json
et renommé et modifié le fichier .py dans plugins/blea/resources/blead/devices

Je sauvegarde tout et relance le démon.
Mais lorsque je vais sur Lancer scan, et dans la liste pour sélectionner l’equipement je ne trouve pas mon nouveau nom de device. Est-ce que cette liste est gérée autre part ?

Ok My bad j’avais omis un emplacement du nouvea nom c’est le tout premier tag qui est dans le fichier .json :
« Dreamscreen »: {
« name »: « Dreamscreen »,
« groupe » : « Lumières »,
« configuration » : {
« cancontrol » : 1,
« name »: « dreamscreen »

1 « J'aime »

Je suis aussi en train de batailler avec le plugin blea pour intégrer 2 nouveaux équipements au plugin, une sonde température / humidité extérieure Beewi BBW200, un interrupteur schneider wiser pour volets roulants.
Je suis preneur de conseils / astuces d’autres personnes qui ont modifié ce plugin pour des nouveaux équipements car il ne semble pas y avoir de doc pour expliquer cette intégration, du coup j’ai analysé les sources.

Le décodage des trames est le plus compliqué, j’utilise 3 méthodes dans mon cas :

  • L’application mobile nRF connect sur android qui permet de lire les registres gatt, leur nom et config ainsi que d’écrire dedans, les notifications sont gérées et le tout peut être enregistré en log texte.
  • Un code pyhton isolé de jeedom (sur un raspberry) pour mes tests en utilisant la librairie bluetool qui est la base du plugin, ça me permet facilement de tester des combinaisons de lecture / écriture.
  • Sur android il est possible d’activer le debug bluetooth et logger toutes les trames envoyées, j’ouvre le fichier généré dans Wireshark (lecture de trame réseau diverses). Ça me permet de lancer l’application original du capteur et d’effectuer des opérations sur le capteur en interceptant les trames émises pour analyse.
  • J’ai essayé decompiler les applications originales mais pas réussi à trouver le code intéressant pour l’instant.

Sur ma sonde j’ai trouvé le registre qui contenait les 3 infos : température, humidité, batterie. Je n’ai pas été plus loin pour l’instant et j’ai des bugs de connexions souvent de ce genre :

2020-12-11 19:25:54.440][DEBUG] : http://127.0.0.1:80 "POST /plugins/blea/core/php/jeeBlea.php?apikey=ahRyGxiye353E3hq7BnhY7WGCfJLF4es HTTP/1.1" 200 0
[2020-12-11 19:25:59.185][DEBUG] : CONNECTOR------Failed to connect to peripheral 20:91:48:48:E7:25, addr type: public attempt 1
[2020-12-11 19:26:05.215][DEBUG] : CONNECTOR------Failed to connect to peripheral 20:91:48:48:E7:25, addr type: public attempt 2
[2020-12-11 19:26:11.249][DEBUG] : CONNECTOR------Failed to connect to peripheral 20:91:48:48:E7:25, addr type: public attempt 3
[2020-12-11 19:26:11.250][DEBUG] : CONNECTOR------Issue connecting to : 20:91:48:48:E7:25 with bluetooth 0 the device is busy or too far
[2020-12-11 19:26:11.254][DEBUG] : CONNECTOR------Connecting : 20:91:48:48:E7:25 with bluetooth 0
[2020-12-11 19:26:16.279][DEBUG] : CONNECTOR------Failed to connect to peripheral 20:91:48:48:E7:25, addr type: public attempt 1
[2020-12-11 19:26:21.920][DEBUG] : CONNECTOR------Failed to connect to peripheral 20:91:48:48:E7:25, addr type: public attempt 2
[2020-12-11 19:26:27.951][DEBUG] : CONNECTOR------Failed to connect to peripheral 20:91:48:48:E7:25, addr type: public attempt 3
[2020-12-11 19:26:27.952][DEBUG] : CONNECTOR------Issue connecting to : 20:91:48:48:E7:25 with bluetooth 0 the device is busy or too far
[2020-12-11 19:26:31.059][DEBUG] : No name in data but i know it is : beewibbw200

Sur l’interrupteur j’ai exploré un peu plus les registres et j’arrive à piloter l’interrupteur et voir son état, il faut que je le code dans le plugin.

Pour les problèmes de connexion, tu n’aurais pas un autre équipement qui serait resté connecté sur ton équipement ? Notament les outils que tu utilises pour décoder les trames.

Oui j’ai laissé la sonde seule, j’ai tout déconnecté à part jeedom, au début tout ce passe bien connexion, lecture des données puis déconnexion.

Line 462: [2020-12-14 17:10:07.137][DEBUG] : BBW200--read() Creating a new connection for 20:91:48:48:E7:25
Line 474: [2020-12-14 17:10:28.052][DEBUG] : BBW200--readDataFromConnection(2) read connection
Line 477: [2020-12-14 17:10:28.199][DEBUG] : BBW200-- data =00d4000235070000061c
Line 478: [2020-12-14 17:10:28.199][DEBUG] : BBW200--readDataFromConnection() result ={'moisture': 53, 'temperature': 21.2, 'battery': 28, 'present': 1}
Line 479: [2020-12-14 17:10:28.200][DEBUG] : BBW200--read() close connection

Mais au bout d’un certain temps (plusieurs heures mais les logs sont trop courte pour avoir le détail), la connexion galère avec plusieurs tentatives, j’ai l’impression que la connexion se ferme mal.

En fait je n’arrive pas à savoir quand on doit déconnecter la connexion, ma sonde ne dispose pas de notification donc est-ce que je dois déconnecter à chaque fois ou laisser connecté ? J’ai vu que le code blea possède une liste toujours connecté.
Actuellement j’ai mis un refresh forcé à 15m pour lancer le rafraichissement des valeurs.

Pour l’interrupteur que je suis en train d’intégrer je me pose aussi la question de quand il faut déconnecter, celui-ci possède des notifications pendant 2 minutes, suis-je forcer de garder la connexion pour les notifications ?

Je galère toujours sur cette histoire de connexion bluetooth pour l’interrupteur, j’ai du mal à savoir s’il faut forcer à garder la connexion.
Sur la sonde j’ai trouvé les données en trame advertisé donc j’ai laissé la connexion uniquement pour le refresh, le problème se pose moins du coup.

Sur l’interrupteur voici mes logs lorsque j’envoie une commande, je reçois la commande, j’active les notifications puis j’écris la commande sur le handle associé. A chaque fois je me prend une erreur « concurrent poll() invocation » qui déconnecte l’interrupteur, si pas de chance il n’a pas encore écrit la commande et rien ne se passe, si de la chance il écrit la commande et déconnecte donc le volet s’ouvre bien.
J’ai ajouté une tentative de 3 sur la fonction conn.writeCharacteristic( ce qui produit les tentatives de reconnexion du log, mais j’ai l’impression que le thread principal recommence à recevoir en parallèle les trames ce qui gène la reconnexion.

Suite à cette déconnexion sauvage les notifications ne fonctionnent pas toujours

[2021-01-20 23:17:57.091][DEBUG] : Message read from socket: b'{"apikey":"ahRyGxiye353E3hq7BnhY7WGCfJLF4es","cmd":"action","device":{"id":"D0:CF:5E:0D:A7:D1"},"command":{"name":"wisershutter","action":"up","device":{"id":"D0:CF:5E:0D:A7:D1","delay":0,"needsrefresh":"0","name":"wisershutter"}}}'
[2021-01-20 23:17:57.101][DEBUG] : Client disconnected from [192.168.1.42:56498]
[2021-01-20 23:17:57.319][DEBUG] : SOCKET-READ------Message received in socket JEEDOM_SOCKET_MESSAGE
[2021-01-20 23:17:57.323][DEBUG] : SOCKET-READ------Received command from jeedom : action
[2021-01-20 23:17:57.325][DEBUG] : SOCKET-READ------Attempt an action on a device
[2021-01-20 23:17:57.332][DEBUG] : BeeWiSmartLite------manuf:  name:wisershutter data:
[2021-01-20 23:17:57.334][DEBUG] : SOCKET-READ------Action Thread Launched
[2021-01-20 23:17:57.342][DEBUG] : WiserShutter--isValid()=true : name=wisershutter manuf= data= mac=
[2021-01-20 23:17:57.346][DEBUG] : WiserShutter--action(): {'apikey': 'ahRyGxiye353E3hq7BnhY7WGCfJLF4es', 'cmd': 'action', 'device': {'id': 'D0:CF:5E:0D:A7:D1', 'localname': 'wisershutter'}, 'command': {'name': 'wisershutter', 'action': 'up', 'device': {'id': 'D0:CF:5E:0D:A7:D1', 'delay': 0, 'needsrefresh': '0', 'name': 'wisershutter'}}}
[2021-01-20 23:17:57.349][DEBUG] : WiserShutter--sendCommand() : up on D0:CF:5E:0D:A7:D1
[2021-01-20 23:17:57.351][DEBUG] : UTILS------Creating a new connection for D0:CF:5E:0D:A7:D1
[2021-01-20 23:17:57.354][DEBUG] : CONNECTOR------Connecting : D0:CF:5E:0D:A7:D1 with bluetooth 0
[2021-01-20 23:17:58.516][DEBUG] : CONNECTOR------Connected... D0:CF:5E:0D:A7:D1
[2021-01-20 23:17:58.520][DEBUG] : CONNECTOR------Writing Characteristic... D0:CF:5E:0D:A7:D1
[2021-01-20 23:17:58.569][DEBUG] : CONNECTOR------Characteristic written... D0:CF:5E:0D:A7:D1
[2021-01-20 23:17:58.586][DEBUG] : {'rsp': ['wr']}
[2021-01-20 23:17:58.589][DEBUG] : WiserShutter--enableNotifications() : writed: True
[2021-01-20 23:17:58.592][DEBUG] : CONNECTOR------Writing Characteristic... D0:CF:5E:0D:A7:D1
[2021-01-20 23:17:58.608][DEBUG] : CONNECTOR------Characteristic written... D0:CF:5E:0D:A7:D1
[2021-01-20 23:17:58.611][DEBUG] : {'rsp': ['wr']}
[2021-01-20 23:17:58.617][DEBUG] : WiserShutter--enableNotifications() : writed: True
[2021-01-20 23:17:58.628][DEBUG] : Subscribing to notification : D0:CF:5E:0D:A7:D1
[2021-01-20 23:17:58.631][DEBUG] : Delegated
[2021-01-20 23:17:58.645][DEBUG] : WiserShutter--sendCommand() : UP
[2021-01-20 23:17:58.647][DEBUG] : CONNECTOR------Writing Characteristic... D0:CF:5E:0D:A7:D1
[2021-01-20 23:17:58.656][DEBUG] : concurrent poll() invocation
[2021-01-20 23:17:58.666][DEBUG] : CONNECTOR------Retry connection D0:CF:5E:0D:A7:D1
[2021-01-20 23:17:58.668][DEBUG] : CONNECTOR------Connecting : D0:CF:5E:0D:A7:D1 with bluetooth 0
[2021-01-20 23:17:58.758][DEBUG] : No name in data but i know it is : wisershutter
[2021-01-20 23:17:58.762][DEBUG] : BeeWiSmartLite------manuf: b602010020000b0200ff00090600000000000000000000000000 name:wisershutter data:
[2021-01-20 23:17:58.780][DEBUG] : WiserShutter--isValid()=true : name=wisershutter manuf=b602010020000b0200ff00090600000000000000000000000000 data= mac=d0:cf:5e:0d:a7:d1
[2021-01-20 23:17:58.783][DEBUG] : SCANNER------This is a wisershutter device d0:cf:5e:0d:a7:d1
[2021-01-20 23:17:58.796][DEBUG] : WiserShutter--parse() : name=wisershutter manuf=b602010020000b0200ff00090600000000000000000000000000 data= mac=d0:cf:5e:0d:a7:d1
[2021-01-20 23:17:58.799][DEBUG] : {'present': 1, 'status': 'unknown', 'id': 'D0:CF:5E:0D:A7:D1', 'type': 'wisershutter', 'name': 'wisershutter', 'rssi': -71, 'source': 'Raspberry'}
[2021-01-20 23:17:58.822][DEBUG] : CONNECTOR------Failed to connect to peripheral D0:CF:5E:0D:A7:D1, addr type: public attempt 1
[2021-01-20 23:17:59.016][DEBUG] : Received Notification for D0:CF:5E:0D:A7:D1 wisershutter from handle 0x16
[2021-01-20 23:17:59.019][DEBUG] : Send to jeedom : {'devices': {'D0:CF:5E:0D:A7:D1': {'present': 1, 'status': 'unknown', 'id': 'D0:CF:5E:0D:A7:D1', 'type': 'wisershutter', 'name': 'wisershutter', 'rssi': -71, 'source': 'Raspberry'}}}
[2021-01-20 23:17:59.024][DEBUG] : WiserShutter--handlenotification() 0x16 : b'ffff07ff409014020001'
[2021-01-20 23:17:59.089][DEBUG] : Starting new HTTP connection (1): 192.168.1.42:80
[2021-01-20 23:17:59.133][DEBUG] : http://192.168.1.42:80 "POST /plugins/blea/core/php/jeeBlea.php?apikey=ahRyGxiye353E3hq7BnhY7WGCfJLF4es HTTP/1.1" 200 0
[2021-01-20 23:17:59.258][DEBUG] : Send to jeedom : {'devices': {'D0:CF:5E:0D:A7:D1': {'status': 'unknown', 'label': 'Inconnu'}}}
[2021-01-20 23:17:59.298][DEBUG] : Starting new HTTP connection (1): 192.168.1.42:80
[2021-01-20 23:17:59.332][DEBUG] : http://192.168.1.42:80 "POST /plugins/blea/core/php/jeeBlea.php?apikey=ahRyGxiye353E3hq7BnhY7WGCfJLF4es HTTP/1.1" 200 0
[2021-01-20 23:17:59.921][DEBUG] : CONNECTOR------Failed to connect to peripheral D0:CF:5E:0D:A7:D1, addr type: public attempt 2
[2021-01-20 23:18:00.011][DEBUG] : Received Notification for D0:CF:5E:0D:A7:D1 wisershutter from handle 0x33
[2021-01-20 23:18:00.013][DEBUG] : WiserShutter--handlenotification() 0x33 : b'01'
[2021-01-20 23:18:00.016][DEBUG] : WiserShutter--Ouverture
[2021-01-20 23:18:00.053][DEBUG] : Received Notification for D0:CF:5E:0D:A7:D1 wisershutter from handle 0x16

Je peux partager mon fichier source si quelqu’un est disponible pour regarder.

Je vais peut être créer un autre topic indépendant…

Ce paramètre « Garder la connection » est surtout pour les modules lent à se connecter. Je ne sais pas si c’est le cas pour ta sonde de température. D’autre part, pour un module sur pile, il n’est pas conseillé de garder la connection car cela va fatiguer ta batterie beaucoup plus vite si j’ai bien compris. Il vaut mieux fermer la connection à chaque fois.

S’agissant d’un module secteur, garder la connection devrait pas poser de soucis. Mais s’il y a la possibilité d’activer des notifications, garder la connection ne devrait pas être necessaire.

Oui, ce serait plus facile pour essayer de t’aider.

Ce serait mieux en effet. Voir même un topic pour chaque module et tu mets les liens dans celui-ci. Ca permettra de ne pas mélanger les deux.

Pour l’interrupteur j’ai créé le sujet suivant

Pour la sonde je me contente des trames advertisées et j’ai laissé la connexion sur le refresh.

Pour les problèmes de concurrent poll() j’ai mis à jour la librairie bluepy en 1.3.0 (j’étais en 1.1), c’est plus stable (la changelog indique des corrections sur l’api write en concurrence) mais il me reste des lenteurs et difficultés de connexion que je détail sur le sujet de l’interrupteur.