Page 2 sur 2

Re: [Python] Capteur de température – humidité LCD Xiaomi BLUETOOTH

Publié : 24 juin 2021, 11:51
par kisskool
J'ai juste utilisé ton script en personalisant les "devices" et j'ai plusieurs questions :
Comment tester l'accessibilité aux sondes depuis les serveur
Comment les ajouter dans domoticz

Je ne sais pas si j'utilise bien le script de test :

Code : Tout sélectionner

$ sudo ./test.py
from: can't read /var/mail/bluepy.btle
./test.py: 3: ./test.py: Syntax error: "(" unexpected
xxxk@debian:~$
Ton script :

Code : Tout sélectionner

import DomoticzEvents as DE
import sys
sys.path.append("/usr/local/lib/python3.7/dist-packages/")
from bluepy.btle import Scanner, DefaultDelegate
import os

midevices = {
    "a4:c1:38:95:C8:0D": {'device': ATC_A00001}, 
    "a4:c1:38:22:B4:B2": {'device': ATC_B00002}, 
    "a4:c1:38:CC:D6:76": {'device': ATC_C00003},
    "a4:c1:38:DC:6E:3E": {'device': ATC_D00004}  
}

otherdevices = {}

def update(idx, t, h):
    #0=Normal 1=Comfortable 2=Dry 3=Wet
    c = 0
    url = "http://127.0.0.1:8080/json.htm?type=command&param=udevice&idx="+str(idx)+"&nvalue=0&svalue="+str(t)+';'+str(h)+';'+str(c)
    os.system('/usr/bin/curl "'+url+'"')

def log(s):
    #DE.Log(str(s))
    return

def display(t):
    for a,b in t.items():
        log(a)
        for c,d in b.items():
            log(str(c)+' : '+str(d))

# 1a18 a4c138a3c592 00cc 27 4e    0b58 3c
#  -      mac       temp hu %bat  vbat frame_packet_counter

class ScanDelegate(DefaultDelegate):
    def __init__(self):
        DefaultDelegate.__init__(self)

    def handleDiscovery(self, dev, isNewDev, isNewData):
        global midevices, scan, otherdevices
        t = {}
        if dev.addr in midevices:
            for (adtype, desc, value) in dev.getScanData():
                t[adtype] = value
            if t[22][0:4] == '1a18' and len(t[22]) == 30:
                if not 'temp' in midevices[dev.addr]:
                    scan = scan + 1
                data = t[22]
                #midevices[dev.addr]['name'] = t[9]
                midevices[dev.addr]['temp'] = int(data[16:20],16)/10
                midevices[dev.addr]['humi'] = int(data[20:22], 16)
                midevices[dev.addr]['bat'] = int(data[22:24], 16)
                midevices[dev.addr]['vbat'] = int(data[24:28], 16) /1000
                midevices[dev.addr]['count'] = int(data[28:30], 16)
                #log(dev.addr+' == '+data+' > '+str(midevices[dev.addr]['bat'])+'%')
        else:
            if isNewDev:
                otherdevices[dev.addr] = {}
            for (adtype, desc, value) in dev.getScanData():
                otherdevices[dev.addr][adtype] = value

#========= MAIN =========#

log("BLUETOOTH START")

scanner = Scanner().withDelegate(ScanDelegate())

scanner.clear()
scanner.start()

i = 0
scan = 0
while scan<len(midevices) and i < 5:
    i = i + 1
    scanner.process(2)
    
scanner.stop()

log('BLUETOOTH END '+str(i))

#display(midevices)

for m, d in midevices.items():
    if 'temp' in d and d['device']:
        update(d['device'], str(d['temp']), str(d['humi']))
        
#display(otherdevices)
log('BLUETOOTH UPDATE ')

Re: [Python] Capteur de température – humidité LCD Xiaomi BLUETOOTH

Publié : 24 juin 2021, 18:54
par cyril21
Pour le script de test en effet il faut ajouter des parenthèses pour les "print" (depuis python3 je crois):

Code : Tout sélectionner

from bluepy.btle import Scanner, DefaultDelegate

class ScanDelegate(DefaultDelegate):
    def __init__(self):
        DefaultDelegate.__init__(self)

    def handleDiscovery(self, dev, isNewDev, isNewData):
        if isNewDev:
            print ("Discovered device", dev.addr)
        elif isNewData:
            print ("Received new data from", dev.addr)

scanner = Scanner().withDelegate(ScanDelegate())
devices = scanner.scan(10.0)

for dev in devices:
    print ("Device %s (%s), RSSI=%d dB" % (dev.addr, dev.addrType, dev.rssi))
    for (adtype, desc, value) in dev.getScanData():
        print ("  %s = %s" % (desc, value))
Où as-tu enregistré mon script ? Il a été conçu pour être intégré dans les événements Domoticz. Et comme je l'ai dis plus tôt, il provoque un freeze de Domoticz au bout d'un certain temps. Et je ne sais pas pourquoi.

Pour les devices : il faut créer des capteurs virtuels de type température+humidité et relever son id (numéro). Ensuite modifie les lignes de code en conséquence:

Code : Tout sélectionner

"a4:c1:38:95:C8:0D": {'device': 9}, 

Re: [Python] Capteur de température – humidité LCD Xiaomi BLUETOOTH

Publié : 24 juin 2021, 21:32
par kisskool
Pour le script de test je pense que j'ai un problème avec bluepy car j'ai toujours l'erreur.
J'ai enregistrer ton script dans domoticz/evenement et j'ai egalement une erreur dans les logs de domoticz

Code : Tout sélectionner

 2021-06-24 21:31:10.563 Error: EventSystem: Failed to execute python event script "xiaomi_blt"
2021-06-24 21:31:10.563 Error: EventSystem: Traceback (most recent call last):
2021-06-24 21:31:10.563 Error: EventSystem: File "<string>", line 69, in <module>
2021-06-24 21:31:10.563 Error: EventSystem: File "/usr/local/lib/python3.7/dist-packages/bluepy/btle.py", line 797, in start
2021-06-24 21:31:10.563 Error: EventSystem: self._mgmtCmd(self._cmd()+"end")
2021-06-24 21:31:10.563 Error: EventSystem: File "/usr/local/lib/python3.7/dist-packages/bluepy/btle.py", line 312, in _mgmtCmd
2021-06-24 21:31:10.563 Error: EventSystem: raise BTLEManagementError("Failed to execute management command '%s'" % (cmd), rsp)
2021-06-24 21:31:10.563 Error: EventSystem: bluepy.btle.BTLEManagementError: Failed to execute management command 'scanend' (code: 11, error: Rejected) 

Re: [Python] Capteur de température – humidité LCD Xiaomi BLUETOOTH

Publié : 24 juin 2021, 22:58
par cyril21
As tu installé bluepy selon les indications ici : https://github.com/IanHarvey/bluepy
Installation pour python3.
Lance de nouveau le script de test (avec sudo) :

Code : Tout sélectionner

 sudo python3 script.py 
Il faut aussi vérifier où a été installé la librairie. Et tu modifies si nécessaire la 2e ligne du code dans domoticz avec le bon path:

Code : Tout sélectionner

sys.path.append("/usr/local/lib/python3.7/dist-packages/")
Enfin, si rien ne marche, en regardant sur google, on voit que l'erreur peut être liée à un problème de droit. A creuser.

Re: [Python] Capteur de température – humidité LCD Xiaomi BLUETOOTH

Publié : 25 juin 2021, 00:57
par kisskool
Oui j'ai bien fait l'installation à partir de ce lien, bon la tout de suite j'ai tout pété, domoticz démarre plus :( j'avais cloner la VM avant heureusement...De toute façon j'avais tellement bricolé qu'il vaut mieux...
Je pense partir sur ce script "https://github.com/erdose/xiaomi-mi-lywsd03mmc" si le tiens plante, il a l'air simple

Re: [Python] Capteur de température – humidité LCD Xiaomi BLUETOOTH

Publié : 10 déc. 2021, 20:56
par ping
Si ça intéresse des gens, j'ai fait un plugin Domoticz pour cette sonde : https://github.com/ultrasuperpingu/DomoticzLYWSD03MMC


C'est une première version vite fait, je la mets en prod chez moi, je verrai bien ce que ça donne sur le long terme mais ça marche pas mal. J'ai supprimé la possibilité d'arrondir et de lisser, ça reviendra peut-être si le besoin se fait sentir mais ça m'a l'air inutile au premier abord.