feat: initial commit, first tests
This commit is contained in:
commit
d4387f6a2e
3 changed files with 78 additions and 0 deletions
8
config.yml
Normal file
8
config.yml
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
---
|
||||||
|
|
||||||
|
log_level: INFO
|
||||||
|
mqtt_host: mqtt.lan.kabelsalat.ch
|
||||||
|
endpoints:
|
||||||
|
- "https://fixme.ch/cgi-bin/spaceapi.py"
|
||||||
|
- "https://spaceapi.kabelsalat.ch/"
|
||||||
|
- "https://status.crdmp.ch/"
|
4
requirements.txt
Normal file
4
requirements.txt
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
loguru
|
||||||
|
paho-mqtt
|
||||||
|
requests
|
||||||
|
PyYAML
|
66
spaceapi-mqtt-aggregator.py
Executable file
66
spaceapi-mqtt-aggregator.py
Executable file
|
@ -0,0 +1,66 @@
|
||||||
|
#!/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()
|
Loading…
Reference in a new issue