Add basic cron support

This commit is contained in:
zewelor
2017-11-24 07:30:42 +01:00
parent 0f9af9fccf
commit d463345707
6 changed files with 45 additions and 11 deletions
+1
View File
@@ -8,3 +8,4 @@ workers:
devices: devices:
bedroom: 00:11:22:33:44:55 bedroom: 00:11:22:33:44:55
topic_prefix: thermostats topic_prefix: thermostats
update_interval: 60
+20 -2
View File
@@ -1,9 +1,27 @@
from queue import Queue
from apscheduler.schedulers.background import BackgroundScheduler
from config import settings from config import settings
from mqtt import MqttClient from mqtt import MqttClient
from workers_manager import WorkersManager from workers_manager import WorkersManager
queue = Queue()
scheduler = BackgroundScheduler()
mqtt = MqttClient(settings['mqtt']) mqtt = MqttClient(settings['mqtt'])
manager = WorkersManager(settings['workers']) manager = WorkersManager(settings['workers'])
for worker_name in manager.workers.keys():
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)) mqtt.publish(manager.update(worker_name))
except (KeyboardInterrupt, SystemExit):
raise
except:
print('Some error')
+2
View File
@@ -1,2 +1,4 @@
paho-mqtt paho-mqtt
pyyaml pyyaml
interruptingcow
apscheduler
+2 -2
View File
@@ -1,8 +1,9 @@
import time import time
from interruptingcow import timeout
from mqtt import MqttMessage from mqtt import MqttMessage
REQUIREMENTS = ['bluepy', 'interruptingcow'] REQUIREMENTS = ['bluepy']
# Bluepy might need special settings # Bluepy might need special settings
# sudo setcap 'cap_net_raw,cap_net_admin+eip' /usr/local/lib/python3.6/dist-packages/bluepy/bluepy-helper # sudo setcap 'cap_net_raw,cap_net_admin+eip' /usr/local/lib/python3.6/dist-packages/bluepy/bluepy-helper
@@ -16,7 +17,6 @@ class MiscaleWorker():
def _get_weight(self): def _get_weight(self):
from bluepy import btle from bluepy import btle
from interruptingcow import timeout
scan_processor = ScanProcessor(self._mac) scan_processor = ScanProcessor(self._mac)
scanner = btle.Scanner().withDelegate(scan_processor) scanner = btle.Scanner().withDelegate(scan_processor)
+1 -1
View File
@@ -5,7 +5,7 @@ REQUIREMENTS = ['python-eq3bt']
monitoredAttrs = ["low_battery", "valve_state", "target_temperature"] monitoredAttrs = ["low_battery", "valve_state", "target_temperature"]
class ThermostatWorker: class ThermostatWorker:
def __init__(self, devices=None): def __init__(self, devices):
self._devices = devices self._devices = devices
def status_update(self): def status_update(self):
+13
View File
@@ -1,12 +1,16 @@
import importlib import importlib
import pip import pip
from interruptingcow import timeout
class WorkersManager: class WorkersManager:
def __init__(self, config): def __init__(self, config):
self._config = config self._config = config
self._interval_enabled_workers = {}
self._workers = self._register_klasses() self._workers = self._register_klasses()
def update(self, worker_name): def update(self, worker_name):
messages = []
with timeout(30):
messages = self.workers[worker_name].status_update() messages = self.workers[worker_name].status_update()
for message in messages: for message in messages:
message.topic = '/'.join([self._config[worker_name]['topic_prefix'], message.topic]) message.topic = '/'.join([self._config[worker_name]['topic_prefix'], message.topic])
@@ -17,14 +21,23 @@ class WorkersManager:
def workers(self): def workers(self):
return self._workers return self._workers
@property
def interval_enabled_workers(self):
return self._interval_enabled_workers
def _register_klasses(self): def _register_klasses(self):
arr = {} arr = {}
for worker_klass in self._config.keys(): for worker_klass in self._config.keys():
moduleObj = importlib.import_module("workers.%s" % worker_klass) moduleObj = importlib.import_module("workers.%s" % worker_klass)
klass = getattr(moduleObj, "%sWorker" % worker_klass.title()) klass = getattr(moduleObj, "%sWorker" % worker_klass.title())
if moduleObj.REQUIREMENTS is not None: if moduleObj.REQUIREMENTS is not None:
self._pip_install_helper(moduleObj.REQUIREMENTS) 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)) arr[worker_klass] = klass(**self._args_for(worker_klass))
return arr return arr