From ce239876820699f02054e71b4fd0950509833379 Mon Sep 17 00:00:00 2001 From: Felix Richter Date: Tue, 5 Mar 2019 08:45:34 +0100 Subject: ampel: support tasmota firmware --- ampel/ampel.py | 63 ++++++++++++++++++++++++++++++++-------------------------- setup.py | 2 +- 2 files changed, 36 insertions(+), 29 deletions(-) diff --git a/ampel/ampel.py b/ampel/ampel.py index f67ffc9..5665f14 100755 --- a/ampel/ampel.py +++ b/ampel/ampel.py @@ -1,13 +1,14 @@ #! /usr/bin/env python3 #! nix-shell -i python3 -p python3 python35Packages.docopt python35Packages.paho-mqtt -""" usage: ampel [options] NUMLEDS +""" 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 -NUMLEDS is the number of leds to output data for (--add-empty does not count in here) +Ampel only works with sonoff tasmota custom firmware 13 22 24 26 28 |-----------|----|----|----| @@ -39,8 +40,18 @@ 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( @@ -56,11 +67,11 @@ def fetch_data(): def main(): args = docopt(__doc__) db = "telegraf" - numleds = int(args['NUMLEDS']) 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: @@ -68,7 +79,7 @@ def main(): mq = mqtt.Client() mq.connect(mqtt_server,1883,60) mq.loop_start() - pub = lambda topic,data: mq.publish(topic,data) + 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: @@ -108,33 +119,29 @@ def main(): 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("Bus too far away - {}".format(deltastr)) - ret = calc_chain(3,val) - ret.insert(0,[0,0,0]) - pub("/leds/nodemcu-switcher/set",json.dumps(ret)) - val += step % 1 + 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: - log.info("{}:{:02d} -> {}:{:02d} delta: {}".format( - now.hour,now.minute,t.hour,t.minute,deltastr)) - if (t-red) < now < t: - state = "red" - ret = [[255,0,0]] * 4 - elif (t-orange) < now < t: - state = "orange" - ret = [[255,128,0]] * 4 - elif (t-yellow) < now < t: - state = "yellow" - ret = [[255,255,0]] * 4 - elif (t-green) < now < t: - state = "green" - ret = [[0,255,0]] * 4 + 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: - state = "blue" - ret = [[0,0,255]] * 4 - if oldstate != state: - oldstate = state - pub("/leds/nodemcu-switcher/set",json.dumps(ret)) + pub(f"{topic}/Color",mapped[state]) sleep(1) if __name__ == "__main__": diff --git a/setup.py b/setup.py index 7d948a6..b91f853 100644 --- a/setup.py +++ b/setup.py @@ -4,7 +4,7 @@ import sys setup( name='ampel', - version='0.2.3', + version='0.3.0', description='uses the ampel', long_description=open("README.md").read(), -- cgit v1.2.3