Bonjour, @Kaktusatomik,
Je reviens vers toi sur le sujet du programmateur d’arrosage Jardibric BLP-NR avec le plugin BLEA.
De mon coté je n’ai pas encore trouvé une solution pour avoir la remontée de l’état et le niveau de batterie du programmateur.
(je ne connais pas bien le programme et suis novice pour ce type de programmation)
As-tu eu pu revoir de ton coté ?
Éventuellement, si tu n’as pas eu le temps, peux tu m’aiguiller juste sur la partie du code à regarder pour les remontées d’infos vers jeedom stp ? Je pourrais continuer un peu.
Je te remercie pour ton aide
Cordialement
PS : peut être le même souscis que pour la remontée d’infos des milflora ?
Salut,
Désolé je n’ai pas eu le temps de creuser le problème.
Voici le fichier : plugins/blea/resources/blead/devices/blpnr.py
C’est le système de notification et de souscription qui pose problème. Il faudrait refaire des captures de trame bluetooth entre l’appli et le blpnr mais je manque cruellement de temps.
Je pense que la partie decodage de la fonction handlenotification est bonne.
Bonjour, @Kaktusatomik,
Je déterre ce sujet, je n’ai pas eu le temps de me pencher sur la question, mais maintenant que le confinement nous oblige a rester chez soi, je vais pouvoir m’occuper ;). Je te sollicite pour savoir quel logiciel et dongle tu as utilisé pour scanner/capter les trames bluetooth entre l’appli et le blpnr stp ?
Je te remercie.
PS : Je ferais un retour dès que j’aurai un peu avancé
Cordialement,
Je suis également à la recherche d’une solution pour avoir la remontée de l’état de la batterie, si un membre a réussi ce tour de force, je suis preneur…
En attendant si vous voulez tester, il faut remplacer le fichier blpnr.py dans plugins/blea/resources/blead/devices/
Par celui ci et redémarrer le démon.
from bluepy import btle
import logging
import globals
import utils
from multiconnect import Connector
from notification import Notification
class Blpnr():
def __init__(self):
self.name = 'blpnr'
self.ignoreRepeat = False
def isvalid(self,name,manuf='',data='',mac=''):
if name.lower().startswith('blnr') or name.lower() in [self.name]:
return True
def parse(self,data,mac,name,manuf):
logging.debug('PARSE BLPNR')
action={}
action['present'] = 1
if mac not in globals.LAST_STORAGE:
logging.debug('MODE IS ? READ BLPNR')
globals.LAST_STORAGE[mac]={}
self.getStatus(mac)
return action
def action(self,message):
logging.debug('ACTION BLPNR')
mac = message['device']['id']
logging.debug('MAC BLPNR '+mac)
action = message['command']['action']
if mac not in globals.LAST_STORAGE:
globals.LAST_STORAGE[mac]={}
logging.debug('action BLPNR '+action)
handle = '0X0011'
conn = Connector(mac)
conn.connect(type='random')
if not conn.isconnected:
conn.connect(type='random')
if not conn.isconnected:
return
logging.debug('connected BLPNR')
if action == 'refresh':
logging.debug('refresh BLPNR')
self.getStatus(mac)
return
if action == 'off':
message = '050400900000009900'
if action == 'on':
value = message['command']['value']
logging.debug('value BLPNR ' + str(value))
liste = [5,4,0,10,0,int(value),0]
checksum1 = sum(liste)%256
checksum2 = sum(liste)/256
liste.append(checksum1)
liste.append(int(checksum2))
message = utils.tuple_to_hex(liste)
conn.writeCharacteristic(handle,message)
conn.disconnect()
self.getStatus(mac)
def getStatus(self,mac):
logging.debug('STATUS BLPNR')
try:
conn = Connector(mac)
if not conn.isconnected:
conn.connect(type='random')
if not conn.isconnected:
return
conn.writeCharacteristic('0x000f','2902')
conn.disconnect()
except Exception as e:
logging.error(str(e))
try:
conn = Connector(mac)
if not conn.isconnected:
conn.connect(type='random')
if not conn.isconnected:
return
logging.debug('READ notif BLPNR')
notification = Notification(conn,Blpnr)
conn.writeCharacteristic('0x0011','0d00000d00',response=True)
notification.subscribe(10)
except Exception as e:
logging.error(str(e))
def read(self,mac):
logging.debug('READ BLPNR')
if mac not in globals.LAST_STORAGE:
logging.debug('MODE IS ? READ BLPNR')
globals.LAST_STORAGE[mac]={}
self.getStatus(mac)
elif mac in globals.LAST_STORAGE and globals.LAST_STORAGE[mac][0] == 1:
logging.debug('MODE IS ON READ BLPNR')
self.getStatus(mac)
else:
logging.debug('MODE IS OFF DONT READ BLPNR')
def handlenotification(self,conn,handle,data={},action={}):
logging.debug('NOTIFI BLPNR ')
conn.disconnect()
result={}
result['id'] = conn.mac
logging.debug('BLPNR id : '+result['id'])
size = len(data)
logging.debug('BLPNR data : '+str(size))
result['source'] = globals.daemonname
logging.debug('BLPNR source : '+result['source'])
if (size <= 6):
result['mode'] = 'False'
else:
result['temps'] = int(data[6])
logging.debug('BLPNR temps : '+str(result['temps']))
tension = int(data[7])
logging.debug('BLPNR tension : '+str(tension))
battery = 0
if tension >= 80:
battery = 5
elif tension >= 75:
battery = 4
elif tension >= 70:
battery = 3
elif tension >= 65:
battery = 2
elif tension >= 60:
battery = 1
result['battery'] = battery * 20
logging.debug('BLPNR battery : '+str(result['battery']))
result['mode'] = str(data[4] > 0)
logging.debug('BLPNR mode : '+result['mode'])
globals.LAST_STORAGE[conn.mac][0] = 1
if result['mode'] == 'False':
result['temps'] = '0'
logging.debug('BLPNR temps : '+result['temps'])
logging.debug('BLPNR mode : '+result['mode'])
globals.LAST_STORAGE[conn.mac][0] = 0
globals.JEEDOM_COM.add_changes('devices::'+conn.mac,result)
globals.COMPATIBILITY.append(Blpnr)
Salut @kaktusatomik,
Désolé de ma réponse tardive, j’ai pris le temps de tester sur quelques jours ton nouveau script
En ce qui me concerne : Impec ! pour moi les remontées d’infos se font parfaitement
l’état de batterie : OK conforme (pile qui est neuve) et même retour que sur l’appli
temps de marche : OK * (voir commentaire en bas)
Mode en cours : OK * (voir commentaire en bas)
(quelques screenshot ci dessous pour preuve)
Super boulot de mise à jour et un grand merci encore pour ton implication !!!
(J’ai vu tes modifs je suis trop novice en programmation python, j’aurai mis un temps pas possible pour faire ça tout seul ! ;))
Commentaire général :
concernant le retour d’état : chez moi l’option de jeedom « refresh forcé » est activée par défaut à l’inclusion du BLP…pratique pour avoir des remontées régulières et précises mais attention le BLP est alors très gourmand en pile)
Pour ma part , j’ai désactiver l’option « refresh forcé » et procède à un refresh de l’état des batteries et du mode en cours via un scénario => permet d’économiser considérablement les piles lorsque celui ci n’est pas en fonctionnement. Sinon consommation de pile tous les mois assurée et c’est pas bon pour la planète !**
Salut,
Merci pour ton retour.
En ce qui concerne le refresh forcé, je fais en sorte de n’interroger le blp que si il a été mis en mode arrosage depuis jeedom . Donc normalement ça ne devrait pas réduire la durée de vie de la pile.
Tu peux le voir dans les logos en debug. Avec un log du genre BLP is off do not read.