From: Martin Mares Date: Mon, 14 Feb 2022 21:41:12 +0000 (+0100) Subject: Telegram: A bit more robust X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=09c2cff6305b3889f106ea352ab600ddae930acd;p=home-hw.git Telegram: A bit more robust --- diff --git a/telegram/TODO b/telegram/TODO index fb057e9..dacc54c 100644 --- a/telegram/TODO +++ b/telegram/TODO @@ -1,3 +1,2 @@ - ošetření chyb -- stěžovat si, pokud dlouho nepřijdou teplotní data (asi umřel ARexx) - používat teplotu hlášenou kotlem? diff --git a/telegram/test.py b/telegram/test.py index aaff5bf..8ff3797 100755 --- a/telegram/test.py +++ b/telegram/test.py @@ -5,23 +5,30 @@ import asyncio import asyncio_mqtt from datetime import datetime, timedelta import logging +import signal import ssl +import sys import config -logging.basicConfig(level=logging.INFO) +formatter = logging.Formatter(fmt="%(asctime)s %(name)s.%(levelname)s: %(message)s", datefmt='%Y-%m-%d %H:%M:%S') +log_handler = logging.StreamHandler(stream=sys.stdout) +log_handler.setFormatter(formatter) +logger = logging.getLogger() +logger.setLevel(logging.DEBUG) +logger.addHandler(log_handler) bot = Bot(token=config.API_TOKEN) -dp = Dispatcher(bot) +dispatcher = Dispatcher(bot) -@dp.message_handler(commands=['start', 'help']) +@dispatcher.message_handler(commands=['start', 'help']) async def send_welcome(message: types.Message): - logging.info(f'Start from {message.chat}') + logger.info(f'Start from {message.chat}') await message.reply("Brum!\nI'm BurrowBot!\n") -@dp.message_handler() +@dispatcher.message_handler() async def echo(message: types.Message): print(message) # await message.answer(message.text) @@ -35,24 +42,24 @@ bucket_last_fill = datetime.now() async def send_msg(text): global bucket, bucket_last_fill - logging.info(f'>>> Sending message: {text}') + logger.info(f'Sending message: {text}') if bucket < BUCKET_CAPACITY: now = datetime.now() while bucket < BUCKET_CAPACITY and bucket_last_fill + BUCKET_REFRESH <= now: bucket_last_fill += BUCKET_REFRESH bucket += 1 - logging.info(f'Bucket refill: {bucket}') + logger.debug(f'Bucket refill: {bucket}') if bucket > 0: bucket -= 1 - logging.info(f'Bucket drain: {bucket}') + logger.debug(f'Bucket drain: {bucket}') for chat in config.CHATS: await bot.send_message(chat, text + '\n') else: - logging.info('Bucket empty :(') + logger.info('Bucket empty :(') hyst_state = {} @@ -85,15 +92,22 @@ last_boiler_err = 0 async def mqtt_process_msg(topic, val): global last_temp_state, last_temp_warning global last_boiler_err + now = datetime.now() - # print(topic, '->', val) + print(topic, '->', val) if topic == 'burrow/temp/catarium': - temp = float(val.split(' ')[0]) - temp_state = hysteresis('catarium-temp', temp, 23.2, 23.5) + temp, when = map(float, val.split(' ')) + if when < now.timestamp() - 3600: + temp_state = 0 + else: + temp_state = hysteresis('catarium-temp', temp, 23.2, 23.5) if temp_state != last_temp_state: last_temp_state = temp_state - await send_msg(f'Teplota v pracovně: {temp} °C') + if temp_state == 0: + await send_msg('Teplotní čidlo v pracovně nefunguje.') + else: + await send_msg(f'Teplota v pracovně: {temp} °C') if topic == 'burrow/heating/error': err = int(val.split(' ')[0]) @@ -119,19 +133,31 @@ async def mqtt_loop(): async def mqtt_watcher(): while True: try: - logging.info(">>> Starting MQTT") + logger.info("Starting MQTT") await mqtt_loop() except asyncio_mqtt.MqttError as error: - logging.error(f"MQTT error: {error}") + logger.error(f"MQTT error: {error}") finally: - await asyncio.sleep(30) + await asyncio.sleep(10) + + +async def fortunes(): + while True: + proc = await asyncio.create_subprocess_exec('fortune', stdout=asyncio.subprocess.PIPE) + out, err = await proc.communicate() + if proc.returncode == 0: + await send_msg(out.decode()) + else: + logger.error(f'fortune failed with return code {proc.returncode}') + await asyncio.sleep(24*60*60) -loop = asyncio.get_event_loop() -loop.create_task(mqtt_watcher()) +async def main(): + loop = asyncio.get_event_loop() + t1 = loop.create_task(mqtt_watcher()) + t2 = loop.create_task(dispatcher.start_polling(timeout=20, relax=0.01, fast=True, allowed_updates=None)) + t3 = loop.create_task(fortunes()) + await asyncio.wait((t1, t2, t3)) -executor.start_polling(dp, skip_updates=True) -## loop = asyncio.get_event_loop() -## loop.create_task(self.dispatcher.start_polling(reset_webhook=reset_webhook, timeout=20, relax=0.01, fast=True, allowed_updates=None)) -## loop.run_forever() +asyncio.run(main())