#! /usr/bin/env python3 #! nix-shell -i python3 -p python3 python35Packages.docopt python35Packages.paho-mqtt """ usage: ampel [options] --topic=TOPIC topic to publish to [Default: /bam/buslicht/cmnd] --mqtt-server=HOST path to mqtt server [Default: 192.168.8.11] --influx-server=HOST path to influxdb server [Default: 192.168.8.11] --no-mqtt disable mqtt connections for debugging --no-influx disable sending stats to influxdb Ampel only works with sonoff tasmota custom firmware 13 22 24 26 28 |-----------|----|----|----| BLUE GR YEL RED BLUE EEN LOW """ from docopt import docopt from influxdb import InfluxDBClient from ampel.fade import calc_chain from datetime import datetime as dt from ampel.vvs_efa import VVS_EFA import time from time import sleep import json import sys from datetime import datetime, timedelta import requests import logging as log log.basicConfig(level=log.INFO) import paho.mqtt.client as mqtt thalesplatz = "5003035" ditzingen = "5007000" red = timedelta(minutes=2) orange = timedelta(minutes=3) yellow = timedelta(minutes=4) green = timedelta(minutes=6) maxtime = timedelta(minutes=15) mapped = { "red" : "#FF000", "orange" : "#FF8800", "yellow" : "#FFFF00", "green" : "#00FF00", "blue" : "#0000FF", "too_far" : 2 # cycle } def fetch_data(): log.info("fetching data") efa = VVS_EFA.EFA() now = dt.now() conns = efa.get_next_connections( "Ditzingen Thalesplatz", "Hauptbahnhof (tief)", now, True) for dep in conns: if now < dep.time_of_departure: return dep.time_of_departure def main(): args = docopt(__doc__) db = "telegraf" mqtt_server = args["--mqtt-server"] influx_server = args["--influx-server"] no_mqtt = args["--no-mqtt"] no_influx = args["--no-influx"] topic = args["--topic"] t = fetch_data() if not no_mqtt: log.info("Starting MQTT") mq = mqtt.Client() mq.connect(mqtt_server,1883,60) mq.loop_start() pub = lambda topic,data: mq.publish(topic,data,qos=1,retain=True) else: pub = lambda topic,data: log.info("topic: {}\ndata: {}".format(topic,data)) if not no_influx: log.info("preparing influxdb") client = InfluxDBClient(host=influx_server, port=8086, database=db) msg = { "measurement": "seconds_to_bus", "tags": { "": "thalesplatz" }, "time": "2009-11-10T23:00:00Z", "fields": { "value": 0.64 } } sendstat = lambda secs: client.write_points([ { "measurement": "seconds_to_bus", "tags": { "station": "thalesplatz" }, "fields": { "value": secs } }]) else: log.info("No influx") sendstat = lambda secs: log.info("stat {} -> {} secs".format(datetime.now().replace(microsecond=0).isoformat(),secs)) val = 0.0 step = 0.01 oldstate = state = None while True: ret = [] now = datetime.now() if now > t: t = fetch_data() delta = t - now sendstat(delta.seconds + delta.days*86400) deltastr = str(delta).split('.', 2)[0] log.info("{}:{:02d} -> {}:{:02d} delta: {}".format( now.hour,now.minute,t.hour,t.minute,deltastr)) if not ( (t - maxtime) < now < t): log.info(f"Bus too far away - {deltastr}") state = "too_far" ret = "" elif (t-red) < now < t: state = "red" elif (t-orange) < now < t: state = "orange" elif (t-yellow) < now < t: state = "yellow" elif (t-green) < now < t: state = "green" else: state = "blue" log.info(f"State: {state}, old state: {oldstate}") if oldstate != state: oldstate = state if state == "too_far": pub(f"{topic}/Scheme",mapped[state]) else: pub(f"{topic}/Color",mapped[state]) sleep(1) if __name__ == "__main__": main()