Add xiaomi scale + dynamic requirements support

This commit is contained in:
zewelor
2017-11-23 22:02:41 +01:00
parent 23dc19e955
commit 3195ad1f20
5 changed files with 88 additions and 31 deletions
+50
View File
@@ -0,0 +1,50 @@
import time
REQUIREMENTS = ['bluepy', 'interruptingcow']
class MiscaleWorker():
def __init__(self, mac):
self._mac = mac
def status_update(self):
return [{
'topic': 'weight/kg',
'payload': self._get_weight(),
}]
def _get_weight(self):
from bluepy import btle
from interruptingcow import timeout
scan_processor = ScanProcessor(self._mac)
scanner = btle.Scanner().withDelegate(scan_processor)
scanner.scan(5, passive=True)
with timeout(5):
while scan_processor.weight is None:
time.sleep(1)
return scan_processor.weight
return -1
class ScanProcessor():
def __init__(self, mac):
self._mac = mac
self._weight = None
def handleDiscovery(self, dev, isNewDev, _):
if dev.addr == self.mac.lower() and isNewDev:
for (sdid, desc, data) in dev.getScanData():
if data.startswith('1d18') and sdid == 22:
measured = int((data[8:10] + data[6:8]), 16) * 0.01
self._weight = round(measured / 2, 2)
@property
def mac(self):
return self._mac
@property
def weight(self):
return self._weight
+14 -17
View File
@@ -1,22 +1,23 @@
from eq3bt import Thermostat, Mode
haModesMapping = {
Mode.Closed: 'off',
Mode.Open: 'on',
Mode.Auto: 'auto',
Mode.Manual: 'manual',
Mode.Away: 'away',
Mode.Boost: 'boost',
}
REQUIREMENTS = ['python-eq3bt']
monitoredAttrs = ["low_battery", "valve_state", "target_temperature"]
class ThermostatWorker:
def __init__(self, devices=None, topic_prefix=None):
def __init__(self, devices=None):
self._devices = devices
self._topic_prefix = topic_prefix
def status_update(self):
from eq3bt import Thermostat, Mode
haModesMapping = {
Mode.Closed: 'off',
Mode.Open: 'on',
Mode.Auto: 'auto',
Mode.Manual: 'manual',
Mode.Away: 'away',
Mode.Boost: 'boost',
}
ret = []
for name, mac in self.devices.items():
thermostat = Thermostat(mac)
@@ -44,9 +45,5 @@ class ThermostatWorker:
def devices(self):
return self._devices
@property
def topic_prefix(self):
return self._topic_prefix
def format_topic(self, device, attr):
return '/'.join([self.topic_prefix, device, attr])
return '/'.join([device, attr])