Skip to content
This repository has been archived by the owner on Oct 26, 2023. It is now read-only.

Commit

Permalink
add passive read for lywsd03mmc with custom firmware (#201)
Browse files Browse the repository at this point in the history
* add passive read for lywsd03mmc with custom firmware

* config example

* Update config.yaml.example
  • Loading branch information
lwestenberg authored Dec 29, 2020
1 parent f611ee8 commit 7002278
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 12 deletions.
1 change: 1 addition & 0 deletions config.yaml.example
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,7 @@ manager:
bathroom: 00:11:22:33:44:55
topic_prefix: mijasensor_gen2
update_interval: 120
passive: false # Only for sensors running custom firmware and advertising type custom.
lywsd03mmc_homeassistant:
args:
devices:
Expand Down
55 changes: 43 additions & 12 deletions workers/lywsd03mmc.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,34 @@

REQUIREMENTS = ["bluepy"]


class Lywsd03MmcWorker(BaseWorker):
def _setup(self):
_LOGGER.info("Adding %d %s devices", len(self.devices), repr(self))

for name, mac in self.devices.items():
_LOGGER.info("Adding %s device '%s' (%s)", repr(self), name, mac)
self.devices[name] = lywsd03mmc(mac, timeout=self.command_timeout)
self.devices[name] = lywsd03mmc(mac, timeout=self.command_timeout, passive=self.passive)

def find_device(self, mac):
for name, device in self.devices.items():
if device.mac == mac:
return device
return

def status_update(self):
from bluepy import btle

if self.passive:
scanner = btle.Scanner()
results = scanner.scan(10.0, passive=True)

for res in results:
device = self.find_device(res.addr)
if device:
for (adtype, desc, value) in res.getScanData():
if ("1a18" in value):
device.processScanValue(value)

for name, lywsd03mmc in self.devices.items():
try:
ret = lywsd03mmc.readAll()
Expand All @@ -33,9 +50,9 @@ def status_update(self):


class lywsd03mmc:

def __init__(self, mac, timeout=30):
def __init__(self, mac, timeout=30, passive=False):
self.mac = mac
self.passive = passive
self.timeout = timeout

self._temperature = None
Expand All @@ -54,19 +71,24 @@ def connected(self):
yield device

def readAll(self):
with self.connected() as device:
self.getData(device)
if self.passive:
temperature = self.getTemperature()
humidity = self.getHumidity()
battery = self.getBattery()
else:
with self.connected() as device:
self.getData(device)
temperature = self.getTemperature()
humidity = self.getHumidity()
battery = self.getBattery()

_LOGGER.debug("successfully read %f, %d, %d", temperature, humidity, battery)
_LOGGER.debug("successfully read %f, %d, %d", temperature, humidity, battery)

return {
"temperature": temperature,
"humidity": humidity,
"battery": battery,
}
return {
"temperature": temperature,
"humidity": humidity,
"battery": battery,
}

def getData(self, device):
self.subscribe(device)
Expand All @@ -87,6 +109,15 @@ def getBattery(self):
def subscribe(self, device):
device.setDelegate(self)

def processScanValue(self, data):
temperature = int(data[16:20], 16) / 10
humidity = int(data[20:22], 16)
battery = int(data[22:24], 16)

self._temperature = round(temperature, 1)
self._humidity = round(humidity)
self._battery = round(battery, 4)

def handleNotification(self, handle, data):
temperature = int.from_bytes(data[0:2], byteorder='little', signed=True) / 100
humidity = int.from_bytes(data[2:3], byteorder='little')
Expand Down

0 comments on commit 7002278

Please sign in to comment.