Add basic cron support
This commit is contained in:
+2
-1
@@ -7,4 +7,5 @@ workers:
|
||||
args:
|
||||
devices:
|
||||
bedroom: 00:11:22:33:44:55
|
||||
topic_prefix: thermostats
|
||||
topic_prefix: thermostats
|
||||
update_interval: 60
|
||||
|
||||
+21
-3
@@ -1,9 +1,27 @@
|
||||
from queue import Queue
|
||||
|
||||
from apscheduler.schedulers.background import BackgroundScheduler
|
||||
|
||||
from config import settings
|
||||
from mqtt import MqttClient
|
||||
from workers_manager import WorkersManager
|
||||
|
||||
queue = Queue()
|
||||
scheduler = BackgroundScheduler()
|
||||
mqtt = MqttClient(settings['mqtt'])
|
||||
|
||||
manager = WorkersManager(settings['workers'])
|
||||
for worker_name in manager.workers.keys():
|
||||
mqtt.publish(manager.update(worker_name))
|
||||
|
||||
for worker_name, interval in manager.interval_enabled_workers.items():
|
||||
queue.put([worker_name])
|
||||
scheduler.add_job(lambda x: queue.put([x]), 'interval', seconds=interval, args=[worker_name])
|
||||
|
||||
scheduler.start()
|
||||
|
||||
while True:
|
||||
for worker_name in queue.get(block=True):
|
||||
try:
|
||||
mqtt.publish(manager.update(worker_name))
|
||||
except (KeyboardInterrupt, SystemExit):
|
||||
raise
|
||||
except:
|
||||
print('Some error')
|
||||
|
||||
@@ -1,2 +1,4 @@
|
||||
paho-mqtt
|
||||
pyyaml
|
||||
interruptingcow
|
||||
apscheduler
|
||||
|
||||
+3
-3
@@ -1,8 +1,9 @@
|
||||
import time
|
||||
from interruptingcow import timeout
|
||||
|
||||
from mqtt import MqttMessage
|
||||
|
||||
REQUIREMENTS = ['bluepy', 'interruptingcow']
|
||||
REQUIREMENTS = ['bluepy']
|
||||
|
||||
# Bluepy might need special settings
|
||||
# sudo setcap 'cap_net_raw,cap_net_admin+eip' /usr/local/lib/python3.6/dist-packages/bluepy/bluepy-helper
|
||||
@@ -12,11 +13,10 @@ class MiscaleWorker():
|
||||
self._mac = mac
|
||||
|
||||
def status_update(self):
|
||||
return [MqttMessage(topic='weight/kg', payload= self._get_weight())]
|
||||
return [MqttMessage(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)
|
||||
|
||||
@@ -5,7 +5,7 @@ REQUIREMENTS = ['python-eq3bt']
|
||||
monitoredAttrs = ["low_battery", "valve_state", "target_temperature"]
|
||||
|
||||
class ThermostatWorker:
|
||||
def __init__(self, devices=None):
|
||||
def __init__(self, devices):
|
||||
self._devices = devices
|
||||
|
||||
def status_update(self):
|
||||
|
||||
+16
-3
@@ -1,15 +1,19 @@
|
||||
import importlib
|
||||
import pip
|
||||
from interruptingcow import timeout
|
||||
|
||||
class WorkersManager:
|
||||
def __init__(self, config):
|
||||
self._config = config
|
||||
self._interval_enabled_workers = {}
|
||||
self._workers = self._register_klasses()
|
||||
|
||||
def update(self, worker_name):
|
||||
messages = self.workers[worker_name].status_update()
|
||||
for message in messages:
|
||||
message.topic = '/'.join([self._config[worker_name]['topic_prefix'], message.topic])
|
||||
messages = []
|
||||
with timeout(30):
|
||||
messages = self.workers[worker_name].status_update()
|
||||
for message in messages:
|
||||
message.topic = '/'.join([self._config[worker_name]['topic_prefix'], message.topic])
|
||||
|
||||
return messages
|
||||
|
||||
@@ -17,14 +21,23 @@ class WorkersManager:
|
||||
def workers(self):
|
||||
return self._workers
|
||||
|
||||
@property
|
||||
def interval_enabled_workers(self):
|
||||
return self._interval_enabled_workers
|
||||
|
||||
def _register_klasses(self):
|
||||
arr = {}
|
||||
|
||||
for worker_klass in self._config.keys():
|
||||
moduleObj = importlib.import_module("workers.%s" % worker_klass)
|
||||
klass = getattr(moduleObj, "%sWorker" % worker_klass.title())
|
||||
|
||||
if moduleObj.REQUIREMENTS is not None:
|
||||
self._pip_install_helper(moduleObj.REQUIREMENTS)
|
||||
|
||||
if self._config[worker_klass]['update_interval'] is not None:
|
||||
self._interval_enabled_workers[worker_klass] = self._config[worker_klass]['update_interval']
|
||||
|
||||
arr[worker_klass] = klass(**self._args_for(worker_klass))
|
||||
|
||||
return arr
|
||||
|
||||
Reference in New Issue
Block a user