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
+2 -1
View File
@@ -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
View File
@@ -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')
+2
View File
@@ -1,2 +1,4 @@
paho-mqtt
pyyaml
interruptingcow
apscheduler
+3 -3
View File
@@ -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)
+1 -1
View File
@@ -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
View File
@@ -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