Virtueller Eingang mittels http request Steuern

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • bettersafe
    Azubi
    • 29.10.2022
    • 8

    Virtueller Eingang mittels http request Steuern

    Hallo Leute, leider habe ich den passenden Eintrag nicht gefunden daher muss ich einen neuen Eintrag erstellen.

    Ich möchte einen virtuellen Eingang im Loxone mittels HTTP Befehl steuern. Leider wird selbst bei Eintrag in die URL des User Namen und Passworts eine weitere Passwort Abfrage im Browser gestartet. Daher funktioniert es über den Postmann auch nicht und somit auch nicht über das Programm das den Befehl absetzt.

    Loxone meint, dass es nicht möglich sei ohne einem "Zwischenspeicher" und google ergab loxberry mit dem http-https Plug-In.

    Ich bin mir nicht sicher ob das tatsächlich so funktioniert.

    In der Software, die den Befehl absetzt kann ich folgende Punkte auswählen:

    HTTP(S)-URL
    HTTP(S)-Inhalt
    Inhaltstyp (text/plain; txt/html; application/html; application/json; application/xml)
    Login
    Passwort
    Authentifizierungstyp (Auto; Basic)
    Anforderungstyp (GET; PUT; POST; PATCH; DELETE)

    Wenn ich das über den Postamt probiere bekomme ich immer den Fehler: Error unauthorized und über den Browser muss ich eben selbst bei Username/Passwort in der URL ein Passwort gefragt.

    Ich kämpfe schon länger damit und würde mich sehr über eure Unterstützung freuen!

    LG
  • Christian Fenzl
    Lebende Foren Legende
    • 31.08.2015
    • 11200

    #2
    Code:
    http://<miniserver>/dev/sps/io/<virtInputName>/<wert>
    Requesttyp: GET
    Contenttype: text/plain
    Auth: Basic
    und deinen User und Pass

    Der User muss auf den Virtuellen Input <virtInputName> Rechte haben.

    Die Passwort-Abfrage im Browser ist normal, weil das Google so will. Das passiert nur im Browser. Wenn du im Browser das Passwort angibst, und dann kommt ein OK zurück, dann funktioniert der Aufruf auch aus deiner Anwendung.

    lg, Christian
    Hilfe für die Menschen der Ukraine: https://www.loxforum.com/forum/proje...Cr-die-ukraine

    Kommentar

    • tina6001
      Dumb Home'r
      • 10.04.2020
      • 14

      #3
      Zitat von Christian Fenzl
      Code:
      http://<miniserver>/dev/sps/io/<virtInputName>/<wert>
      Requesttyp: GET
      Contenttype: text/plain
      Auth: Basic
      und deinen User und Pass

      Der User muss auf den Virtuellen Input <virtInputName> Rechte haben.

      Die Passwort-Abfrage im Browser ist normal, weil das Google so will. Das passiert nur im Browser. Wenn du im Browser das Passwort angibst, und dann kommt ein OK zurück, dann funktioniert der Aufruf auch aus deiner Anwendung.

      lg, Christian

      Im internen Netzwerk funktioniert es einwandfrei.
      Aber wie kann man das vom externen Netzwerk machen?

      Kommentar


      • Iksi
        Iksi kommentierte
        Kommentar bearbeiten
        Am besten machst du das gar nicht aus dem externen Netzwerk, sonst müsstest du den Miniserver direkt per Port Weiterleitung nach aussen frei geben. Würde ich auf keinen Fall machen!
        Wenn dann per VPN oder so, je nachdem was du genau machen willst.

      • tina6001
        tina6001 kommentierte
        Kommentar bearbeiten
        Danke für die schnelle Antwort!
        So etwas habe ich vermutet, aber dachte vielleicht gibt es eine Lösung mit "dns.loxonecloud.com:MACAdresse",aber dann lese ich dass Ports immer wieder random zugewiesen sind... Also auch keine Lösung.
    • BucGue
      Smart Home'r
      • 23.09.2015
      • 37

      #4
      Hallo, gibt es eine Möglichkeit einen HTTP Eingang (VHI) manuell "abzufragen" und auswerten?
      in der Config kann man nur einen Abfragezyklus eingeben min. 10Sek. - was auch durchaus Sinn macht um das Netz nicht zu überlasten.
      Ich möchte aber den Status nur sporadisch abfragen -> z.B. bei Tastendruck und nicht auf die 10 Sekunden warten bevor ich den aktuellen Status habe und danach den gewünschten Befehl ausführe.
      Gibt es hierzu eine Möglichkeit? ich vermute mal irgendwie über ein skript im programmbaustein, aber mit PicoC kenne ich mich leider nicht aus - deshalb habe ich auf Loxone Standard gehofft.
      Danke, Lg

      Kommentar

      • Tico
        Lox Guru
        • 31.08.2016
        • 1035

        #5
        Virtuelle Ausgabebefehle funktionieren auf die gleiche Weise wie virtuelle Eingabebefehle. Ein Virtual-Output-Befehl kann einen bestimmten Endpunkt "bei Bedarf" abfragen und die Antwort im Miniserver speichern. Beachten Sie, dass die Informationen erst nach einem zweiten Schritt verfügbar sind.

        Die gespeicherten Informationen werden dann über einen PicoC-Block abgerufen, der die Datei liest und den gewünschten Wert extrahiert.

        Welches ist der Endpunkt, den Sie abfragen möchten? Und welche Informationen werden bei einer bestimmten Anfrage zurückgegeben?

        Einige Bildschirmfotos eines bereits funktionierenden virtuellen Eingangs sind hilfreich. Diese kann in eine ausgelöste virtuelle Ausgabe umgewandelt werden. Der Zeitrahmen für eine Antwort beträgt in der Regel etwa 2 Sekunden (abhängig von der Geschwindigkeit des Endpunkts).

        Klicke auf die Grafik für eine vergrößerte Ansicht

Name: Triggered Virtual Output.png
Ansichten: 905
Größe: 19,8 KB
ID: 409236
        Ich spreche kein Deutsch. Gib Google Translate die Schuld, wenn ich unverständlich bin.

        Kommentar

        • BucGue
          Smart Home'r
          • 23.09.2015
          • 37

          #6
          Hallo, danke für die Beschreibung - ich möchte den Status und Lautstärke eines Arylic Radios abfragen bevor ich diesen einschalte.
          http://10.1.1.136/httpapi.asp?command=getPlayerStatus -> funktioniert soweit natürlich und ich bekomme folgendes im Browser zurück:
          {"type":"0","ch":"0","mode":"10","loop":"4","eq ":" 0","status":"stop","curpos":"28657774","offset_ pts ":"28657774","totlen":"-8","Title":"486974726164696F204F33","Artist":"u nkn own","Album":"unknown","alarmflag":"0","plicount" : "0","plicurr":"0","vol":"4","mute":"0"}

          Die Abfrage über einen HTTP Eingang funktioniert auch - aber eben nur zyklisch:
          Klicke auf die Grafik für eine vergrößerte Ansicht

Name: image.png
Ansichten: 911
Größe: 47,1 KB
ID: 409306

          hast du ein Beispiel für so ein Pico C Programm? z.B zur Abfrage der Lautstärke.
          Danke​

          Kommentar

          • Tico
            Lox Guru
            • 31.08.2016
            • 1035

            #7
            Erstellen Sie eine virtuelle Ausgabe mit den genauen Parametern, wie sie angezeigt werden (der PicoC-Code verlässt sich darauf, dass die Dateinamen wie beschrieben sind).


            Klicke auf die Grafik für eine vergrößerte Ansicht  Name: Virtual Output.png Ansichten: 0 Größe: 36,1 KB ID: 409336


            Fügen Sie dann den folgenden Code in den Programmblock ein -

            Code:
            // PicoC code developed by @Jan W.
            // Link refers -
            // https://www.loxforum.com/forum/german/software-konfiguration-programm-und-visualisierung/403543-vti-aus-programm-picoc-beschreiben?p=405574#post405574
            
            FILE *fp1;
            char str1[7200];
            // [7200] is the maximum anticipated size of the file saved at user/common/xyz.json
             
            char *textStart;
            char *textEnd;
            char textString[4095];
            // [4095] is the maximum anticipated size of the Txt1 output
            
            
            char DesiredTextStart[20] = "\"vol\":\"";
            // defines the text immediately preceeding the desired value (in this case "vol":" )
            // [20] is the maximum length of the DesiredTextStart string
            
            int len;
            int nEvents;
            
            while(TRUE)
            {
                nEvents = getinputevent();
                if (nEvents & 0x08) // check for change on analogue input 1 (Bit 4). This is only used as a trigger to run following code -
                {
                    fp1 = fopen("/user/common/Arylic_status.json", "r");
            // open file in /user/common/**change this to actual filename**
            
                    fgets(str1, 7200 , fp1); // copy content of file to string, max. 7199 bytes plus trailing 0
            
                    textStart = strstr(str1,"vol");
            // search for text immediately preceeding the desired text (match characters in line 0015 above)
            
                    if (textStart != NULL) {
                        textStart = textStart + strlen(DesiredTextStart) -1; // if found then add length of text itself
                        textEnd = strstr(textStart, "\"");
            // search for character that marks the end of the desired value (in this case a quotation mark ")
             
                        if (textEnd != NULL) {
                            len = textEnd - textStart; // if found then calculate length of text
                            strncpy(textString, textStart, len); // copy n bytes from string to text starting from beginning of text
                            textString[len] = 0; // add trailing 0 to text string
                            setoutput(0,len); // set analogue output 1 to length of text
                            setoutputtext(0,textString); // set Txt1 output 1 to text
                        }
                    } else {
                        setoutputtext(0,"Desired text not found");
            // clear output if no text is found              
                        setoutput(0,0);
                    }
                }
                    fclose(fp1);
                }
                sleep(500); // sleep for half a second  
            }​

            Eventuell müssen Sie den verzögerten Impuls um ein oder zwei Sekunden verlängern, je nachdem, wie lange die Antwort des Arylic-Radios auf sich warten lässt. Sie können ihn auch kürzer machen.
            Dies ist nur der Lautstärkestatus. Wenn dies gut funktioniert, müssten Sie noch einige Änderungen für den Status vornehmen.
            Zuletzt geändert von Tico; 05.11.2023, 14:10.
            Ich spreche kein Deutsch. Gib Google Translate die Schuld, wenn ich unverständlich bin.

            Kommentar

            • BucGue
              Smart Home'r
              • 23.09.2015
              • 37

              #8
              Hallo,
              vielen Dank das mit der Lautstärke funktioniert schon ganz gut, an welcher Stelle muss ich noch Einträge machen damit ich auch den Status bekomme?
              am besten als Digital also nicht als Text.
              und wo definiere ich den Ausgang z.B Output2 ?
              ich wäre wirklich dankbar wenn du das noch ergänzen könntest.
              Vielen Dank

              Kommentar

              • Tico
                Lox Guru
                • 31.08.2016
                • 1035

                #9
                Dies hat Status auf Txt1 und Volumen auf Txt2. Ich kenne nicht alle verfügbaren Statusmeldungen, aber ein Statusblock könnte nützlich sein.


                Klicke auf die Grafik für eine vergrößerte Ansicht

Name: Status+Volume3.png
Ansichten: 835
Größe: 37,4 KB
ID: 409707


                Code:
                FILE *fp1;
                char str1[290];
                // [290] is the maximum anticipated size of the file saved at user/common/xyz.json
                 
                char *textStart;
                char *textEnd;
                char *valueStart;
                char *valueEnd;
                 
                char textString[20];
                // [20] is the maximum anticipated size of the Txt1 output
                char valueString[20];
                // [20] is the maximum anticipated size of the Txt2 output
                
                
                char DesiredTextStart[20] = "\"status\":\"";
                // defines the text immediately preceeding the desired text (in this case "status":" )
                // [20] is the maximum length of the DesiredTextStart string
                char DesiredValueStart[10] = "\"vol\":\"";
                // defines the text immediately preceeding the desired text (in this case "vol":" )
                // [10] is the maximum length of the DesiredValueStart string
                
                
                int len;
                int len2;
                int nEvents;
                
                while(TRUE)
                {
                    nEvents = getinputevent();
                    if (nEvents & 0x08) // check for change on analogue input 1 (Bit 4). This is only used as a trigger to run following code -
                    {
                        fp1 = fopen("/user/common/Arylic_status.json", "r");
                // open file in /user/common/**change this to actual filename**
                
                        fgets(str1, 290 , fp1); // copy content of file to string, max. 289 bytes plus trailing 0
                
                        textStart = strstr(str1,"status");
                // search for text immediately preceeding the desired text (match characters in line 0016 above)
                        valueStart = strstr(str1,"vol");
                // search for value immediately preceeding the desired value (match characters in line 0019 above)
                
                            if (textStart != NULL) {
                            textStart = textStart + strlen(DesiredTextStart) -1; // if found then add length of text itself
                            textEnd = strstr(textStart, "\"");
                // search for character that marks the end of the desired text (in this case a quotation mark ")
                
                            if (valueStart != NULL) {
                            valueStart = valueStart + strlen(DesiredValueStart) -1; // if found then add length of value itself
                            valueEnd = strstr(valueStart, "\"");
                // search for character that marks the end of the desired value (in this case a quotation mark ")
                
                 
                            if (textEnd != NULL) {
                                len = textEnd - textStart; // if found then calculate length of text
                                strncpy(textString, textStart, len); // copy n bytes from string to text starting from beginning of text
                                textString[len] = 0; // add trailing 0 to text string
                                setoutput(11,len); // set analogue output 12 to length of text
                                setoutputtext(0,textString); // set Txt1 output 1 to text
                            }
                            if (valueEnd != NULL) {
                                len2 = valueEnd - valueStart; // if found then calculate length of value
                                strncpy(valueString, valueStart, len2); // copy n bytes from string to text starting from beginning of text
                                valueString[len2] = 0; // add trailing 0 to text string
                                setoutput(12,len2); // set analogue output 13 to length of value
                                setoutputtext(1,valueString); // set Txt2 output 1 to value
                
                
                            }
                        } else {
                            setoutputtext(0,"Desired text not found");
                // clear output if no text is found              
                            setoutput(0,0);
                        }
                    }
                        fclose(fp1);
                    }
                    sleep(500); // sleep for half a second  
                }​
                Ich spreche kein Deutsch. Gib Google Translate die Schuld, wenn ich unverständlich bin.

                Kommentar


                • BucGue
                  BucGue kommentierte
                  Kommentar bearbeiten
                  Vielen Dank, funktioniert super - auch der Statusbaustein ist eine gute Idee.

                • Tico
                  Tico kommentierte
                  Kommentar bearbeiten
                  Willkommen.
              • WowaDriver
                Smart Home'r
                • 05.01.2017
                • 90

                #10
                Hallo Leute, ich stehe vor selben Problem wie es bei BucGue der Fall war.

                Mein Virtueller HTTP Eingang funktioniert um die Master Helligkeit des Lichtbausteins auszulesen. Ziel ist es mittels eines Dimmers durch zwei Tasten (Langzeitklick) ein Dimmen der Master Helligkeit eines ganzen Raumes zu bewerkstelligen. Problem ist eben wie oben beschrieben, dass sich der VTI nur alle 10 Sekunden aktualisiert. Ich würde den gerne Triggern können, dass er sich eben nur aktualisiert bei einer Änderung.

                Tico magst du mir helfen wie das Pico Programm auszusehen hat? Die Abfrage der Master Helligkeit läuft über folgenden Befehl:

                Code:
                http://user:password@miniserverip/dev/sps/io/1cfe24f6-03c4-cf5c-ffffed57184a04d2/masterValue/astate
                Danke für die Hilfe!

                Kommentar

                • Tico
                  Lox Guru
                  • 31.08.2016
                  • 1035

                  #11
                  Können Sie klären, woher Sie die Master-Helligkeit beziehen?

                  Ich habe Ihren Befehl mit der UUID meines Beleuchtungscontrollers geändert. Ich sehe nur einen Wert von 0, obwohl ich einen virtuellen Eingang im MBr-Eintrag der Beleuchtungssteuerung habe.

                  Vielleicht können Sie einen Screenshot posten?

                  Klicke auf die Grafik für eine vergrößerte Ansicht  Name: Master Brightness.png Ansichten: 0 Größe: 6,9 KB ID: 435023
                  Ich spreche kein Deutsch. Gib Google Translate die Schuld, wenn ich unverständlich bin.

                  Kommentar

                  • WowaDriver
                    Smart Home'r
                    • 05.01.2017
                    • 90

                    #12
                    Hallo Tico ich würde sagen das ist auch richtig so, da bestimmt die Beleuchtung aus ist und die Masterhelligkeit somit gleich 0 ist. Der Value Wert zeigt somit 0 an und der Code 200 bestätigt laut Loxone Dokumentation, dass die Abfrage in Ordnung war. Wenn Sie die Beleuchtung an machen, dann wird sich der Value Wert verändern.

                    Zum Testen im Browser, wenn Licht aus = 0% Masterhelligkeit:
                    Code:
                    http://login:passwort@miniserverip/dev/sps/io/1cfe24f6-03c4-cf5c-ffffed57184a04d2/astate

                    Als Ergebnis kommt im Browser:
                    Code:
                    This XML file does not appear to have any style information associated with it. The document tree is shown below.
                    
                    <LL control="dev/sps/io/1cfe24f6-03c4-cf5c-ffffed57184a04d2/astate" value="0.000" Code="200"/>

                    Ändere ich die Helligkeit auf z.B. 57% kommt im Browser die Ausgabe:
                    Code:
                    This XML file does not appear to have any style information associated with it. The document tree is shown below.
                    
                    <LL control="dev/sps/io/1cfe24f6-03c4-cf5c-ffffed57184a04d2/astate" value="57.000" Code="200"/>
                    //EDIT: Die Abfrage in der Config mit einem "Virtuellen HTTP Eingang" in dem folgende URL eigetragen ist:
                    Code:
                    http://login:passwort@miniserverip/dev/sps/io/1cfe24f6-03c4-cf5c-ffffed57184a04d2/astate
                    Und in dem "Virtuellen HTTP Eingangs Befehl" habe ich nur den Code der Befehlserkennung zum Überspringen der Zeichen eingefügt, damit er direkt zum Wert des Values springt:
                    \s115\v
                    Siehe auch Screenshots:
                    Klicke auf die Grafik für eine vergrößerte Ansicht  Name: image.png Ansichten: 0 Größe: 11,0 KB ID: 435145
                    Klicke auf die Grafik für eine vergrößerte Ansicht  Name: image.png Ansichten: 0 Größe: 15,1 KB ID: 435146

                    //EDIT#2: Ich bekomme bei mir im Verzeichnis /user/common/ keine xyz.json angelegt, das Verzeichnis ist und bleibt leer bei mir...
                    Zuletzt geändert von WowaDriver; 22.06.2024, 10:57.

                    Kommentar

                    • romildo
                      Lebende Foren Legende
                      • 25.08.2015
                      • 5113

                      #13
                      WowaDriver
                      Code:
                      http://login:passwort@miniserverip/dev/sps/io/1cfe24f6-03c4-cf5c-ffffed57184a04d2/astate
                      Ein Wert kommt aber nur, wenn es in der Lichtsteuerung nur einen Lichtkreis gibt. Bei mehreren Lichtkreisen kommt anstelle eines Wertes >0 ein Fragezeichen.
                      Zuletzt geändert von romildo; 22.06.2024, 12:41.
                      lg Romildo

                      Kommentar

                      • WowaDriver
                        Smart Home'r
                        • 05.01.2017
                        • 90

                        #14
                        romildo

                        Danke fürs Feedback und Recht hast du, ist mir noch gar nicht aufgefallen. Man kann dann aber anstelle von "astate" einfach "all" wählen und bekommt dann sämtliche output Werte von allen 18 LC's und inklusive der Masterhelligkeit ganz oben:

                        Code:
                        http://login:passwort@miniserverip/dev/sps/io/1cfe24f6-03c4-cf5c-ffffed57184a04d2/all
                        Klicke auf die Grafik für eine vergrößerte Ansicht  Name: image.png Ansichten: 0 Größe: 64,8 KB ID: 435169

                        Problem bleibt aber, dass sich bei mir keine .json Datei im user/common/ Ordner abgelegt wird und ich somit mit dem PicoC Programm nicht weiter komme.

                        //EDIT: Misst. Leider funktioniert das mit "all" auch nur solange die einzelnen Lichtkreise den selben Dimmwert haben. Hat jemand einen Vorschlag wie man sonst an die Master Helligkeit kommt?

                        //EDIT #2: Es muss aber irgendwie gehen, auch bei mehreren Lampen und verschiedenen Dimmwerten der Einzellampen... die durchschnittliche Mater Helligkeit muss auch ausgelesen werden können. iO Broker kann das ja auch live und bidirektional:

                        Klicke auf die Grafik für eine vergrößerte Ansicht  Name: image.png Ansichten: 0 Größe: 126,7 KB ID: 435175

                        Daheim bei meiner eigenen Installation gehe ich den Weg auch über iO Broker. Bei der neuen Installation meiner Eltern muss das aber so einfach wie möglich, vorallem ohne Zusatz-Equipment gelöst werden müssen. Also kein Raspberry oder miniPC...
                        Zuletzt geändert von WowaDriver; 22.06.2024, 15:04.

                        Kommentar

                        • Tico
                          Lox Guru
                          • 31.08.2016
                          • 1035

                          #15
                          Sie haben recht. Es ist ein ziemliches Durcheinander. Ich glaube nicht, dass es zuverlässig ist, die Master-Helligkeit über die Loxone Web Services zu ermitteln.

                          Nach meinen Beobachtungen ist die Master-Helligkeit immer die niedrigste Helligkeit, die von einem der Lc1-18 ausgegeben wird.

                          Wäre es ausreichend zu wissen, welches Licht die geringste Helligkeit hat (Ausgang O1) und wie hoch diese Helligkeit ist (Ausgang O2)?

                          Klicke auf die Grafik für eine vergrößerte Ansicht  Name: Lowest Brightness.png Ansichten: 0 Größe: 37,0 KB ID: 435181


                          Dieser PicoC-Code macht das (Dank an romildo, ich habe den Code, den er irgendwo gepostet hat, leicht verändert).

                          Code:
                          int nEvents;
                          int i;
                          int input = 3; // Maximum number of inputs 13, value 1-13
                          int value_current[input];
                          int value_min;
                          int value_input = 0;
                          
                          while (1 == 1) {
                            nEvents = getinputevent();
                            if (nEvents) {
                              value_min = 1000000; // Set to a very high value initially to ensure any input value will be lower
                              for (i = 0; i < input; i++) {
                                value_current[i] = getinput(i);
                                if (value_current[i] <= value_min) {
                                  value_min = value_current[i];
                                  value_input = i + 1;
                                }
                              }
                              setoutput(0, value_input);
                              setoutput(1, value_min);
                            }
                            sleep(100);
                          }
                          Zuletzt geändert von Tico; 22.06.2024, 16:37.
                          Ich spreche kein Deutsch. Gib Google Translate die Schuld, wenn ich unverständlich bin.

                          Kommentar

                          Lädt...