asyncio Unterstützung in Plugins Neu
Python Packages zur Ansteuerung von Peripherie werden zunehmend unter Verwendung von asyncio erstellt. Um diese Packages in Plugins nutzen zu können, muss das jeweilige Plugin asyncio unterstützen. Die Implementierung hiervon ist nicht tirvial und die ersten Plugins die asyncio implementiert haben, tun das sehr unterschiedlich und unter Nutzung der Low-Level Funktionen von asyncio (was ein erhebliches Error-Handling im Plugin voraussetzt).
Um die Nutzung von asyncio zu vereinfachen und in den Plugins zu standardisieren, unterstützt SmartHomeNG ab v1.11 die Nutzung von asyncio in Plugins durch eine Erweiterung der SmartPlugin Klasse um einige Methoden.
Ein Plugin welches die neue asyncio Unterstützung nutzt, ist das hue3 Plugin. Es kann bei der der Erstellung eines neuen Plugins als Beispiel herangezogen werden. |
Methoden zur Unterstützung von asyncio
Im folgenden sind die Methoden beschrieben, die zur asyncio Unterstützung zur SmartPlugin Klasse hinzugekommen sind.
- class lib.model.smartplugin.SmartPlugin(**kwargs)[Quellcode]
Bases:
SmartObject
,Utils
The class SmartPlugin implements the base class of all smart-plugins. The implemented methods are described below.
In addition the methods implemented in lib.utils.Utils are inherited.
- asyncio_state()[Quellcode]
- Returns the state of asyncio for the plugin
‚unused‘ - If the plugin does not use asyncio (the start_asyncio method has not been successfully executed)
‚running‘ - An active eventloop is beeing processed
‚stopped‘ - There is no active eventloop
- Rückgabetyp:
str
- Rückgabe:
‚unused‘ | ‚running‘ | ‚stopped‘
- start_asyncio(plugin_coro)[Quellcode]
Start the thread for the asyncio loop
The started asyncio thread sets up the asyncio environment and starts the eventloop. The given plugin_coro is added as the main task to the eventloop.
This routine is to be called from the plugin’s run() method
- Parameter:
plugin_coro (
Coroutine
) – The asyncio coroutine which implements the async part of the plugin- Rückgabetyp:
None
- stop_asyncio()[Quellcode]
stop the eventloop and the thread it is running in
This routine is to be called from the plugin’s stop() method.
- Rückgabetyp:
None
- run_asyncio_coro(coro, return_exeption=False)[Quellcode]
Run a coroutine in the eventloop of the plugin
When the asyncio eventloop of the plugin is running, this method can be used to add a coroutine to the eventloop from the part of the plugin which is thread operated. E.g.: This can be used in the plugins update_item() method to send data to the device through an asyncio package.
This method waits for the coroutine to be finished, to be able to return the result of the coroutine.
- Parameter:
coro (
Coroutine
) – A coroutine that should be run in the eventloop of the asyncio-threadreturn_exeption (
bool
) – If set to True, run_asyncio_coro returns exceptions instead of handling (logging) them itself
- Rückgabetyp:
Any
return: The result of the coroutine
- async wait_for_asyncio_termination()[Quellcode]
Wait for the command to stop the plugin_coro
This is used to block the plugin_coro until the plugin should be stopped.
When the plugin should be stopped, a string ‚STOP‘ is written into the queue
- Rückgabetyp:
None
- put_command_to_run_queue(command)[Quellcode]
Put an entry to the run-queue (if implemented in the plugin_coro)
- Parameter:
command (
str
) – command to be executed by the plugin_coro- Rückgabetyp:
None
- async get_command_from_run_queue()[Quellcode]
Get an entry from the run-queue
When the plugin should be stopped, a string ‚STOP‘ is written into the queue and the plugin_coro can check for the string ‚STOP‘ and terminate itself.
- Rückgabetyp:
str
- Rückgabe:
First command from the queue
- async list_asyncio_tasks()[Quellcode]
Log a list of the tasks that are in the eventloop
The intention of this method is to support the plugin development/debugging. It can be called from the executor plugin or from the eval-syntax-checker of the admin gui
- Rückgabetyp:
None