Flasher le Capteur XIAOMI Mijia Bluetooth lywsd03 pour Jeedom

NB : Pour agrandir les images : clic droit / ouvrir l’image dans un nouvel onglet

/!\ ATTENTION /!\ en dessous de 30% de batterie affiché sur Jeedom il y a une diminution de la fiabilité des infos, vers 20% un affichage LOW BATTERIE est visible sur le LCD avec perte du Bluetooth

Quand on commence la domotique, on y rentre Ă  tĂątons et nos choix s’orientent vite vers les produits les moins chers. Beaucoup d’entre nous commençons avec une marque pas (trop) chĂšre et avec une bonne rĂ©putation, Xiaomi !

Au vu du prix, beaucoup d’entre nous choisissent ce produit :

Mais comme nous commençons Ă  ce moment lĂ  dans la domotique, nous n’imaginons pas la galĂšre dans laquelle ce petit thermomĂštre beau et pas cher va nous mettre !

Ce qui est nĂ©cessaire :

  • Un capteur
  • Un Jeedom avec une antenne Bluetooth (local ou dĂ©portĂ©)
  • BLEA (plugin)
  • JeeXplorer (plugin)
  • Un Pc / Mobile avec Bluetooth

Il existe plusieurs sujets qui expliquent comment bidouiller BLEA avec les BindKey, le flasher et bidouiller ou encore ne rien toucher et utiliser une passerelle Xiaomi combiné à un skill Alexa et le remonter dans Jeedom grùce au plugin AlexaAPI/smarthome.

Rendons un hommage Ă  tous ceux qui ont travaillĂ© en les citant Ă  travers ces sources :

https://github.com/atc1441/ATC_MiThermometer

http://atcnetz.blogspot.com/2020/09/custom-firmware-fur-das-4-xiaomi.html

https://github.com/pvvx/ATC_MiThermometer#bluetooth-advertising-formats

https://community.jeedom.com/t/refresh-xiaomi-lywsd03mmc/17216

https://community.jeedom.com/t/valeurs-non-remontees/44590/10

https://community.jeedom.com/t/refresh-xiaomi-lywsd03mmc/17216/77

Chaque mĂ©thode possĂšde ses avantages et ses inconvĂ©nients :

AlexaAPI/smarthome :

Avantages :

  • Aucune bidouille
  • TrĂšs simple
  • Pas de flashage

InconvĂ©nients :

  • NĂ©cessite une passerelle Bluetooth Xiaomi
  • Avoir Alexa
  • Trous dans les remontĂ©s (trĂšs rare mais embĂȘtant quand on pilote un chauffage)
  • Pas CloudFree (DĂ©pendant d’internet)

BLEA avec les BindKey :

Avantages :

  • CloudFree (DĂ©pendant d’internet)
  • Pas de flashage

InconvĂ©nients :

  • Complexe (rĂ©cupĂ©ration @MAC, BindKey)
  • Trous dans les remontĂ©s (trĂšs rare mais embĂȘtant quand on pilote un chauffage)
  • Modification des BindKey si connexion sur MihHome/Autre
  • Avoir une antenne Bluetooth
  • Installation d’une dĂ©pendance de dĂ©cryptage de clĂ©s

BLEA avec flashage :

Avantages :

  • Simple
  • Capteur paramĂ©trable
  • RemontĂ© sans trou (ou pas encore constatĂ© Ă  ce jour)

InconvĂ©nients :

  • Flashage
  • Avoir une antenne Bluetooth

MĂȘme tout ceci n’est pas si compliquĂ©, voir trĂšs simple dans certains cas, ce n’est pas forcĂ©ment la vision qu’on peut en avoir au dĂ©but. J’ai longtemps galĂ©rĂ©, tĂątonnĂ©, fait des erreurs et souvent je ne comprenais pas des choses pourtant trĂšs simples.

C’est pourquoi je rĂ©dige ce tuto concernant la derniĂšre solution, en vulgarisant au maximum pour le dĂ©butant de Jeedom.

Pourquoi choisir cette mĂ©thode ?

Je les ai toutes testĂ©es et je n’ai jamais Ă©tĂ© rĂ©ellement satisfait, trop de trou dans la remontĂ©e, ou trop de contrainte de maintien. Finalement je suis restĂ© sur la plus stable Ă  mon gout AlexaAPI/smarthome. Je n’avais Ă  l’époque pas retenu le flashage car il n’y avait pas de moyen de l’intĂ©grer Ă  BLEA.

Le nouveau firmware a fini de me convaincre, car cette solution me semble la plus stable au niveau des remontĂ©s, meilleure optimisation de la batterie et les inconvĂ©nients peuvent ĂȘtre considĂ©rĂ©s comme des avantages.

Pour comparatif sur 1H avec mes sondes encore sous Alexa :

Alexa

BLEA flashé

Constat sans appel !

Rappel important :

Pour ceux qui voudraient comparer les diffĂ©rentes mĂ©thodes Ă  plus longs termes, je vous rappelle que par dĂ©faut les historiques sont lissĂ©s/moyennĂ©s au-delĂ  de 2h tous les jours au CRON d’archivage (environ 4h00) avec 1 valeur moyenne par heure :

L’archivage a lieu une fois par jour dans la nuit les 2h sont appliquĂ© a partir de lĂ 

Que l’on constate sous la forme de :

Avant 3h, ce n’est pas qu’il y a eu qu’une remontĂ©e toutes les heures, mais toutes les remontĂ©es ont Ă©tĂ© regroupĂ©es en une moyenne par heures

Donc il faudra changer ces paramĂštres pour un comparatif objectif.

  1. Le flashage

MĂȘme si l’ancienne mĂ©thode de flashage proposĂ©e par Aaron Christophel Ă©tait dĂ©jĂ  pas mal

https://atc1441.github.io/TelinkFlasher.html

https://github.com/atc1441/ATC_MiThermometer

http://atcnetz.blogspot.com/2020/09/custom-firmware-fur-das-4-xiaomi.html

Victor pvvx, l’a reprise et l’a amĂ©liorĂ©e !

https://github.com/pvvx/ATC_MiThermometer

https://pvvx.github.io/ATC_MiThermometer/TelinkMiFlasher.html

En rĂ©sumĂ©, cette nouvelle mouture propose un chargement automatique du dernier firmware, une optimisation de la batterie, ainsi qu’une multitude de paramĂ©trages supplĂ©mentaires (dont dĂ©clencheur d’action physique sur la broche de test, bon faudra souder pour ça :p )

Rendez-vous sur la page https://pvvx.github.io/ATC_MiThermometer/TelinkMiFlasher.html

Nota : Si vous avez un capteur déjà flashé au format T1441, il est possible que vous deviez soit passer par le flasher T1441 pour remettre le firmware Xiaomi, ou bien utiliser la page https://pvvx.github.io/ATC_MiThermometer/TelinkOTA.html et pour effectuer une mise a jour OTA de T1441 vers PVVX. Retourner ensuite sur le flasher PVVX pour modifier les paramÚtres.

  • Activez le Bluetooth du Pc/Mobile avant de tenter de se connecter 
  • Saisissez « LYWSD03 Â» dans « BLE device name prefix filter Â»(cela permet de n’avoir que les thermomĂštres Xiaomi), « ATC Â» permettra mettre le filtre pour un thermomĂštre dĂ©jĂ  flashĂ©
  • Appuyez sur « Connecter Â» et sĂ©lectionnez votre thermomĂštre
  • Attendez que la connexion soit Ă©tablie
  • Appuyez sur « Do Activation Â»
  • Attendez la rĂ©cupĂ©ration des clĂ©s Xiaomi
  • Appuyez sur « Custom Firmware ver 2.x Â»
    • Nota le bouton Ă  cotĂ© est celui pour remettre la version Xiaomi de base
  • Appuyez sur « Start Flashing Â»
    • Le Flash prend plusieurs secondes voir plusieurs minutes
  • Si cela ne se fait pas tout seul appuyez sur « Reconnect Â»
  • Sauf besoin particulier je prĂ©conise de ne toucher que 2 valeurs :
  • Advertising type est le format des trames, par dĂ©faut est sur « ALL Â» et envoi donc aussi des trames au format Xiaomi, qui est je pense la source de valeurs farfelue que vous verrez dans la derniĂšre vidĂ©o car j’ai oubliĂ© de changer ce paramĂštre au dĂ©but.

On choisit donc « Atc1441 Â» car c’est pour ce format qu’a Ă©tĂ© dĂ©veloppĂ© le code qu’on utilisera plus tard et 5000ms.

Choisir “Atc1441” au lieu de “ALL” permet d’Ă©viter d’avoir des tempĂ©ratures incohĂ©rente (ex : 3000°C), de plus garder le “ALL” va gĂącher de la batterie pour des info inutile et diviser par 4 la publication du format qui vous intĂ©resse.

En utilisant ces réglages on constate que nous avons 2x plus de données exploitables (5s Vs 10s) avec presque 2x moins de batterie (cf schéma suivant)
  • Advertising interval est la valeur de rafraichissement des trames, j’ai choisi cette valeur car elle permet d’optimiser la durĂ©e de vie de la batterie de 7 mois sans trop affecter la frĂ©quence de rafraĂźchissement.
  • Une fois les paramĂštres choisis appuyez sur « Send Config Â»

VoilĂ  le flashage est terminĂ© !

  • Modification du fichier lywsd03.py

Nota : il semblerait que le .Py original arrive Ă  lire cette version flashĂ©e sans modification (Ă  confirmer), la diffĂ©rence de code (parse) permettrait de remonter les donnĂ©es (notĂ© en entĂȘte) au moment de la vĂ©rification de la prĂ©sence sans Ă©tablir de connexion, un peu comme si vous recherchiez un rĂ©seau wifi et que derriĂšre le nom il y avait des infos en claires. Donc le code suivant peut ĂȘtre utile pour forcer indirectement le refresh sans bloquer la sonde.

Quand on est habituĂ© Ă  Jeedom cela peu paraĂźtre bĂȘte, mais quand on dĂ©bute on se demande comment modifier un fichier ; Winscp ne fonctionne pas sans droit root, PuTTY n’est pas pratique si vous n’ĂȘtes pas parfaitement familiarisĂ© avec linux


La rĂ©ponse est pourtant simple, JeeXplorer !

JeeXplorer est un plugin « explorateur Â» comme son nom l’indique, il permet, la modification, crĂ©ation, suppression de fichiers/dossiers

  • Ouvrez JeeXplorer
  • Naviguez dans l’arborescence jusqu’à html/plugins/blea/resources/blead/devices/
  • Sauvegardez le fichier lywsd03.py
    • Clic droit
  • Laissez le fichier dupliquĂ© il servira si jamais vous voulez le restaurer
  • Editez le fichier (clic droit Ă©diter ou double clic gauche) avec le code avec le code de dudusse optimisĂ© par DrKamp  et modifiĂ© par skillix pour prendre en compte les valeurs nĂ©gatives:
# 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])
                
                
                if temp > 60000 :
                	temp = 0 - ( 65530 - temp ) 
                
                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)
  • Enregistrez et quittez
  • Sauvegardez votre fichier en le dupliquant et en le renommant
  • BLEA :
  • Relancez le dĂ©mon
L’ancienne version du code obligeait Ă  rechercher les devises inconnues, pas le nouveau !

/ ! \ IMPORTANT : si vous utilisez une antenne dĂ©portĂ©e, penser Ă 

Et

  • Lancez un scan
    • / ! \ Pensez a couper le Bluetooth du Pc/Mobile car il est toujours connectĂ© et c’est le cas le capteur et ne sera pas dĂ©tectable ou de vĂ©rifier que l’@ MAC n’est pas dĂ©jĂ  dans les pĂ©riphĂ©riques inconnus de BLEA
  • Choisissez « lywsd03 Â» et suivez l’inclusion classique
  • DĂ©cochez le refresh forcĂ©
  • Cochez historiser si vous souhaitez avoir des graphes ou vĂ©rifier vos remontĂ©es

Voila vous avez fini !

NB : Si vous avez des tempĂ©ratures farfelues, vĂ©rifiez que vous avez bien changer l’adversering type, si c’est bien le cas vous pouvez utiliser une deuxiĂšmes sĂ©curitĂ© en appliquant une valeur maximale :

Bonus – plugin Alexa (ASH)

Pour ceux qui souhaiteraient envoyer leurs thermomÚtres dans Alexa pour y accéder vocalement voici comment les configurer :

  • Trouver sont Ă©quipement dans Alexa plugin, cocher transmettre, choisir le type capteur de tempĂ©rature
MĂȘme si ce n’est pas obligĂ© je vous conseil de choisir un non, car sinon il le nommera “[Object]+[Ă©quipement]
  • Si vous rencontrĂ© un NOK (ce fonctionne aussi avec le OK) cliquez dessus, il vous explique ce dont il a besoin
notez les types générique attendu
  • Reportez les sur la commande adĂ©quate :
Engrenage de l’Ă©quipement

Puis, engrenage de la commande de température

Enfin on choisi le type générique de notre commande, soit, environnement/température
  • Sauvegarder, revenez sur le plugin Alexa, sauvegardez encore.
  • Lancez un scan sur l’application ALEXA

Normalement votre thermomÚtre est découvert et OK dans le plugin.

Bonus du Bonus

Sur la derniĂšre image, j’ai configurĂ© ma commande de tempĂ©rature pour ĂȘtre averti (vocal et sms) si mon frigo passe au dessus de 11 degrĂ©s pendant plus de 10 minutes. Cela Ă©vite de crĂ©er des scĂ©nario.

One thought on “Flasher le Capteur XIAOMI Mijia Bluetooth lywsd03 pour Jeedom

  1. Salut,

    Merci pour ce tuto.

    Lors d’une mise Ă  jour du plugin BLEA, le fichier est-il supprimĂ© ? Faut-il faire une copie avant la mise Ă  jour puis aprĂšs le remettre ?

    Merci;

    Loutre38

    1. Oui une mise a jour de BLEA supprime le fichier pour replacer le fichier d’origine. C’est pourquoi dans le tuto je fais une sauvegarde du fichier avant.
      Sinon moi ce que j’ai fais j’ai ouvert le fichier avec JeeXplorer, fait la mise a jour sur un autre onglet puis enregistrĂ© apres la mise a jour.

      Apres d’aprĂšs les retours de certaines personnes sur le forum Jeedom, avec ce firmware, il semblerait que le fichier .Py d’origine BLEA soit capable de lire sans problĂšmes les informations de tempĂ©ratures, humiditĂ©s et batteries sans problĂšmes.

  2. Je ne suis pas sur, mais je pense que oui, tan que le flash permet d’avoir une trame au format T1441 ca devrait le faire. en revanche il n’y aura pas de dĂ©tection automatique car les adresses mac sont a coup sur diffĂ©rentes.

    Donc pour l’ajouter, cocher la dĂ©couverte des Bluetooth inconnu, faire un scan, trouver ton capteur puis aprĂšs sĂ©lectionner manuellement un lywsd03

  3. Bonjour déjà un grand merci pour ce super tuto ,qui ma permis de flasher sans problÚme mes 4 capteurs.

    J’aurais quand mĂȘme une question avec l’utilisation du plugin Alexa sous jeedom.

    Celle ci reste sur NOK dans le plugin et ne sont pas donc pas reconnu dans la recherche d’appareil Alexa.

    De se fait je ne peux pas les interroger avec Alexa.

    Si quelqu’un Ă  dĂ©jĂ  rencontrer ce problĂšme.

    Merci Ă  vous

    1. Bonjour, la réponse est sur le NOK si tu clique dessus, il va te dire ce dont il a besoin. Pour que le plugin Alexa (ash) fonctionne il doit connaitre et reconnaitre les type générique des commandes. Souvent les plugin les configurent automatiquement quand ils connaisse les équipements, mais parfois il faut les configurer manuellement.

      Comme je n’arrivais pas a insĂ©rer des images dans le commentaire, je t’ai fait une explication complĂšte en fin d’article 😉

Laisser un commentaire