Module Xiaomi Flower Care


#1

Amis de la flore, je me lance :slight_smile:
J’ai commencé à bosser sur un module pour les capteurs Xiaomi Flower Care, basé sur le module Gladys-bluetooth. J’ai réussi à récupérer les valeurs de mon capteur et à les envoyer à Gladys :

Mais débutant en nodeJS, je bloque sur quelques questions :

  • 1er question :
    J’arrive à récupérer les valeurs de mon capteur, mais je souhaite pouvoir différencier la fréquence de scan de celle de la détection de présence (1 mesure par minute, c’est beaucoup trop, 1 ou 2 par jour suffirait). Comment faire ?

  • 2ème question :
    Le package utilisé pour gérer le Flower Care (node-mi-flora) utilise aussi noble et du coup, j’ai un conflit avec les commandes passées à celui-ci. Du genre, le scan se stop quand il a récupéré les données du capteurs, alors que la période de scan de Gladys-bluetooth n’est pas terminée.

  • 3ème question :
    Lors de mes tests, j’ai rencontré ce message d’erreur :


    Je pense que c’est lié à ma 2ème question.

Merci d’avance pour vos réponses, commentaires et idées :wink:


Module Xiaomi Mijia Bluetooth Hygrothermographe
Perdue dans mon projet
#2

Hello! Nice!

Tu as fais un module séparé du coup ou tu as modifié Gladys Bluetooth ?


#3

J’ai modifié Gladys Bluetooth, comme tu me l’as conseillé.

Pour le moment c’est intégré au module, mais je pense faire quelque-chose de modulaire pour ceux qui voudrais développer d’autre module bluetooth (un peu comme le principe des modules pour Gladys).


#4

Ah oui mais forcément si tu lance une deuxième instance de noble dans le même module forcément ça marche pas ^^

Je parlais d’utiliser la même instance de noble ! A vrai dire je ne savais pas qu’il y avait un module node mi flora

Ce que je conseillerais, vu que le module mi flora est vraiment simple ( c’est un seul fichier de 100 lignes… ), c’est de s’en inspirer pour modifier le module gladys-bluetooth et ainsi utiliser la même instance de noble


#5

Si je comprends bien, l’idée serait de reprendre ce que fait le package node-mi-flora, mais en utilisant l’instance noble de Gladys ?

Mais du coup, comment avoir 2 fréquences de scan différentes (présence et mesure) ?


#6

Exactement :slight_smile:

Tu gardes la fréquence de scan la plus fine ( celle de la présence ), et tu n’enregistrer la mesure que si la précédente mesure de mi flora date d’il y a plus de X minutes/heures ( créé toi une variable “lastMeasureDate” par exemple, et tu compares après )


#7

@pierre-gilles, j’ai forké gladys-bluetooth pour y ajouter mes modifs, tu trouveras les sources là : https://github.com/NicolasD-62/gladys-bluetooth

Le module envoie les valeurs à Gladys, mais il y a encore quelques modifications/corrections à faire :

  • Ajouter à gladys-bluetooth la possibilité de charger des modules et rendre le module flowerCare indépendant (idem modules Gladys).

  • Globaliser la variable “lastMeasureDate” (pour le moment la fréquence est celle de scan de gladys-bluetooth).

  • Corriger le fait que le scan bluetooth se stop une fois les données du capteur récupéré et rend donc impossible la détection d’autres périphériques :

Scan OK (MI Band, Flower Care, puis stop):

Scan KO (Flower Care uniquement, puis stop):

Amis développeurs JS, votre aide est la bienvenue :wink:


#8

Petit retour sur ton module!

Pourquoi avoir fais un dossier api/hooks avec un package.json à lui ? Perso je mettrais dans le dossiers lib un dossier “compatibilities” et dans ce dossier je mettrais un dossier par compatibilité, donc un dossier “miflora” pour toi. Pas de duplication de package.json ni rien, j’ai pas trop compris pourquoi tu as rajouté ça :smiley: Ce dossier miflora dedans je mettrais juste un fichier exec.js + ton fichier Miflora.js

Pour t’intégrer au module actuel, ce qui serait le plus propre à mon sens, ça serait de faire une sorte de fichier avec un switch qui redirige vers la bonne fonction exec.
avec en default un appel d’une fonction default qui est dans un fichier séparé. Comme ça ça reste clair même si on développe 30 intégrations

  1. Pourquoi identifier le device par son nom ? pas moyen de l’identifier par un ID de constructeur ? il me semble que dans le protocole bluetooth il y a un id comme ça communiqué, ça évitera que ton module soit caduc si le mec à changé le nom de son miflora

Pour ton soucis là comme ça j’ai du mal à voir sans avoir le device sur moi …


#9

Je pensais faire quelque-chose de modulaire, genre plugin et sortir le code dans un package indépendant.

C’est ce qui est fait dans le package ‘node-mi-flora’ d’origine.

A ma connaissance, il est impossible à l’utilisateur de changer le nom du capteur.
Si le nom change, c’est que le firmware a changé, et donc le module sera à adapter en fonction de la version du firmware.


#10

Ok merci pour tes réponses :slight_smile: A mon avis ici c’est plus puissant d’intégrer la gestion des différents périphériques nativement à tout le module Bluetooth. ça risque de faire un peu lourd si par dessus un module on doit installer X modules ^^

Ok pour l’identification par le nom, à voir tout de même si il n’y a pas un ID plus “propre”. Mais bon en attendant ça fait le boulot :slight_smile:


#11

Voilà ce que le périphérique me retourne quand j’affiche le contenu de l’objet peripheral :

peripheral.addressType: "public"

peripheral.connectable: true

peripheral.advertisement: 
{
	"localName": "Flower care",
	"serviceData": [{
			"uuid": "fe95",
			"data": {
				"type": "Buffer",
				"data": [113, 32, 152, 0, 12, 235, 213, 98, 141, 124, 196, 13, 9, 16, 2, 35, 1]
			}
		}
	],
	"serviceUuids": ["fe95"],
	"solicitationServiceUuids": [],
	"serviceSolicitationUuids": []
}

peripheral.rssi: -87

peripheral.services: null

peripheral.state: "disconnected"

Et mis à part le nom, je ne vois pas comment identifier le capteur :confused:

Je pars donc sur cette solution et je vais intégrer le module au reste du code avec un switch :wink:

Merci pour tes conseils…


#12

Effectivement ! Bon on reste sur le nom alors :slight_smile:

Top! Et GG pour ton module, un gars sur Twitter a dit qu’il était intéressé pas plus tard qu’il y a 5 minutes


#13

En effet vu que j’ai le Flower care je vais suivre ce thread avec beaucoup d’intéret.
Bon après j’ai zero compétence en code alors j’espère que ce sera plug and play ^^
je vais déja terminer les vidéos de ton starter pack :slight_smile:


#14

Ben pareil j’attends avec impatience ce module.

Merci Nico


#15

Bon, j’ai bossé tout l’aprem pour prendre en compte les recommandations de @pierre-gilles et je commence à avoir quelque-chose de pas trop mal, mais d’assez irrégulier dans l’envoi :

Il ne reste plus qu’a gérer le délais pour la prise de mesure (1/J par défaut).
Etant un noob en JS, je ne vois pas trop comment stocker la date de dernière prise de mesure (lastMeasureDate)… :confused:
Si quelqu’un s’y connaissant plus que moi pouvais jeter un oeil dans le code et m’indiquer comment faire, ça serait génial :yum:

Après ça, passage en phase de test…


#16

tu créé une variable hors de ta fonction :

var lastMeasureDate;

A chaque fois que tu enregistre une mesure, tu fais :

lastMeasureDate = new Date();

( ça set la variable lastMeasureDate à la date courante )

Et ensuite à chaque fois que la fonction est appelé, tu test si la différence entre la date courante actuelle et la date de la dernière mesure est supérieur au seuil que tu cherche

if((new Date() - lastMeasureDate) > 30*60*1000)

=> SI la mesure a été faite il y a plus de 30 minutes, ALORS

Je suis clair ? :slight_smile:


#17

Oui, c’est bon, merci :slight_smile:

@aiaalm, j’ai poussé sur mon repo, si tu veux faire le béta testeur…
Pour l’install, la procédure reste la même.

Reste à voir ce que ça donne avec 2 instances de gladys bluetooth sur 2 RPI (j’attends mon 2ème, pour faire les tests).

[Edit] Une petite capture d’écran pour la route :


#18

je me trompe ou y a une erreure dans le readme ?

Clone this repository :

git clone https://github.com/GladysProject/gladys-bluetooth

ca renvoye sur le gladys-bluetooth de Pierre-Gille non?

Je dois supprimé l autre avant?

pi@gladys:~ $ git clone https://github.com/NicolasD-62/gladys-bluetooth
fatal: destination path ‘gladys-bluetooth’ already exists and is not an empty directory.


#19

ok j’ai copier mon config.js et viré l ancient gladys-bluetooth

c’est pas mal :smiley:

Et ca continue a rechercher les péripheriques bluetooth


#20

Le readme est celui d’origine, je ne l’ai pas modifié.

Oui, j’ai fait pas mal de modif, mais le fonctionnement original est conservé :wink:

Et je vois que tu as bien reçu des mesures, c’est cool :raised_hands:

J’ai réglé l’interval de mesure à 24h, et je ne sais pas ce que tu en penses, mais j’ai bien envie de fixer des délais différents par type de mesure (genre température et lux 2h, fertility, moisture 24h et batteryLevel 1 semaine).