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