Improved logging mechanism (and a few minor goodies) (#54)
* Improved logging mechanism * Allow for suppression of any errors regarding failed device updates
This commit is contained in:
@@ -9,3 +9,6 @@ class BaseWorker:
|
||||
|
||||
def format_topic(self, *args):
|
||||
return '/'.join([self.topic_prefix, *args])
|
||||
|
||||
def __repr__(self):
|
||||
return self.__module__.split(".")[-1]
|
||||
|
||||
@@ -1,12 +1,15 @@
|
||||
import time
|
||||
from interruptingcow import timeout
|
||||
|
||||
from bluepy.btle import Scanner, DefaultDelegate
|
||||
from mqtt import MqttMessage
|
||||
from utils import booleanize
|
||||
|
||||
from workers.base import BaseWorker
|
||||
from logger import _LOGGER
|
||||
from utils import booleanize
|
||||
import logger
|
||||
|
||||
REQUIREMENTS = ['bluepy']
|
||||
_LOGGER = logger.get(__name__)
|
||||
|
||||
|
||||
|
||||
class ScanDelegate(DefaultDelegate):
|
||||
|
||||
@@ -15,7 +15,7 @@ class LinakdeskWorker(BaseWorker):
|
||||
return [MqttMessage(topic=self.format_topic('height/cm'), payload=self._get_height())]
|
||||
|
||||
def _get_height(self):
|
||||
with timeout(20):
|
||||
with timeout(20, exception=TimeoutError):
|
||||
self.desk.read_dpg_data()
|
||||
return self.desk.current_height_with_offset.cm
|
||||
|
||||
|
||||
+13
-5
@@ -1,29 +1,37 @@
|
||||
from interruptingcow import timeout
|
||||
import logging
|
||||
|
||||
from mqtt import MqttMessage
|
||||
|
||||
from workers.base import BaseWorker
|
||||
import logger
|
||||
|
||||
REQUIREMENTS = ['git+https://github.com/open-homeautomation/miflora.git@84f39432082796412d05b754c948499a1ad710e7#egg=miflora', 'bluepy']
|
||||
|
||||
monitoredAttrs = ["temperature", "moisture", "light", "conductivity", "battery"]
|
||||
_LOGGER = logger.get(__name__)
|
||||
|
||||
|
||||
class MifloraWorker(BaseWorker):
|
||||
def _setup(self):
|
||||
from miflora.miflora_poller import MiFloraPoller
|
||||
from btlewrap.bluepy import BluepyBackend
|
||||
|
||||
_LOGGER.info("Adding %d %s devices", len(self.devices), repr(self))
|
||||
for name, mac in self.devices.items():
|
||||
_LOGGER.debug("Adding %s device '%s' (%s)", repr(self), name, mac)
|
||||
self.devices[name] = MiFloraPoller(mac, BluepyBackend)
|
||||
|
||||
def status_update(self):
|
||||
from btlewrap.base import BluetoothBackendException
|
||||
_LOGGER.info("Updating %d %s devices", len(self.devices), repr(self))
|
||||
ret = []
|
||||
for name, poller in self.devices.items():
|
||||
_LOGGER.debug("Updating %s device '%s' (%s)", repr(self), name, poller._mac)
|
||||
try:
|
||||
ret += self.update_device_state(name, poller)
|
||||
except RuntimeError:
|
||||
pass
|
||||
except BluetoothBackendException as e:
|
||||
logger.log_exception(_LOGGER, "Error during update of %s device '%s' (%s): %s", repr(self), name, poller._mac, type(e).__name__, suppress=True)
|
||||
return ret
|
||||
|
||||
@timeout(8.0)
|
||||
def update_device_state(self, name, poller):
|
||||
ret = []
|
||||
poller.clear_cache()
|
||||
|
||||
+1
-1
@@ -21,7 +21,7 @@ class MiscaleWorker(BaseWorker):
|
||||
scanner = btle.Scanner().withDelegate(scan_processor)
|
||||
scanner.scan(5, passive=True)
|
||||
|
||||
with timeout(5):
|
||||
with timeout(5, exception=TimeoutError):
|
||||
while scan_processor.weight is None:
|
||||
time.sleep(1)
|
||||
return scan_processor.weight
|
||||
|
||||
@@ -1,31 +1,37 @@
|
||||
from interruptingcow import timeout
|
||||
import logging
|
||||
|
||||
from mqtt import MqttMessage
|
||||
|
||||
from workers.base import BaseWorker
|
||||
import logger
|
||||
|
||||
REQUIREMENTS = ['mithermometer==0.1.2']
|
||||
|
||||
monitoredAttrs = ["temperature", "humidity", "battery"]
|
||||
_LOGGER = logger.get(__name__)
|
||||
|
||||
|
||||
class MithermometerWorker(BaseWorker):
|
||||
def _setup(self):
|
||||
from mithermometer.mithermometer_poller import MiThermometerPoller
|
||||
from btlewrap.bluepy import BluepyBackend
|
||||
|
||||
|
||||
_LOGGER.info("Adding %d %s devices", len(self.devices), repr(self))
|
||||
for name, mac in self.devices.items():
|
||||
_LOGGER.debug("Adding %s device '%s' (%s)", repr(self), name, mac)
|
||||
self.devices[name] = MiThermometerPoller(mac, BluepyBackend)
|
||||
|
||||
def status_update(self):
|
||||
from btlewrap.base import BluetoothBackendException
|
||||
_LOGGER.info("Updating %d %s devices", len(self.devices), repr(self))
|
||||
ret = []
|
||||
for name, poller in self.devices.items():
|
||||
_LOGGER.debug("Updating %s device '%s' (%s)", repr(self), name, poller._mac)
|
||||
try:
|
||||
ret += self.update_device_state(name, poller)
|
||||
except RuntimeError:
|
||||
pass
|
||||
|
||||
except BluetoothBackendException as e:
|
||||
logger.log_exception(_LOGGER, "Error during update of %s device '%s' (%s): %s", repr(self), name, poller._mac, type(e).__name__, suppress=True)
|
||||
return ret
|
||||
|
||||
@timeout(8.0)
|
||||
def update_device_state(self, name, poller):
|
||||
ret = []
|
||||
poller.clear_cache()
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
from mqtt import MqttMessage
|
||||
from workers.base import BaseWorker
|
||||
from logger import _LOGGER
|
||||
import serial
|
||||
from mqtt import MqttMessage
|
||||
|
||||
from workers.base import BaseWorker
|
||||
import logger
|
||||
|
||||
REQUIREMENTS = ['pyserial']
|
||||
_LOGGER = logger.get(__name__)
|
||||
|
||||
|
||||
class MysensorsWorker(BaseWorker):
|
||||
|
||||
+24
-8
@@ -1,12 +1,14 @@
|
||||
from builtins import staticmethod
|
||||
import logging
|
||||
|
||||
from interruptingcow import timeout
|
||||
from mqtt import MqttMessage
|
||||
|
||||
from workers.base import BaseWorker
|
||||
import logger
|
||||
|
||||
REQUIREMENTS = ['python-eq3bt']
|
||||
|
||||
monitoredAttrs = ["low_battery", "valve_state", "target_temperature", "window_open", "locked"]
|
||||
_LOGGER = logger.get(__name__)
|
||||
|
||||
STATE_AWAY = 'away'
|
||||
STATE_ECO = 'eco'
|
||||
@@ -15,6 +17,7 @@ STATE_MANUAL = 'manual'
|
||||
STATE_ON = 'on'
|
||||
STATE_OFF = 'off'
|
||||
|
||||
|
||||
class ThermostatWorker(BaseWorker):
|
||||
class ModesMapper():
|
||||
def __init__(self):
|
||||
@@ -57,7 +60,9 @@ class ThermostatWorker(BaseWorker):
|
||||
def _setup(self):
|
||||
from eq3bt import Thermostat
|
||||
|
||||
_LOGGER.info("Adding %d %s devices", len(self.devices), repr(self))
|
||||
for name, mac in self.devices.items():
|
||||
_LOGGER.debug("Adding %s device '%s' (%s)", repr(self), name, mac)
|
||||
self.devices[name] = Thermostat(mac)
|
||||
|
||||
self._modes_mapper = self.ModesMapper()
|
||||
@@ -66,15 +71,17 @@ class ThermostatWorker(BaseWorker):
|
||||
from bluepy import btle
|
||||
|
||||
ret = []
|
||||
_LOGGER.info("Updating %d %s devices", len(self.devices), repr(self))
|
||||
for name, thermostat in self.devices.items():
|
||||
_LOGGER.debug("Updating %s device '%s' (%s)", repr(self), name, thermostat._conn._mac)
|
||||
try:
|
||||
ret += self.update_device_state(name, thermostat)
|
||||
except (RuntimeError, btle.BTLEException):
|
||||
pass
|
||||
|
||||
except btle.BTLEException as e:
|
||||
logger.log_exception(_LOGGER, "Error during update of %s device '%s' (%s): %s", repr(self), name, thermostat._conn._mac, type(e).__name__, suppress=True)
|
||||
return ret
|
||||
|
||||
def on_command(self, topic, value):
|
||||
from bluepy import btle
|
||||
_, device_name, method, _ = topic.split('/')
|
||||
|
||||
thermostat = self.devices[device_name]
|
||||
@@ -91,10 +98,19 @@ class ThermostatWorker(BaseWorker):
|
||||
elif method == "target_temperature":
|
||||
value = float(value)
|
||||
|
||||
setattr(thermostat, method, value)
|
||||
return self.update_device_state(device_name, thermostat)
|
||||
_LOGGER.info("Setting %s to %s on %s device '%s' (%s)", method, value, repr(self), device_name, thermostat._conn._mac)
|
||||
try:
|
||||
setattr(thermostat, method, value)
|
||||
except btle.BTLEException as e:
|
||||
logger.log_exception(_LOGGER, "Error setting %s to %s on %s device '%s' (%s): %s", method, value, repr(self), device_name, thermostat._conn._mac, type(e).__name__)
|
||||
return []
|
||||
|
||||
try:
|
||||
return self.update_device_state(device_name, thermostat)
|
||||
except btle.BTLEException as e:
|
||||
logger.log_exception(_LOGGER, "Error during update of %s device '%s' (%s): %s", repr(self), device_name, thermostat._conn._mac, type(e).__name__, suppress=True)
|
||||
return []
|
||||
|
||||
@timeout(8.0)
|
||||
def update_device_state(self, name, thermostat):
|
||||
thermostat.update()
|
||||
|
||||
|
||||
@@ -1,11 +1,14 @@
|
||||
import time
|
||||
from interruptingcow import timeout
|
||||
|
||||
from bluepy.btle import Scanner, DefaultDelegate
|
||||
from mqtt import MqttMessage
|
||||
|
||||
from workers.base import BaseWorker
|
||||
from logger import _LOGGER
|
||||
import logger
|
||||
|
||||
REQUIREMENTS = ['bluepy']
|
||||
_LOGGER = logger.get(__name__)
|
||||
|
||||
|
||||
class ScanDelegate(DefaultDelegate):
|
||||
def __init__(self):
|
||||
|
||||
Reference in New Issue
Block a user