import argparse import datetime import json import time from tempfile import NamedTemporaryFile import logging import requests import schedule logging.basicConfig(format='%(levelname)s %(name)s:%(message)s', level=logging.DEBUG) log = logging.getLogger(__name__) def parse_time(string): return datetime.datetime.strptime(string, "%Y-%m-%d %H:%M:%S") def get_status(): status = requests.get("https://isfswiaiopen.wiai.de?json").json() status["timestamp"] = parse_time(status['timestamp']) return status def get_status_text(src=get_status): if get_status()["doorstate"]: text = "fs WIAI is open :)" else: text = "fs WIAI is closed :(" return text def post(chats, text, token): url = "https://api.telegram.org/bot{token}/sendMessage".format(token=token) for chat in chats: response = requests.post(url, data={'chat_id': chats[chat], "text": text}) log.info("post message: %s", response.status_code) def main(args={"config": "settings.json"}): log.info("run once") config = json.load(open(args['config'])) text = get_status_text() post(config['groups'], text, config['token']) post_plot(config) def loop(args={"config": "settings.json"}): log.info("prepare loop") config = json.load(open(args['config'])) setup(config) while True: try: do_loop(config) except Exception as e: log.exception(e) time.sleep(config['sleep']) def do_loop(config): last_state = None while True: log.info("enter loop") changed = False new_state = get_status() if last_state is None: changed = True elif not last_state["doorstate"] == new_state["doorstate"]: changed = True if changed: last_state = new_state text = get_status_text(lambda: last_state) post(config["groups"], text, config["token"]) log.info("run pending tasks") schedule.run_pending() log.info("sleep") time.sleep(config['sleep']) def post_plot(config): from plot import get_plot with NamedTemporaryFile() as target: image_url = 'https://api.telegram.org/bot{token}/sendPhoto'.format(token=config['token']) files = {'photo': get_plot(target)} for chat in config['groups']: files['photo'].seek(0) values = {"chat_id":config['groups'][chat]} r = requests.post(image_url, files=files, data=values) log.info("post photo: %s", r.status_code) def setup(config): schedule.every(config['photo_interval']).seconds.do(lambda: post_plot(config)) if __name__ == "__main__": parser = argparse.ArgumentParser(description="DoorStateBot") parser.add_argument("--config", "-c", default="settings.json", help="Configuration file") parser.add_argument("--loop", "-l", action="store_true", help="Loop") args = parser.parse_args() if args.loop: loop(vars(args)) else: main(vars(args))