Valeurs non remontées

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 »