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.

Laisser un commentaire