66 lines
1.8 KiB
Python
Executable file
66 lines
1.8 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
|
|
import argparse
|
|
import json
|
|
import time
|
|
import sys
|
|
|
|
import requests
|
|
import paho.mqtt.client as mqtt
|
|
import yaml
|
|
|
|
from loguru import logger
|
|
|
|
|
|
class SpaceApiMqttAggregator:
|
|
|
|
STATE_NAME_MAP = {
|
|
None: 'unknown',
|
|
True: 'open',
|
|
False: 'closed',
|
|
}
|
|
|
|
STATE_NUM_MAP = {
|
|
None: -1,
|
|
True: 1,
|
|
False: 0,
|
|
}
|
|
|
|
def __init__(self, ns):
|
|
with open(ns.config, 'r') as f:
|
|
config = yaml.safe_load(f)
|
|
logger.remove(0)
|
|
logger.add(sys.stderr, level=config.get('log_level', 'WARNING'))
|
|
self.mqtt_host = config.get('mqtt_host', 'localhost')
|
|
self.mqtt_port = config.get('mqtt_port', 1883)
|
|
self.interval = config.get('interval', 300)
|
|
self.endpoints = config.get('endpoints', [])
|
|
while True:
|
|
self.update()
|
|
time.sleep(self.interval)
|
|
|
|
|
|
def update(self):
|
|
client = mqtt.Client()
|
|
client.connect(self.mqtt_host, self.mqtt_port, 60)
|
|
|
|
for i, e in enumerate(self.endpoints):
|
|
try:
|
|
j = requests.get(e).json()
|
|
space = j['space']
|
|
state = j['state'].get('open')
|
|
logger.info(f'{e}: Space {space} is {self.STATE_NAME_MAP[state]}')
|
|
client.publish(f'spaceapi/{space}/state', self.STATE_NAME_MAP[state])
|
|
client.publish(f'spaceapimap/{i}', self.STATE_NUM_MAP[state])
|
|
except:
|
|
logger.exception(f'An error occurred while updating "{e}"')
|
|
|
|
|
|
def main():
|
|
ap = argparse.ArgumentParser('spaceapi-mqtt-aggregator')
|
|
ap.add_argument('--config', default='config.yml', help='Path to the config file')
|
|
ns = ap.parse_args()
|
|
SpaceApiMqttAggregator(ns)
|
|
|
|
if __name__ == '__main__':
|
|
main()
|