Hallo liebe Freunde des Telegram Plugins.
aktuell nutzen wir die telepot lib im threads modus. Dies hat zur folge, dass die drei threads der telepot lib nicht mit shng beendet werden können. Meist ist bei mir daher ein kill -9 zum beenden von shng notwendig.
Es gibt in der telepot lib auch die möglichkeit mit asyncio zu arbeiten. dabei sollte dieses problem nicht mehr auftreten.
ich habe versucht folgendes beispiel https://github.com/nickoala/telepot/...e/skeletona.py
in ein shng plugin zu übertragen
doch schon bei den imports:
tritt folgender Fehler auf
aktuell sieht mein erster versuch wie folgt aus
Wäre super, wenn jemand der sich damit auskennt mal ein Auge darauf wirft.
Für mich sieht es so aus als ob das Plugin in einem eigenen Thread läuft und der Event Loop aber im Main Thread gesucht wird. Wahrscheinlich nur eine Kleinigkeit...
LG
mode
aktuell nutzen wir die telepot lib im threads modus. Dies hat zur folge, dass die drei threads der telepot lib nicht mit shng beendet werden können. Meist ist bei mir daher ein kill -9 zum beenden von shng notwendig.
Es gibt in der telepot lib auch die möglichkeit mit asyncio zu arbeiten. dabei sollte dieses problem nicht mehr auftreten.
ich habe versucht folgendes beispiel https://github.com/nickoala/telepot/...e/skeletona.py
in ein shng plugin zu übertragen
doch schon bei den imports:
Code:
import asyncio import telepot.aio import telepot.aio.api from telepot.aio.loop import MessageLoop
Code:
2017-12-29 12:06:33 ERROR plugin Main Plugin 'telegram' exception during import of __init__.py: There is no current event loop in thread 'Main'. -- plugin.py:__init__:366 Traceback (most recent call last): File "/home/smarthome/smarthome/lib/plugin.py", line 364, in __init__ exec("import {0}".format(classpath)) File "<string>", line 1, in <module> File "/home/smarthome/smarthome/plugins/telegram/__init__.py", line 40, in <module> import telepot.aio File "<frozen importlib._bootstrap>", line 969, in _find_and_load File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 664, in _load_unlocked File "<frozen importlib._bootstrap>", line 634, in _load_backward_compatible File "/usr/local/lib/python3.5/dist-packages/telepot-12.5-py3.5.egg/telepot/aio/__init__.py", line 8, in <module> from . import helper, api File "<frozen importlib._bootstrap>", line 969, in _find_and_load File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 664, in _load_unlocked File "<frozen importlib._bootstrap>", line 634, in _load_backward_compatible File "/usr/local/lib/python3.5/dist-packages/telepot-12.5-py3.5.egg/telepot/aio/api.py", line 10, in <module> _loop = asyncio.get_event_loop() File "/usr/lib/python3.5/asyncio/events.py", line 671, in get_event_loop return get_event_loop_policy().get_event_loop() File "/usr/lib/python3.5/asyncio/events.py", line 583, in get_event_loop % threading.current_thread().name) RuntimeError: There is no current event loop in thread 'Main'.
aktuell sieht mein erster versuch wie folgt aus
Code:
import time import random import datetime import logging import urllib3 import telepot #import telepot.api from lib.model.smartplugin import SmartPlugin import asyncio import telepot.aio import telepot.aio.api from telepot.aio.loop import MessageLoop PLUGIN_ATTR_TOKEN = 'token' PLUGIN_ATTR_CHAT_IDS = 'trusted_chat_ids' ITEM_ATTR_MESSAGE = 'telegram_message' ITEM_ATTR_MATCHREGEX = 'telegram_value_match_regex' MESSAGE_TAG_ID = '[ID]' MESSAGE_TAG_NAME = '[NAME]' MESSAGE_TAG_VALUE = '[VALUE]' MESSAGE_TAG_CALLER = '[CALLER]' MESSAGE_TAG_SOURCE = '[SOURCE]' MESSAGE_TAG_DEST = '[DEST]' class Telegram(SmartPlugin): PLUGIN_VERSION = "2.0.0" ALLOW_MULTIINSTANCE = False # Storage Array for all items using telegram attributes _items = [] _chat_ids = [] # called, before items are loaded def __init__(self, smarthome, token='dummy', trusted_chat_ids='none', name='SH Telegram Gateway', welcome_msg='SmarthomeNG Telegram Plugin is up and running'): self._sh = smarthome self.logger = logging.getLogger(__name__) # Really don't need to hear about connections being brought up again after server has closed it # use logging.yaml or # logging.getLogger("requests.packages.urllib3.connectionpool").setLevel(logging.WARNING) self._bot = telepot.aio.Bot(token) self._loop = asyncio.get_event_loop() # self._loop = asyncio.new_event_loop() # asyncio.set_event_loop(self._loop) self._loop.create_task(MessageLoop(self._bot, self.message_handler).run_forever()) print('Listening ...') self.loop.run_forever() self._chat_ids = list(map(int, trusted_chat_ids.split(','))) if len(self._chat_ids) < 1: self.logger.info("No trusted chat ids configured!") # self._name = "GAMA HOME" self._name = name self._msg_broadcast(welcome_msg)
Wäre super, wenn jemand der sich damit auskennt mal ein Auge darauf wirft.
Für mich sieht es so aus als ob das Plugin in einem eigenen Thread läuft und der Event Loop aber im Main Thread gesucht wird. Wahrscheinlich nur eine Kleinigkeit...
LG
mode
Kommentar