Valeurs non remontées

Bonjour,

J’ai des capteurs de température/humidité bluetooth (les petits xiaomi carrés).
Ils fonctionnent bien sur mon application xiaomi home.
Je les ai passés sur jeedom via le plugin blea.
Mon problème : les valeurs sont censé remonter toutes les 10 minutes (autorefresh actif), mais remontent de manière aléatoire, très peu souvent. Aucune remontée depuis ce matin 8h50 par exemple.
Ca fonctionne bien si je refresh à la main.

J’ai eu deux problèmes consécutifs :

  1. tout d’abord mon raspberry se bloquait quasiment (occupation CPU 100%). Après un peu de lecture, c’est un problème connu sur debian > 8, ce qui est mon cas
  2. j’ai donc utilisé mon autre raspberry (rpi3 sous debian 8) pour en faire une antenne déportée. Dlle fonctionne bien, sauf que je tombe dans ce problème de non remontée de valeurs.

Quand je regarde les logs côté antenne déportée :

  • je vois bien passer mes demandes de refresh manuelles (l’antenne interroge alors le capteur, puis relaie les valeurs vers jeedom)
  • par contre je ne vois passer aucune demande de refresh automatique, elles sont censées passer toutes les 10 minutes.

D’où cela pourrait-il venir svp ?
Merci

Bonjour,

Debian 8 est déprécié (obsolète), donc au minimum une version 9 voir 10 srait la bienvenue.

Ensuite quelle version de Jeedom, version du plugin (stable/beta/date)
Ton capteur serait il le suivant? BLE LYWSD03MMC si oui avec une petite recherche il y a déjà plusieurs sujets traitant de ce capteur

J’ai du mal m’exprimer.

Mon rpi est sous debian 10. Mais le plugin BLEA sature la machine (CPU à 100%). C’est un problème connu du module python, pour debian > 8. En parcourant les forums, je vois des dizaines de personnes qui remontent le même problème, mais pas de solution connue à ce jour.

C’est pourquoi je suis passé par une antenne déportée sous debian 8, sur mon ancien rpi3. Plus de problème de CPU, mais des remontées erratiques.

J’ai en effet vu beaucoup de sujet qui traitent de ce capteur, mais aucun n’apporte de solution satisfaisante.

jeedom : 4.0.61
plugin bluetooth advertisement : version 2020-11-21 01:01:09
capteur : LYWSD03

1 « J'aime »

Déjà faut commencer par régler ce problème avant d’aller plus loin car cela n’est pas normal du tout, j’ai moi même Jeedom 4.0.61 sur un RPI 3B+ sous Rabian Buster 10 et aucune saturation.

J’ai aussi ce type de capteur, avec blea et une smart en 3.3.53.
J’avais mis en place la procédure qui consistait à modifier le fichier lywsd03.py avec les bindkey, et cela fonctionnait. Mais la mise à jour du plugin a remis à zéro ces modifications.
Du coup, j’ai discuté avec sarakha et des personnes de son groupe d’entraide qui m’ont indiqué que cela fonctionne sans les fichiers modifiés. Du coup, je suis reparti de zéro avec réinstall plugin , réinstall antennes déportées, modif des refresh forcé, etc, mais ce n’est pas trop concluant car les modules ne remontent pas régulièrement la température : par exemple plus rien sur mes 4 capteurs depuis plus de 02h30 :

Et parfois les capteurs se bloquent carrément (voyant BT allumé en permanence sur l’écran du capteur), RSSI =-200 sur les antennes et pas de remontée :
Capture1

Malheureusement, ça fonctionne chez certains, mais ça dysfonctionne chez d’autres :frowning:
Perso, je pense les sortir de jeedom et acheter des aqara en zigbee qui sont plus stable.

Il y a un bug ouvert (et non résolu) à ce sujet sur la lib bluepy (la lib python qui gère le bluetooth).
Si vous n’avez pas le problème, alors vous avez de la chance :slight_smile:

Donc non, je vais rester sur l’optique de l’antenne déportée, surtout qu’elle me permet d’optimiser mon réseau.

Le problème c’est que maintenant je tombe sur un autre problème visiblement connu lui aussi. C’est pour cela que j’ai ouvert ce sujet sur ce forum.

Oui j’ai vu cette bidouille.
Elle ne me satisfait pas car elle oblige à modifier le plugin pour y stocker en dur des clés. Donc en effet, la modif peut sauter à tout instant, et c’est ce qui vous est arrivé malheureusement.

A noter : j’ai aussi les capteurs zigbee, ils sont vraiment chouettes et fonctionnent du tonnerre. Par contre ils n’ont pas d’écran.
Mais j’ai là aussi un soucis d’intégration dans jeedom, cf un autre sujet que j’ai ouvert par ailleurs.

tu peux mettre l’url de l’autre post stp?

C’est ici

Bon, pour finir, j’ai adapté le « driver » LYWSD03" du plugin blea pour qu’il fonctionne avec le firmware custom développé par atc1441 (rappel : ça se passe ici)

Comme ça, plus aucun problème.
Grace au firmware custom, les trames passent en clair et non plus en crypté. De plus les données de température, humidité et batterie figurent toutes en même temps directement dans la trame transmsie par le module LYWSD03.

Les données sont remontées toutes les minutes (paramétrable facilement dans le firmware).
Donc vraiment c’est top.

Précisions : les modules ne sont plus reconnus comme LYWSD03. Pour les ajouter dans jeedom Il faut donc lancer un scan avec l’option « tous les produits », puis il faut affecter manuellement le type « lywsd03 » dans la config du module.

Voici mon fichier lywsd03.py.
La modif est dans la fonction parse.
C’est la première fois de ma vie que je code en python, donc c’est peut-être pas optimal.
Mais y a pas plus simple comme code, et ça fonctionne.

Je m’étonne d’ailleurs que personne ne s’y soit plongé avant moi :slight_smile:

# coding: utf-8
from bluepy import btle
import time
import logging
import globals
import struct
from multiconnect import Connector
from notification import Notification

class Lywsd03():
        def __init__(self):
                self.name = 'lywsd03'
                self.ignoreRepeat = False

        def isvalid(self,name,manuf='',data='',mac=''):
                logging.debug('LYWSD03------isvalid data=%s, mac=%s, name=%s, manuf=%s' % (data, mac, name, manuf))
                if name.lower() in [self.name]:
                        return True
                if data.lower().startswith("1a18") and (mac.lower().startswith("a4:c1:38")):
                        #broadcasted advertising data
                        return True

        def parse(self,data,mac,name,manuf):
                logging.info('LYWSD03------adv data=%s, mac=%s, name=%s, manuf=%s' % (data, mac, name, manuf))
                action={}
                action['present'] = 1

                bd = bytes.fromhex(data)

                (temp,) = struct.unpack('>H', bd[8:10])
                temp = temp / 10
                humi =  bd[10]
                batt = bd[11]

                action["temperature"] = temp
                action["moisture"] = humi
                action["battery"] = batt

                logging.info('LYWSD03------mac=%s, temp=%s, humi=%s, batt=%s' % (mac, temp,humi,batt))

                return action

        def read(self,mac):
                result={}
                try:
                        conn = Connector(mac)
                        conn.connect()
                        if not conn.isconnected:
                                conn.connect()
                                if not conn.isconnected:
                                        return
                        batt = bytearray(conn.readCharacteristic('0x3a'))
                        battery = batt[0]
                        notification = Notification(conn,Lywsd03)
                        notification.subscribe(10)
                        result['battery'] = battery
                        result['id'] = mac
                        logging.debug('LYWSD03------'+str(result))
                        return result
                except Exception as e:
                        logging.error(str(e))
                return result

        def handlenotification(self,conn,handle,data,action={}):
                result={}
                if hex(handle) == '0x36':
                        received = bytearray(data)
                        temperature = float(received[1] * 256 + received[0]) / 100
                        moisture = received[2]
                        result['moisture'] = moisture
                        result['temperature'] = temperature
                        result['id'] = conn.mac
                        result['source'] = globals.daemonname
                        globals.JEEDOM_COM.add_changes('devices::'+conn.mac,result)

globals.COMPATIBILITY.append(Lywsd03)

3 « J'aime »

Après quelques jours de recul : ma solution marche nickel.
Fini les coupures :slight_smile:

Comme je reçois beaucoup de demandes en MP, je tiens à préciser ma solution au problème des LYWSD03

  1. il faut flasher les sondes avec un firmware, qui n’est pas le mien, dont je ne suis pas responsable, et pour lequel j’ai donné un lien où on peut trouver toutes les infos nécessaires
  2. il faut ensuite remplacer le fichier python lywsd03.py, par celui que j’ai donné. L’emplacement de ce fichier dépend de votre système, et dépend de s’il s’agit d’une antenne déportée ou locale.

A+

@dudusse, j ai flashé le module à partir du lien fourni puis ensuite copié le contenu de ton fichier en lieu et place de celui d’origine.
Par contre impossible de le faire détecter par BLEA . même en activant détection des inconnus.

Pourrais tu me donner plus d infos sur ta méthode pour le faire détecter par BLEA

C’est bon en réinstallant les dépendances j ai pu faire détecter le module flashé/
C’est réactif et bien plus simple

1 « J'aime »

Merci pour la modif. Peux etre créé un autre équipement dans BLEA du genre Atc1441 serait plus pratique que de modifier l’existant ?

Bonjour,
Y’a peut-être qq chose que j’ai pas compris, mais vous faites comment pour flasher ? J’ai suivi la procédure avec mon maigre anglais. Mais l’outil atc1441.github.io/TelinkFlash ne trouve pas le thermomètre lorsque je clique sur connect.
Merci

la vois tu dans ta conf bluetooh ?
si oui utilise chrome

il faut un pc avant un dongle bluetooth pour faire ça?

1 « J'aime »

non tu peux le faire de ton téléphone

je le vois bien dans nrf connect, j’arrive bien a me connecter dessus.


Par contre dans l’outil de flashage, quand je clique sur connect il reste en searching for devices en bas dans les logs.
J’ai essayé sur mon iphone, sur le mac et aussi sur une tablette android.

1 « J'aime »