Loxone --> Windows steuern

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • Xenobiologist
    Lox Guru
    • 15.01.2016
    • 1112

    Loxone --> Windows steuern

    Hallo zusammen,

    aus diesem Thread https://www.loxforum.com/forum/faqs-...ausf%C3%BChren
    kam die Idee ein Autoitskript zu schreiben, um von Loxone aus Befehle auf Windows-PCs ausführen zu können.
    Die Möglichkeiten in Autoit sind nahezu ungebgrenzt. Es kommt also darauf an, welche Befehle man ausführen möchte.
    Ich habe mal 3 Beispiele gemacht.
    1) Text ausgeben
    2) Programm starten (Firefox)
    3) Dos-Command ausführen

    Autoit könnt ihr hier runterladen: https://www.autoitscript.com/site/autoit/downloads/
    Das Skript kann kompiliert werden und als *.exe genutzt werden und dann natürlich auch als Dienst eingebunden werden.

    Falls jemand Probleme hat seine Befehle in Autoit umzusetzen, dann bitte einfach melden.

    Nutzung des Skripts
    In Loxone einen Virtuellen Ausgang anlegen und dazu eine Anzahl von Virteuller Ausgang Befehle. In den einzelnen Befehlen unter Befehl bei EIN den String der gesendet werden soll.
    Ich habe es so gemacht, dass bei Verbindungsaufbau
    Code:
    Loxone:DEINBEFEHL
    geschickt wird.

    Code:
    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Icon=connected.ico
    #AutoIt3Wrapper_Outfile=LoxoneCommands.exe
    #AutoIt3Wrapper_Res_Comment=Receive TCP commands from your Loxone Miniserver and start commands on your Windows-PC.
    #AutoIt3Wrapper_Res_Description=Any questions then please go to http://www.loxforum.org
    #AutoIt3Wrapper_Res_Language=1031
    #AutoIt3Wrapper_Res_Field=Author|Xenobiologist
    #AutoIt3Wrapper_Run_Au3Stripper=y
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    
    ;Communication TCP Loxone - Autoit
    #include <GUIConstantsEx.au3>
    #include <MsgBoxConstants.au3>
    #include <TrayConstants.au3>
    #include <File.au3>
    #include <Date.au3>
    
    Opt('TrayAutoPause', 0)
    Opt("TrayMenuMode", 3)
    Opt("TCPTimeout", 10)
    
    OnAutoItExitRegister('OnAutoItExit')
    
    ; ### Your local IP address!
    ; ### Usally the macro @IPAddress1 works.
    ; ### If you 've got some virtual network interfaces installed, @IPAddress2 or @IPAddress3 or @IPAddress4 could be the correct one.
    Global $ip = @IPAddress1 ; or '192.168.xxx.xxx'
    $ip = '192.168.178.52' ; my local IP-address :-)
    ConsoleWrite('Listen : ' & $ip & @CRLF)
    
    Global $port = 50001 ; The port has to be the same as defined in your virtual output in your Loxone configuration
    Global $MainSocket = -1, $ConnectedSocket = -1
    Global $recv = ''
    Global $log = True, $path_logfile = @ScriptDir & '\' & @ScriptName & '.log'
    
    ; IP-addresses which are allowed to connect to your Windows-PC.
    ; You can add as much as you want, just append them to the string speprated by a "," - '192.168.178.79, 192.168.178.78, 192.168.178.77'
    Global $accpeted_IPs = StringSplit('192.168.178.79, 192.168.178.78, 192.168.178.77', ',', 2)
    
    ; Start init function (Listen for incoming connection)
    _init()
    ; main loop (create the menu and check for incoming commands
    _main()
    
    ; Your functions
    Func _command_1($recv)
        If $log Then _FileWriteLog($path_logfile, 'Command 1 executed!')
        MsgBox($MB_ICONINFORMATION, 'Loxone TCP', $recv, 5)
    EndFunc   ;==>_command_1
    
    Func _command_2()
        If $log Then _FileWriteLog($path_logfile, 'Command 2 executed!')
        ShellExecute('Firefox')
    EndFunc   ;==>_command_2
    
    Func _command_3($recv)
        If $log Then _FileWriteLog($path_logfile, 'Command 3 executed!')
        ConsoleWrite(_NowTime() & " " & $recv & @CRLF)
        Run(@ComSpec & " /k " & $recv, "", @SW_SHOW) ; k=keep, c=close window;
    EndFunc   ;==>_command_3
    
    Func _command_4()
        If $log Then _FileWriteLog($path_logfile, 'Command 4 executed!')
        ; was auch immmer
    EndFunc   ;==>_command_4
    
    Func _command_5()
        If $log Then _FileWriteLog($path_logfile, 'Command 5 executed!')
        ; was auch immmer
    EndFunc   ;==>_command_5
    
    Func _main()
        Local $c1 = -1, $c2 = -1, $c3 = -1, $c4 = -1, $c5 = -1
        Local $iSettings = TrayCreateMenu('Loxone commands') ; Create a tray menu sub menu with two sub items.
        $c1 = TrayCreateItem('1) Show MsgBox', $iSettings)
        $c2 = TrayCreateItem('2) Start Firefox', $iSettings)
        $c3 = TrayCreateItem('3) Run_in_CMD', $iSettings)
    ;~     $c4 = TrayCreateItem('4', $iSettings)
    ;~     $c4 = TrayCreateItem('4', $iSettings)
    ;~     $c5 = TrayCreateItem('5', $iSettings)
        TrayCreateItem('') ; Create a separator line.
        Local $tray_exit = TrayCreateItem('Exit')
    
        TraySetState($TRAY_ICONSTATE_SHOW)
    
        While 1
            Switch TrayGetMsg()
                Case $c1
                    _command_1($recv)
                Case $c2
                    _command_2()
                Case $c3
                    _command_3($recv)
                Case $c4
                    _command_4()
                Case $c5
                    _command_5()
                Case $tray_exit
                    Exit
            EndSwitch
            ConsoleWrite(_NowTime() & @CRLF)
            _checkTCP() ; ~ Every 250 ms
        WEnd
    EndFunc   ;==>_main
    
    Func _init()
        TCPStartup()
        $MainSocket = TCPListen($ip, $port, 100)
        If @error Then
            ; Someone is probably already listening on this IP Address and Port (script already running?).
            Local $iError = @error
            MsgBox(BitOR($MB_SYSTEMMODAL, $MB_ICONHAND), '', 'Could not listen, Error code: ' & $iError)
        Else
            ConsoleWrite('Listen successful.' & @CRLF)
        EndIf
    EndFunc   ;==>_init
    
    Func _checkTCP()
        ; If no connection look for one
        If $ConnectedSocket = -1 Then
            $ConnectedSocket = TCPAccept($MainSocket)
            If @error Then
                $iError = @error
                MsgBox(BitOR($MB_SYSTEMMODAL, $MB_ICONHAND), '', 'Could not accept the incoming connection, Error code: ' & $iError)
            EndIf
            ; Check for valid remote IP-Address
            If $ConnectedSocket <> -1 Then
                Local $connectedIP = _SocketToIP($ConnectedSocket)
                ConsoleWrite('ConnectedIP (try): ' & $connectedIP & @CRLF)
                If StringInStr(StringStripWS(_ArrayToString($accpeted_IPs), 8), $connectedIP, 2) = 0 Then
                    If $log Then _FileWriteLog($path_logfile, 'Invalid connection from : ' & $connectedIP)
                    TCPCloseSocket($ConnectedSocket)
                    $ConnectedSocket = -1
                    Return -1
                Else
                    ConsoleWrite('Connection accepted from : ' & $connectedIP & @CRLF)
                    If $log Then _FileWriteLog($path_logfile, 'Valid connection from : ' & $connectedIP)
                EndIf
            EndIf
            ; If connected try to read some data
        Else
            $recv = TCPRecv($ConnectedSocket, 512)
            $err = @error
            If $recv <> '' Then
                Switch StringStripWS($recv, $STR_STRIPLEADING + $STR_STRIPTRAILING)
                    ; the string sent by Loxone needs to match the string used in case ...
                    ; ### Change something here to match see "keyword" sent from Loxone Miniserver
                    ; ### The easiest way is to send Loxone:2, Loxone:3 and so on.
                    ; ### You could also use names like in example 1 "Loxone:It works!"
                    Case 'Loxone:It works!'
                        _command_1($recv)
                    Case 'Loxone:2'
                        _command_2()
                    Case 'Loxone:3'
                        _command_3('"ipconfig /all"')
                    Case 'Loxone:4'
                        _command_4()
                    Case 'Loxone:5'
                        _command_5()
                EndSwitch
    
                TCPCloseSocket($ConnectedSocket)
                $ConnectedSocket = -1
                If $log Then _FileWriteLog($path_logfile, $recv)
            ElseIf $err < 0 Then
                If $log Then _FileWriteLog($path_logfile, 'Error occurred - closed')
                TCPCloseSocket($ConnectedSocket)
                $ConnectedSocket = -1
            EndIf
        EndIf
    EndFunc   ;==>_checkTCP
    
    Func OnAutoItExit()
        TCPCloseSocket($MainSocket)
        TCPShutdown()
    EndFunc   ;==>OnAutoItExit
    
    Func _SocketToIP($iSocket)
        Local $tSockAddr = 0, $aRet = 0
        $tSockAddr = DllStructCreate("short;ushort;uint;char[8]")
        $aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $iSocket, "struct*", $tSockAddr, "int*", DllStructGetSize($tSockAddr))
        If Not @error And $aRet[0] = 0 Then
            $aRet = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($tSockAddr, 3))
            If Not @error Then Return $aRet[0]
        EndIf
        Return 0
    EndFunc   ;==>_SocketToIP
    So long,
    Mega
    Zuletzt geändert von Xenobiologist; 24.04.2018, 14:57.
    Node-RED mit influxDB und Grafana - z.B. Statistiken auslagern:
    https://www.loxforum.com/forum/germa...d-grafana-visu
    Mit Loxone einen Windows-PC steuern:
    https://www.loxforum.com/forum/faqs-...indows-steuern
  • Xenobiologist
    Lox Guru
    • 15.01.2016
    • 1112

    #2
    Hat es mal jemand genutzt?
    Ich könnte auch eine exe hochladen mit den 3 Beispielen zum Testen, dann müsste man in Loxone nur die Befehle einrichten und aufrufen.
    Die IP könnte das Skript aus einer ini Datei lesen.
    Es ergibt aber schon Sinn das au3 zu nutzen und individuell anzupassen.
    Die ausführenden Aktionen auf dem Windowsrechner lassen sich nämlich nicht wirklich gut aus einer ini lesen.
    Node-RED mit influxDB und Grafana - z.B. Statistiken auslagern:
    https://www.loxforum.com/forum/germa...d-grafana-visu
    Mit Loxone einen Windows-PC steuern:
    https://www.loxforum.com/forum/faqs-...indows-steuern

    Kommentar


    • geko
      geko kommentierte
      Kommentar bearbeiten
      Hallo Xenobiologist, das währe super mit den 3 Beispielen, Big thx für ein tolles Tutorial
  • Xenobiologist
    Lox Guru
    • 15.01.2016
    • 1112

    #3
    Die 3 Beispiele sind in dem jetzigen Beispiel schon drin. Du musst nur Autoit und ggf. Scite als IDE (Editor) installieren und das Skript laufen lassen.
    Dann kannst du von Loxone aus die Befehle starten. Was machst du denn auf deinem Windows-PC?
    Node-RED mit influxDB und Grafana - z.B. Statistiken auslagern:
    https://www.loxforum.com/forum/germa...d-grafana-visu
    Mit Loxone einen Windows-PC steuern:
    https://www.loxforum.com/forum/faqs-...indows-steuern

    Kommentar

    • Gast

      #4
      Hi Xenobiologist,

      war schon länger auf der Suche, wollte einen Weg finden, um mit Alexa den PC steuern zu können, Excel/Word/Browser öffnen, PC runterfahren für "Alles Aus", usw.

      Habs mit Deiner Anleitung auf Anhieb hinbekommen - echt spitzen Sache, das AutoIt-All-In One Paket runtergeladen, Dein Script reinkopiert und diese 2 Sachen laufen nun schon:


      "Alexa, schalte PC aus" -> HA-Bridge -> Loxone -> AutoIt Script -> shutdown(5) //fährt pc herunter
      "Alexa, schalte Mittagspause ein" -> HA-Bridge -> Loxone -> AutoIt Script -> shutdown(0) //sperrt pc


      Werde das Tool jetzt noch beim Starten des PCs immer automatisch starten und die weiteren Befehle ausprogrammieren.

      Vielen Dank!

      Kommentar

      • Xenobiologist
        Lox Guru
        • 15.01.2016
        • 1112

        #5
        Gerne.
        Wenn du bei Autoit fragen hast, dann kann ich da sicher helfen. :-)
        Node-RED mit influxDB und Grafana - z.B. Statistiken auslagern:
        https://www.loxforum.com/forum/germa...d-grafana-visu
        Mit Loxone einen Windows-PC steuern:
        https://www.loxforum.com/forum/faqs-...indows-steuern

        Kommentar

        • Gast

          #6
          Hallo Xenobiologist

          Ich habe das Script mit AutoIT gestartet und soweit schein alles o.k. - ich habe seitens Loxone den Virtuellen Ausgang angelegt und ich kriegs einfach nicht hin das der mir "Command 3" also DOS Befehle ausführt - eigentlich reagiert das Skript auf nichts ausser wenn ich manuell die Funktionen wähle...

          Was mache ich falsch?

          Kommentar

          • Xenobiologist
            Lox Guru
            • 15.01.2016
            • 1112

            #7
            Zeig bitte dein Skript und den VI mit den Parametern.
            Node-RED mit influxDB und Grafana - z.B. Statistiken auslagern:
            https://www.loxforum.com/forum/germa...d-grafana-visu
            Mit Loxone einen Windows-PC steuern:
            https://www.loxforum.com/forum/faqs-...indows-steuern

            Kommentar

            • Gast

              #8
              Als Skript habe ich das von dir 1zu1 genommen und im VI war ich mir nicht sicher... Ich habe z.b. "shutdown -s" versucht...

              Kommentar

              • metusalem
                Smart Home'r
                • 06.06.2016
                • 93

                #9
                Hallo, das klingt gut.

                Ich bin auf der Suche nach einer Möglichkeit per Loxone an einem per LAN verbundenem PC "Hotkeys" zu übertragen. es geht um Zahlenwertee oder um einzelne Buchstaben.
                Jetzt nur die Frage zu dem Script, welche Werte müßte ich für die Zahlenwerte 0 - 9 einsetzen ?

                Danke im voraus für Hilfestellung.

                Kommentar

                • Xenobiologist
                  Lox Guru
                  • 15.01.2016
                  • 1112

                  #10
                  Zitat von bmt8630
                  Als Skript habe ich das von dir 1zu1 genommen und im VI war ich mir nicht sicher... Ich habe z.b. "shutdown -s" versucht...
                  Es gibt mehrere Möglichkeit, wie du zum Ziel kommst.
                  Man sollte sich entscheiden, wo man quasi die Logik hinterlegt. Ich würde empfehlen dies im Autoitscript zu machen und von Loxone einfach nur 1,2,3,4 oder 5 zu senden.

                  Entscheidend sind diese Zeilen im Autoitscript:

                  Code:
                              Switch StringStripWS($recv, $STR_STRIPLEADING + $STR_STRIPTRAILING)
                                  ; the string sent by Loxone needs to match the string used in case ...
                                  Case 'Loxone:It works!'
                                      _command_1($recv)
                                  Case 'Loxone:2'
                                      _command_2()
                                  Case 'Loxone:3'
                                      _command_3('"ipconfig /all"')
                                  Case 'Loxone:4'
                                      _command_4()
                                  Case 'Loxone:5'
                                      _command_5()
                              EndSwitch
                  Wichtig ist, dass der Befehl der von Loxone gesendet wird im VI
                  1) an die richtige ip-Adresse gesendet wird bzw. den richtigen Namen. (Den Port muss ebenfalls zwischen Loxone und Autoitscript übereinstimmen!)
                  2) Das was gesendet wird "Loxone:" und dann der Befehl wird zwischen den Zeilen 114-126 ausgewertet.
                  Wenn dies übereinstimmt, dann werden die jeweiligen Funktionen aufgerufen.
                  D.h. bei 1. zum Test muss Loxone:It works! als String von Loxone zu deinem PC geschickt werden, dann wird der Code in der Funktion ausgeführt und die MsgBox ausgegeben.
                  Bei den weiteren Befehlen 2 und 3 habe ich es mir einfacher gemacht und lediglich eine 2 bzw. 3 übergeben.
                  Loxone:2 bzw. Loxone:3.
                  Wichtig nochmal, Loxone: wird direkt im VI in Loxone hinterlegt und der Rest z.B. (2,3, oder It works!) wird in Loxone in den einzelnen virtuellen Ausgangs-Befehlen hinterlegt.
                  3) Beispiel 1 und 3 waren eher zu zeigen, dass es so auch ginge. (Dies könnte man machen, wenn man sehr viele Befehle hat und nicht zig Funktionen im autoitscript anlegen möchte)
                  Wie gesagt, ich empfehle es wie in Command2 zu machen.
                  Wenn du jetzt einen Dos-Befehl auf deinem Rechner ausführen willst, dann eine Loxone:2 senden, es wird _command_2() ausgeführt und hier muss dann deine Logik rein.

                  Zum Beispiel als Autoitcode einfach
                  Shutdown(6)
                  siehe hier https://www.autoitscript.com/autoit3...s/Shutdown.htm




                  Node-RED mit influxDB und Grafana - z.B. Statistiken auslagern:
                  https://www.loxforum.com/forum/germa...d-grafana-visu
                  Mit Loxone einen Windows-PC steuern:
                  https://www.loxforum.com/forum/faqs-...indows-steuern

                  Kommentar

                  • Xenobiologist
                    Lox Guru
                    • 15.01.2016
                    • 1112

                    #11
                    Zitat von metusalem
                    Hallo, das klingt gut.

                    Ich bin auf der Suche nach einer Möglichkeit per Loxone an einem per LAN verbundenem PC "Hotkeys" zu übertragen. es geht um Zahlenwertee oder um einzelne Buchstaben.
                    Jetzt nur die Frage zu dem Script, welche Werte müßte ich für die Zahlenwerte 0 - 9 einsetzen ?

                    Danke im voraus für Hilfestellung.
                    Eigentlich kannst du die Beschreibung des Posts direkt über diesen nutzen. :-)
                    Sende einfach den String so, dass im Script eine der Funktion ausgeführt wird. In diese Funktion kannst du jetzt deine Logik in Autoit implementieren.
                    Z.B. : Send(1) oder Send("Hallo Welt") oder was auch immer.
                    Wenn du mir sagst, was genau auf deinem PC passieren soll, dann kann ich dir den Autoit-code dafür geben. :-)
                    Node-RED mit influxDB und Grafana - z.B. Statistiken auslagern:
                    https://www.loxforum.com/forum/germa...d-grafana-visu
                    Mit Loxone einen Windows-PC steuern:
                    https://www.loxforum.com/forum/faqs-...indows-steuern

                    Kommentar

                    • metusalem
                      Smart Home'r
                      • 06.06.2016
                      • 93

                      #12
                      Hallo,
                      die genaue Anwendung sieht wie folgt aus:
                      es hat nix mit Smarthome zu tun, sonder mit einem Exponat in einer Ausstellung:

                      Mit der Loxonesteuerung wird ein Impuls von einer Handkurbel abgefragt und ausgewertet, wieviele Impulse gesendet werden.
                      Der erste Impuls sendet dann den Wert 1 an eine im PC gestartete Applikation ( und dort wird eine DMX-Lichtszene ) gestartet.
                      Wenn jetzt innerhalb von 10sec. 5 weite Impulse kommen, so soll der Wert 2 für die Lichtszene 2 gesendet werden.
                      Folgen jetzt wieder innerhalb von 10sec. 5 weitere Impulse wird dder Wert 3 gesendet, usw....

                      Der Max. Wert der übertragen wird ist. 9 für eine Betätigungszeit von 90sec.


                      Wird jetzt innerhalb dieser 10sec. kein Wert mehr gesendet, wird der Wert 0 gesendet, und DMX setzt alles auf 0 ( Dunkel )

                      Somit hoffe ich etwas zum Verständniss beigetragen zu haben.

                      Ich freue mich auf eine eränzende Info zu Autoit, wo ich dann obiges erreiche, und vielleicht noch zur Sicherheit bei Impuls "1",
                      starte das Programm xy ( den namen habe ich im Moment nicht im Kopf,
                      und dann Werte die weiteren Impulse aus wie oben beschrieben.

                      Habe hier auf die Loxone gesetzt, da ich noch andere Funktionalitäten in der Ausstellung habe, und dieses dann alles mit einer Steuerung erreichen kann/könnte.



                      Kommentar

                      • Xenobiologist
                        Lox Guru
                        • 15.01.2016
                        • 1112

                        #13
                        Zitat von metusalem
                        Hallo,
                        die genaue Anwendung sieht wie folgt aus:
                        es hat nix mit Smarthome zu tun, sonder mit einem Exponat in einer Ausstellung:

                        Mit der Loxonesteuerung wird ein Impuls von einer Handkurbel abgefragt und ausgewertet, wieviele Impulse gesendet werden.
                        Der erste Impuls sendet dann den Wert 1 an eine im PC gestartete Applikation ( und dort wird eine DMX-Lichtszene ) gestartet.
                        Wenn jetzt innerhalb von 10sec. 5 weite Impulse kommen, so soll der Wert 2 für die Lichtszene 2 gesendet werden.
                        Folgen jetzt wieder innerhalb von 10sec. 5 weitere Impulse wird dder Wert 3 gesendet, usw....

                        Der Max. Wert der übertragen wird ist. 9 für eine Betätigungszeit von 90sec.


                        Wird jetzt innerhalb dieser 10sec. kein Wert mehr gesendet, wird der Wert 0 gesendet, und DMX setzt alles auf 0 ( Dunkel )

                        Somit hoffe ich etwas zum Verständniss beigetragen zu haben.

                        Ich freue mich auf eine eränzende Info zu Autoit, wo ich dann obiges erreiche, und vielleicht noch zur Sicherheit bei Impuls "1",
                        starte das Programm xy ( den namen habe ich im Moment nicht im Kopf,
                        und dann Werte die weiteren Impulse aus wie oben beschrieben.

                        Habe hier auf die Loxone gesetzt, da ich noch andere Funktionalitäten in der Ausstellung habe, und dieses dann alles mit einer Steuerung erreichen kann/könnte.


                        Ich habe dir die Logik mal (etwas umständlich, dafür aber hoffentlich verständlich für dich) in Autoit gebaut. Du kannst es testen über Loxone, in dem von Loxone Loxone:2 sendest, oder auch direkt in der Scite IDE mit dem Hotkey 2. Sprich einfach das Skript starten, dann 2 drücken und in die Console auf die Ausgaben schauen.

                        Code:
                        #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
                        #AutoIt3Wrapper_Icon=connected.ico
                        #AutoIt3Wrapper_Outfile=LoxoneCommands.exe
                        #AutoIt3Wrapper_Res_Comment=Receive TCP commands from your Loxone Miniserver and start commands on your Windows-PC.
                        #AutoIt3Wrapper_Res_Description=Any questions go to http://www.loxforum.org
                        #AutoIt3Wrapper_Res_Language=1031
                        #AutoIt3Wrapper_Res_Field=Author|Xenobiologist
                        #AutoIt3Wrapper_Run_Au3Stripper=y
                        #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
                        
                        ;Communication TCP Loxone - Autoit
                        #include <GUIConstantsEx.au3>
                        #include <MsgBoxConstants.au3>
                        #include <File.au3>
                        
                        Opt('TrayAutoPause', 0)
                        Opt('TrayMenuMode', 1)
                        
                        OnAutoItExitRegister('OnAutoItExit')
                        
                        Global $ip = @IPAddress1
                        Global $port = 50001
                        Global $MainSocket = -1, $ConnectedSocket = -1
                        Global $recv = ''
                        Global $log = True, $path_logfile = @ScriptDir & '\' & @ScriptName & '.log'
                        
                        Global $status = "stopped", $ht_scene = -1, $ht_time = -1, $scene = 0, $counter = 0
                        
                        HotKeySet('2', '_command_2')
                        
                        _init()
                        _main()
                        
                        ; Your functions
                        Func _command_1($recv)
                            If $log Then _FileWriteLog($path_logfile, 'Command 1 executed!')
                            MsgBox($MB_ICONINFORMATION, 'Loxone TCP', $recv, 5)
                        EndFunc   ;==>_command_1
                        
                        Func _command_2()
                            If $log Then _FileWriteLog($path_logfile, 'Command 2 executed!')
                        
                            If $status = "stopped" Then
                                $ht_scene = TimerInit()
                                $ht_time = TimerInit()
                                $status = "Running"
                        ;~         ShellExecute('DEIN_PROGRAMM") ; hier dein Programm, dass du starten willst.
                                ConsoleWrite('Spiel gestartet!' & $status & @CRLF)
                                Return 1
                            EndIf
                        
                            Local $diff_scene = Round(TimerDiff($ht_scene) / 1000, 2)
                            Local $diff_time = Round(TimerDiff($ht_time) / 1000, 2)
                        
                            ConsoleWrite("!$ht_scene" & $diff_scene & @CRLF)
                            ConsoleWrite("!$ht_time " & $diff_time & @CRLF)
                        
                            Select
                                Case $diff_scene < 10 And $status = "Running"
                                    $counter += 1
                                    If $counter = 5 Then
                                        $scene += 1
                                        $ht_scene = TimerInit()
                                        $counter = 0
                                    EndIf
                                    If $scene = 9 Then
                                        ConsoleWrite("MAX" & @CRLF)
                                        $scene = 0
                                    EndIf
                                    ConsoleWrite("TimerDiff = " & $diff_scene & " Impulse in 10s : " & $counter & " Lichtszene: " & $scene & @CRLF)
                        
                                Case $diff_scene > 10
                                    $status = "Stopped"
                                    $counter = 0
                                    $scene = 0
                                    $ht_scene = 0
                                    $ht_time = 0
                                    ConsoleWrite('Kein Impuls 10 Skeunden lang! = ' & $diff_scene & @CRLF)
                        
                                Case $diff_time > 90
                                    $status = "Stopped"
                                    $counter = 0
                                    $scene = 0
                                    $ht_scene = 0
                                    $ht_time = 0
                                    ConsoleWrite('90 sekunden sind um! = ' & $diff_time & @CRLF)
                        
                            EndSelect
                        EndFunc   ;==>_command_2
                        
                        Func _command_3($recv)
                            If $log Then _FileWriteLog($path_logfile, 'Command 3 executed!')
                            ConsoleWrite($recv & @CRLF)
                            Run(@ComSpec & " /k " & $recv, "", @SW_SHOW) ; k=keep, c=close window;
                        EndFunc   ;==>_command_3
                        
                        Func _command_4()
                            If $log Then _FileWriteLog($path_logfile, 'Command 4 executed!')
                            ; was auch immmer
                        EndFunc   ;==>_command_4
                        
                        Func _command_5()
                            If $log Then _FileWriteLog($path_logfile, 'Command 5 executed!')
                            ; was auch immmer
                        EndFunc   ;==>_command_5
                        
                        Func _main()
                            Local $c1 = -1, $c2 = -1, $c3 = -1, $c4 = -1, $c5 = -1
                            Local $iSettings = TrayCreateMenu('Loxone commands') ; Create a tray menu sub menu with two sub items.
                            $c1 = TrayCreateItem('1) Show MsgBox', $iSettings)
                            $c2 = TrayCreateItem('2) Start Firefox', $iSettings)
                            $c3 = TrayCreateItem('3) Run_in_CMD', $iSettings)
                        ;~     $c4 = TrayCreateItem('4', $iSettings)
                        ;~     $c4 = TrayCreateItem('4', $iSettings)
                        ;~     $c5 = TrayCreateItem('5', $iSettings)
                            TrayCreateItem('') ; Create a separator line.
                            Local $tray_exit = TrayCreateItem('Exit')
                        
                            While 1
                                Switch TrayGetMsg()
                                    Case $c1
                                        _command_1($recv)
                                    Case $c2
                                        _command_2()
                                    Case $c3
                                        _command_3($recv)
                                    Case $c4
                                        _command_4()
                                    Case $c5
                                        _command_5()
                                    Case $tray_exit
                                        ExitLoop
                                EndSwitch
                                _checkTCP() ; ~ Every 250 ms
                            WEnd
                        EndFunc   ;==>_main
                        
                        Func _init()
                            TCPStartup()
                            $MainSocket = TCPListen($ip, $port, 100)
                            If @error Then
                                ; Someone is probably already listening on this IP Address and Port (script already running?).
                                Local $iError = @error
                                MsgBox(BitOR($MB_SYSTEMMODAL, $MB_ICONHAND), '', 'Could not listen, Error code: ' & $iError)
                            Else
                                ConsoleWrite('Listen successful.' & @CRLF)
                            EndIf
                        EndFunc   ;==>_init
                        
                        Func _checkTCP()
                            ; If no connection look for one
                            If $ConnectedSocket = -1 Then
                                $ConnectedSocket = TCPAccept($MainSocket)
                                If @error Then
                                    $iError = @error
                                    MsgBox(BitOR($MB_SYSTEMMODAL, $MB_ICONHAND), '', 'Could not accept the incoming connection, Error code: ' & $iError)
                                EndIf
                                ; If connected try to read some data
                                ;--------------------
                            Else
                                $recv = TCPRecv($ConnectedSocket, 512)
                                $err = @error
                                If $recv <> '' Then
                                    Switch StringStripWS($recv, $STR_STRIPLEADING + $STR_STRIPTRAILING)
                                        ; the string sent by Loxone needs to match the string used in case ...
                                        Case 'Loxone:It works!'
                                            _command_1($recv)
                                        Case 'Loxone:2'
                                            _command_2()
                                        Case 'Loxone:3'
                                            _command_3('"ipconfig /all"')
                                        Case 'Loxone:4'
                                            _command_4()
                                        Case 'Loxone:5'
                                            _command_5()
                                    EndSwitch
                        
                                    TCPCloseSocket($ConnectedSocket)
                                    $ConnectedSocket = -1
                                    If $log Then _FileWriteLog($path_logfile, $recv)
                                ElseIf $err < 0 Then
                                    If $log Then _FileWriteLog($path_logfile, 'Error occurred - closed')
                                    TCPCloseSocket($ConnectedSocket)
                                    $ConnectedSocket = -1
                                EndIf
                            EndIf
                        EndFunc   ;==>_checkTCP
                        
                        Func OnAutoItExit()
                            TCPCloseSocket($MainSocket)
                            TCPShutdown()
                        EndFunc   ;==>OnAutoItExit
                        Node-RED mit influxDB und Grafana - z.B. Statistiken auslagern:
                        https://www.loxforum.com/forum/germa...d-grafana-visu
                        Mit Loxone einen Windows-PC steuern:
                        https://www.loxforum.com/forum/faqs-...indows-steuern

                        Kommentar

                        • metusalem
                          Smart Home'r
                          • 06.06.2016
                          • 93

                          #14
                          Hallo Xenobiologist,

                          vielen Dank für die Info und den Vorschlag.

                          ich habe es gerade mal dein Basisbeispiel ( mit drei Bfehelen ) ausprobiert, und es hat geklappt. :-)

                          Die Auswertung der Impulse passiert direkt in der Loxone und setze nur die entsprechenden Ausgänge für das Senden der "Befehle"

                          Nun wollte ich folgende Eingaben erweitern, und da scheitere ich gerade dran.

                          Mein Ziel ist folgendes:

                          AUTOIT Script im Autostart

                          "Testbetrieb"

                          Beim Starten des Loxone Servers kommt eine Meldung: It Works! und es wird der Windows-Editor gestartet über die Loxone command_0:0

                          Jetzt soll über die Loxone manuell über virtuelle Ausgänge folgende Befehle im Editor ausgeführt werden:
                          Loxone command_1 :1
                          Loxone command_2 :2
                          Loxone command_3:3
                          .
                          .
                          .
                          Loxone command_9:9
                          Loxone comannd_10:q
                          Loxone command_11:w
                          Loxone command_12:e
                          Loxone command_13:r
                          Loxone command_14:t
                          Loxone command_15:z


                          "Realbetrieb"

                          Beim Starten des Loxone Servers kommt eine Meldung: It Works! und es wird die eigentliche Software "xyz" gestartet über die Loxone command_0:0

                          Jetzt soll über die Loxone manuell über virtuelle Ausgänge folgende Befehle im Editor ausgeführt werden:
                          Loxone command_1 :1
                          Loxone command_2 :2
                          Loxone command_3:3
                          .
                          .
                          .
                          Loxone command_9:9
                          Loxone comannd_10:q
                          Loxone command_11:w
                          Loxone command_12:e
                          Loxone command_13:r
                          Loxone command_14:t
                          Loxone command_15:z



                          Und bei diesem Aufbau bin ich leider gescheitert.

                          Vielleicht hast du noch eine hilfreiche Info für mich - Dank im voraus.



                          Kommentar

                          • Gast

                            #15
                            Hallo zusammen,

                            eine einfachere Lösung um Windows Systeme zu steuern, kann mit Hilfe des POSH Servers (http://www.poshserver.net/) und PowerShell realisiert werden. Der POSH Server wird auf dem Ziel System gestartet (onStartup natürlich) und stellt im Anschluss eine REST Schnittstelle zur Verfügung, über welche beliebige PowerShell Skripte angesprochen werden können (natürlich mit Parameter übergaben). Über Powershell Remoting, kann sogar nur ein Server als "Controller" dienen

                            Für den umgekehrten Weg Powershell > Loxone habe ich mal eine PS Klasse geschrieben it work's but not final http://www.loxwiki.eu/display/LOX/Lo...rShell+steuern

                            Kommentar

                            Lädt...