Hallo,
ich bin dabei ein Plugin zur Anbindung meines "tollen" Velux-Dachfenstermotor über das Gateway KLF200 zu schreiben. Erstmal würde mir reichen wenn das Plugin zwei Items unterstützt für das auf und zu fahren. Dabei möchte ich das package pyvlx nutzen, das mit asyncio arbeitet. Und hier liegen auch meine Probleme. Ich habe ein Beispiel-Skript mit dem mein Dachfenster auffährt:
Hier wird in der main Funktion jetzt ja eine LOOP gestartet. Wie bilde ich das am besten in mein Plugin ab? Starte ich so eine Schleife in der Init Routine?
Ich habe mal was probiert das funktioniert aber leider nicht:
Das führt aber zu dem Fehler:
Kann mir jemand einen Tipp geben, wie ich die Loop richtig einsetzen müsste?
ich bin dabei ein Plugin zur Anbindung meines "tollen" Velux-Dachfenstermotor über das Gateway KLF200 zu schreiben. Erstmal würde mir reichen wenn das Plugin zwei Items unterstützt für das auf und zu fahren. Dabei möchte ich das package pyvlx nutzen, das mit asyncio arbeitet. Und hier liegen auch meine Probleme. Ich habe ein Beispiel-Skript mit dem mein Dachfenster auffährt:
Code:
"""Just a demo of the new PyVLX module.""" import asyncio from pyvlx import Position, PyVLX async def main(loop): # Connect pyvlx = PyVLX(host="192.168.2.127", password="velux123", loop=loop) # Runing scenes: await pyvlx.load_scenes() await pyvlx.scenes["All Windows Closed"].run() # Changing position of windows: await pyvlx.load_nodes() await pyvlx.nodes['Bath'].open() await pyvlx.disconnect() if __name__ == '__main__': # pylint: disable=invalid-name LOOP = asyncio.get_event_loop() LOOP.run_until_complete(main(LOOP)) # LOOP.run_forever() LOOP.close()
Ich habe mal was probiert das funktioniert aber leider nicht:
Code:
def __init__(self, sh): super().__init__() self._cycle = 60 # Initialization code goes here self._loop = asyncio.get_event_loop() self.init_webinterface(WebInterface) return
Code:
def run(self): self.logger.debug("Run method called") self.pyvlx = PyVLX(host="192.168.2.127", password="velux123", loop=self._loop) self.alive = True
Code:
def update_item(self, item, caller=None, source=None, dest=None): if self.alive and caller != self.get_shortname(): self.logger.info("Update item: {}, item has been changed outside this plugin".format(item.id())) if self.has_iattr(item.conf, 'velux_cmd'): self._loop.run_until_complete(self.pyvlx.load_nodes()) self.logger.debug("update_item was called with item '{}' from caller '{}', source '{}' and dest '{}'".format(item, caller, source, dest)) if self.get_iattr_value(item.conf, 'velux_cmd') == 'open': if item() == True: self._loop.run_until_complete(self.pyvlx.nodes['Bath'].open()) pass
2021-07-03 14:42:07 ERROR lib.plugin Plugin 'velux' exception in run() method: There is no current event loop in thread 'velux'.
Kommentar