Refresh xiaomi LYWSD03MMC

Alors, sur le Local tu dois faire :
1.

En reprenant le MAC address de chacune de tes sondes associé avec le bindkey que tu obtiens via cette page. Attention, si tu fais « do activation » une seconde fois sur le même module, le bind key change !
Par ailleurs, tant que la page est ouverte et que tu es connecté à un module, celui-ci n’est pas détecté par Blea, il faut juste rafraichir la page ou la fermer quand tu as terminé.
Et moi j’ai gardé les majuscules pour les MAC, ça fonctionne « très bien » avec.

  1. Ajouter la dépendance sur la librairie de décryptage : sudo pip3 install pycryptodomex sur ton local via SSH

Ensuite sur tes antennes :

  1. Tu installes les dépendances etc… si c’est pas déjà fait.

  2. Tu lances le daemon de tes antennes et tu vérifies qu’elles ont bien repris le bon fichier .py en regardant le contenu de /blead/resources/blead/devices/lywsd03.py et en constatant que tu y retrouves bien tes MAC + bindkey comme sur ton local.

  3. Maintenant tu dois également ajouter la dépendance sur la librairie de décryptage : sudo pip3 install pycryptodomex sur ton antenne, via SSH.
    Je me suis aperçu qu’il me manquait cette dépendance car j’avais un message dans le log disant qu’il ne trouvait pas le cryptodome, mais c’était même pas une erreur.

Au final tu auras donc :

  1. La librairie de décryptage installée sur ton local et sur ton antenne
  2. Le fichier de config paramétré avec tes MAC et tes bindkeys sur ton local. Il sera ensuite automatiquement recopié sur tes antennes quand tu lancera le daemon.

Si ça ne fonctionne toujours pas, mets-toi en mode debug, relance le daemon et envoie nous une partie du fichier de log de l’antenne.
Voici un exemple de trame qui remonte la température sur mon antenne :

[2021-01-07 22:14:51.592][DEBUG] : No name in data but i know it is : lywsd03
[2021-01-07 22:14:51.597][DEBUG] : LYWSD03------isvalid data=95fe58585b05360542d138c1a491a1370e8c0100006bdf3d54, mac=a4:c1:38:d1:XX:XX, name=lywsd03, manuf=
[2021-01-07 22:14:51.599][DEBUG] : SCANNER------This is a lywsd03 device a4:c1:38:d1:XX:XX
[2021-01-07 22:14:51.601][INFO] : LYWSD03------adv data=95fe58585b05360542d138c1a491a1370e8c0100006bdf3d54, mac=a4:c1:38:d1:XX:XX, name=lywsd03, manuf=
[2021-01-07 22:14:51.603][INFO] : LYWSD03------Encrypted
[2021-01-07 22:14:51.615][DEBUG] : {'present': 1, 'temperature': 19.6, 'id': 'A4:C1:38:D1:XX:XX', 'type': 'lywsd03', 'name': 'lywsd03', 'rssi': -73, 'source': 'RaspberryPi 0'}

Sur ce, bon courage ! :crossed_fingers:

super clair, je confirme pour les majuscules, mois aussi je les ai, il semble que la différence est juste un souci d’affichage dans les logs.

Je ne pense pas que cela ai vraiment de l’importance, mais tu devrais les remettre en MAJ

Merci à vous deux pour votre aide, je ne vais pas crier victoire trop vite, mais les infos sont remonté et j’oubliais bien quelque chose.
Je n’avais pas compris qu’il fallait mettre les antennes à jour en cliquant sur « mettre à jour tous les fichiers » je faisais que redémarrer les antennes. Je vous tiens au courant.

Bon cela fait 1 jour que j’ai des remontée donc ça c’est niquel mais je vois que la température et l’humidité ne remontent pas en même temps et surtout aléatoirement.
Donc si je regarde mes températures sur Jeedom et sur le capteur elles ne sont jamais pareilles.
Pour le refresh, il faut le cocher ou pas ?

Surtout pas de refresh forcé, car il fait planté le thermomètre, il faut alors le démonter pour enlever la pile ou au mieux il ne plantera mais bouffera ta pile en 1 mois.

Quand tu dis que les valeurs ne sont pas pareil, c’est de beaucoup ?

Car le refresh auto d’après ce que j’ai compris se fait sous condition tel que si une valeur est différente de plus de X degrés/humidité.

Exemple si le dernier envoi il faisais 20° et qu’il fait maintenant 20.2 et que le X degré de différence est ±0.5° alors pas de refresh, et si pas de variation depuis plus de X minutes alors j’envoi quand même (les valeur cité ne sont pas les bonnes mais le principe l’est je crois).

Si les valeurs sont vraiment différentes, vérifie que tu n’as pas inversé des thermomètres.

Nb: mes remontées sont bien régulières depuis mes derniers tests, j’ai basculé mes compteur Mijia comme capteur de mon thermostat, et recyclé mes Aquara Zigbee dans mon frigo/congel.

1 « J'aime »

En vrai mes remonté se font toutes les 10 min environs mais rien entre 2.
Si je mets le capteur dans mes mains la température augmente mais pas sur jeedom.

10 minutes c’est pas mal, très bien même. pense que tu est sur un protocole bluetooth BLE (Low Energie) il ne faut pas envoyer en temps reel sinon adieu les piles. Avec des vraies variations de températures 10 minutes c’est plus que correcte

Donc c’est normal alors ?

oui :wink: et comme je l’avais expliqué avant il y a des conditions pour mettre a jour. Donc d’apres mes log detaillé il semblerait que ce soit:

Une difference d’au moins 0.1° apres au moins 10 minutes.

Donc si tu reste 30 minutes a 20.1°, puis 10 minutes a 20.15°, tu n’aura pas de remonter pendant au moins 40 minutes jusqu’a ce que cela passe a 20.2°

Merci à toi pour ton aide et tous ces renseignements de mon côté ça marche niquel.

merci a toi sans tes questions je n’aurait jamais retenté le coup et compris mon erreur

@team18fr, une question pour ton antenne déportée, tu as jeedom dessus? mon frangin en a une et cela ne semble pas fonctionner ?

Non ce n’est pas jeedom dessus.

1 « J'aime »

Sincèrement flashé le et ensuite vous n’aurez plus de problème

je l’ai fait, mais BLE ne le reconnais pas une fois flashé (a moins que cela ai changé)

Il faut changer le fichier lywsd03.py et le remplacer par

# 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("95fe") 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)

puis
-Activation de « Autoriser l’inclusion de devices inconnus » dans le plugin BLEA
-Relance des dépendances
-Relance du démon
-Scan pour inclure les modules en laissant l’option « tous »
-Remplacement du type des modules, par lywsd03, une fois qu’ils ont été inclus

1 « J'aime »

L’astuce vient de @dudusse.
On en discute ici > Valeurs non remontées

1 « J'aime »

au top, @nerull77 regarde ca

Par contre décoche le refresh forcé

@nerull77, n oublie pas de recopier le fichier sur toutes tes antennes