#!/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()