spaceapi-mqtt-aggregator/spaceapi-mqtt-aggregator.py

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()