Add basic cron support
This commit is contained in:
@@ -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
@@ -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')
|
||||||
|
|||||||
@@ -1,2 +1,4 @@
|
|||||||
paho-mqtt
|
paho-mqtt
|
||||||
pyyaml
|
pyyaml
|
||||||
|
interruptingcow
|
||||||
|
apscheduler
|
||||||
|
|||||||
+2
-2
@@ -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)
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user