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
# 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)