Ankündigung

Einklappen
Keine Ankündigung bisher.

python-Zugriff auf smartVISU-Websocket

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    python-Zugriff auf smartVISU-Websocket

    Hallo smartHome.py Freunde,

    ich möchte von mehreren Computern auf smartHome.py-Items zugreifen können.
    Die betreffenden Computer und das smartHome.py befinden sich in unterschiedlichen LAN-Segmenten, die durch eine Firewall getrennt sind.
    In diese sind ohnehin zwei Löcher gebohrt, um die SmartVISU im erstgenannten Segment zur Verfügung zu stellen.

    Der Zugriff soll durch ein Shell- oder Python-Script geschehen, um diese dann - unter anderem - geordnet herunterfahren zu können.

    Also habe ich einen Versuch mit Python gestartet.
    Während mir das smartHome.py-Network-Plugin eher für das Netzwerkseitige setzen der Werte
    von Items geeignet scheint, spricht nach meiner Kenntnis nichts dagegen, die genannten
    Löcher in der Firewall auch hierfür zu verwenden und den gleichen WebSocket zu verwenden,
    den auch die SmartVISU verwendet.
    Eine von der VISU abweichende Zugriffsregelung ist nicht erforderlich.

    Beim Ausführen der Datei wstest_client.py wird allerdings die Verbindung geschlossen, bevor eine Antwort empfangen wurde (siehe Konsolenausgabe unten).

    wstest_client.py:
    Code:
    import json
    import websocket
    
    version = 3,
    
    try:
        import thread
    except ImportError:  #TODO use Threading instead of _thread in python3
        import _thread as thread
    import time
    import sys
    
    
    def on_message(ws, message):
        print(message)
    
    
    def on_error(ws, error):
        print(error)
    
    
    def on_close(ws):
        print("### closed ###")
    
    
    def on_open(ws):
        def run(*args):
            for i in range(1):
                # send the message, then wait
                # so thread doesnt exit and socket
                # isnt closed
                sendstr = json.dumps({'cmd': 'proto', 'ver': version})
                print("Sending " + sendstr)
                ws.send(sendstr)
                print("Sent")
                sendstr = json.dumps({'cmd': 'monitor', 'items': ['eg.hwr.licht.decke']});
                print("Sending " + sendstr)
                ws.send(sendstr)
                print("Sent")
                time.sleep(1)
    
    #        time.sleep(1)
    #        ws.close()
    #        print("Thread terminating...")
    
        thread.start_new_thread(run, ())
    
    if __name__ == "__main__":
        websocket.enableTrace(True)
        if len(sys.argv) < 2:
            host = "ws://smarthome.lan:2424/"
        else:
            host = sys.argv[1]
        ws = websocket.WebSocketApp(host,
                                    on_message = on_message,
                                    on_error = on_error,
                                    on_close = on_close)
        ws.on_open = on_open
        ws.run_forever()
    Konsolenausgabe:
    Code:
    root@shProto:/usr/dev# python wstest_client.py
    --- request header ---
    GET / HTTP/1.1
    Upgrade: websocket
    Connection: Upgrade
    Host: fasanenweg.lan:2424
    Origin: http://fasanenweg.lan:2424
    Sec-WebSocket-Key: VX6ipXfBQY2FUfhbRlJc6g==
    Sec-WebSocket-Version: 13
    
    
    -----------------------
    --- response header ---
    HTTP/1.1 101 Switching Protocols
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Accept: fMQ/KVrJ/fsDlVou1uLKvyzzVXQ=
    -----------------------
    Sending {"cmd": "proto", "ver": [3]}
    send: b'\x81\x9c\xe0\x13;\xa7\x9b1X\xca\x841\x01\x87\xc2cI\xc8\x94|\x19\x8b\xc01M\xc2\x921\x01\x87\xbb f\xda'
    Sent
    Sending {"items": ["eg.hwr.licht.decke"], "cmd": "monitor"}
    send: b'\x81\xb3\x96\xa5G)\xed\x87.]\xf3\xc84\x0b\xac\x85\x1c\x0b\xf3\xc2iA\xe1\xd7iE\xff\xc6/]\xb8\xc1"J\xfd\xc0et\xba\x85eJ\xfb\xc1e\x13\xb6\x87*F\xf8\xcc3F\xe4\x87:'
    Sent
    
    ### closed ###
    Die von smarthome.py -d erzeugte Konsolenausgabe lautet:
    Code:
    2014-12-30 20:18:21,054 DEBUG    Main         WebSocket: incoming connection from 192.168.2.2:57996 to 192.168.2.20:2424 -- connection.py:accept:187
    2014-12-30 20:18:21,075 DEBUG    Main         192.168.2.2:57996 sent '{"cmd": "proto", "ver": [3]}' -- __init__.py:json_parse:269
    2014-12-30 20:18:21,080 DEBUG    Main         WebSocketHandler: closing socket 192.168.2.2:57996 -- connection.py:close:302
    Über jegliche Hilfe würde ich mich sehr freuen!

    Viele Grüße,

    fivesails

    #2
    Hallo Erik,

    die Websocket-Schnittstelle ist keine (von mir) supportete Schnittstelle. Es kann Verhaltensänderungen geben die nicht dokumentiert sind.

    Dafür gibt es das Netzwerkplugin. Die ist dokumentiert und die API bleibt stabil.

    Wenn Du trotzdem die Schnittstelle benutzt, so solltest Du die Kommunikation der Visu nachstellen.
    Da fällt mir z.B. auf das Du "ver: [3]" schickst, während die Visu "ver: 3" schickt.

    Bis bald

    Marcus

    Kommentar


      #3
      Hallo Marcus,

      vielen Dank für Deine Nachricht. Ich war beim Versuch, die Kommunikation der Visu nachzustellen, schlicht nicht darauf gekommen, die Logausgaben des WebSockets in der smartHome.py Konsole des Originals und der python-Version genau zu vergleichen. Jetzt läuft es.

      Trotzdem komme ich gerne noch einmal auf die (von Dir) supportete Schnittstelle zurück: Ich finde in der Doku nur Aufrufe zum Schreiben, aber keine zum Lesen. Dies war der Grund, es mit der Visu-Schnittstelle zu versuchen. Habe ich etwas übersehen?

      Viele Grüße,

      Erik

      Kommentar


        #4
        Hallo Erik,

        nein, Du hast nichts übersehen.

        Alternativ gibt es noch das CLI-Plugin. Dort kann man lesen und schreiben. Ist quasi eine Telnet-Schnittstelle.

        Hmm, da ist die Websocket-Schnittstelle vllt. schöner.

        Bis bald

        Marcus

        Kommentar

        Lädt...
        X