Hallo,
oft würde mir ein Zwischending zwischen der Interacitve Shell (-i) und dem CLI Plugin helfen.
Beispiel: Das Whatsapp Plugin funktioniert nicht. Da wäre es hilfreich einfach mal ein paar Methoden des Plugins aufrufen zu können was mit der Interactive Shell kein Problem ist, mit der CLI hingegen nicht möglich ist.
Um in die Interactive Shell zu gelangen muss ich smarthome.py jedoch neu starten. Dann ist das Whatsapp Problem aber auch nicht mehr vorhanden, da es nur nach längerer Laufzeit auftritt.
Meine Idee war die Interactive Shell um eine Remote Interactive Shell zu erweitern. Im Prinzip einfach STDOUT und STDIN über einen Netzwerksocket zur Verfügung stellen.
Dazu habe ich auch schon ein Stück Coding im Web gefunden was nach einigen Anpassungen auch ganz passabel läuft:
Durch den Befehl nc localhost 2001 kann man nun auf eine Interactive Shell zugreifen. Auch Trennen und Wiederverbinden funktioniert schon.
Vielleicht findet das ja noch der ein oder andere Interessant und es findet seinen Weg in den Dev Branch. Den wirklichen Einbau würde ich dann allerdings Marcus überlassen wollen da das Ganze wohl in der Smarthome.py verankert werden müsste. Parameter -r für Remote Interactive Shell ist ja noch frei ;-)
LG
Mode
oft würde mir ein Zwischending zwischen der Interacitve Shell (-i) und dem CLI Plugin helfen.
Beispiel: Das Whatsapp Plugin funktioniert nicht. Da wäre es hilfreich einfach mal ein paar Methoden des Plugins aufrufen zu können was mit der Interactive Shell kein Problem ist, mit der CLI hingegen nicht möglich ist.
Um in die Interactive Shell zu gelangen muss ich smarthome.py jedoch neu starten. Dann ist das Whatsapp Problem aber auch nicht mehr vorhanden, da es nur nach längerer Laufzeit auftritt.
Meine Idee war die Interactive Shell um eine Remote Interactive Shell zu erweitern. Im Prinzip einfach STDOUT und STDIN über einen Netzwerksocket zur Verfügung stellen.
Dazu habe ich auch schon ein Stück Coding im Web gefunden was nach einigen Anpassungen auch ganz passabel läuft:
Code:
#!/usr/bin/env python3 import sys import code import socket globals()['sockfd0'] = '' globals()['sockfd'] = '' globals()['sock'] = '' def read_cmd(var): # print("Reading {0}".format(var)) sockfd = globals()['sockfd'] try: globals()['sock'].send(var.encode('utf-8')) # prompt except socket.error as msg: conn() line = sockfd.readline() return line # end read_cmd def write_cmd(self, data): # print("Writing {0}".format(data)) try: globals()['sock'].send(data.encode('utf-8')) except socket.error as msg: conn() # end write_cmd class wsock(): def __init__(self, sock): self.__sock = sock # end __init__ def write(self, text): try: return self.__sock.send(text.encode('utf-8')) except socket.error as msg: conn() # end write # end class def init(): port = 2001 globals()['sockfd0'] = socket.socket() globals()['sockfd0'].setsockopt(socket.SOL_SOCKET , socket.SO_REUSEADDR , 1) globals()['sockfd0'].bind(('',port)) globals()['sockfd0'].listen(1) # got connection def conn(): cs , caddr = globals()['sockfd0'].accept() globals()['sockfd'] = cs.makefile() globals()['sock'] = cs sys.stdout = wsock(cs) # hack much? code.InteractiveInterpreter.write = write_cmd code.interact(local=locals(), readfunc=read_cmd) # end bind_iaps init() conn() import time while(True): time.sleep(5)
Vielleicht findet das ja noch der ein oder andere Interessant und es findet seinen Weg in den Dev Branch. Den wirklichen Einbau würde ich dann allerdings Marcus überlassen wollen da das Ganze wohl in der Smarthome.py verankert werden müsste. Parameter -r für Remote Interactive Shell ist ja noch frei ;-)
LG
Mode
Kommentar