POST-Befehl mit DIGEST-Authentifizierung.

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • Tico
    Lox Guru
    • 31.08.2016
    • 1035

    #1

    POST-Befehl mit DIGEST-Authentifizierung.

    Hallo.

    Ich möchte einen POST-Befehl an einen Fronius Hybrid-Wechselrichter senden, der die DIGEST-Authentifizierung für den Benutzernamen/das Passwort erfordert.
    Leider unterstützt der Miniserver nur die BASIC-Authentifizierung.
    Der POST-Befehl würde stattdessen von der Loxberry gesendet und vom Miniserver mit geeigneten Mitteln ausgelöst werden.

    POST - http://<ip>/servicecgi-bin/suspend_battery_kalibrierung/
    PAYLOAD - {"suspension_time_seconds": 10800}

    Ist das eine schwierige Programmieraufgabe? Ich habe keine Programmierkenntnisse, würde aber jede Anleitung oder Unterstützung sehr schätzen.
    Ich spreche kein Deutsch. Gib Google Translate die Schuld, wenn ich unverständlich bin.
  • Christian Fenzl
    Lebende Foren Legende
    • 31.08.2015
    • 11238

    #2
    Im Prinzip ist es ein Einzeiler:
    • Mit curl den Request durchführen und dessen Antwort direkt an den MS zurückliefern.
    Das könnte man als Bash-Script ins Legacy-Verzeichnis des Loxberry legen.
    Hilfe für die Menschen der Ukraine: https://www.loxforum.com/forum/proje...Cr-die-ukraine

    Kommentar


    • svethi
      svethi kommentierte
      Kommentar bearbeiten
      Hey, Einzeiler lese ich gern ;-)
  • Tico
    Lox Guru
    • 31.08.2016
    • 1035

    #3
    Danke Gast Fenzl. Ich bedauere zu sagen, dass das meiste von dem, was Sie gesagt haben, über meinen Kopf ging. Obwohl ich von der Tatsache gejubelt werde, sollte es erreichbar sein.

    Nach der Recherche, was Sie gesagt haben, möchte ich mein Verständnis klären -

    1. Ein BASH-Skript befindet sich in einem Verzeichnis innerhalb der Loxberry,
    2. Innerhalb des BASH-Skripts ist ein Curl-Befehl,
    3. Der curl-Befehl sendet die POST-Nachricht an den Wechselrichter,
    4. Der Miniserver verfügt über eine virtuelle Ausgabe, die auf die Adresse des BASH-Skripts zeigt.
    5. Ein Trigger auf dem VO wird dazu führen, dass das BASH-Skript ausgeführt wird?

    Bitte entschuldige meine Ignoranz, wenn ich das falsch verstanden habe.
    Zuletzt geändert von Tico; 24.03.2018, 13:42.
    Ich spreche kein Deutsch. Gib Google Translate die Schuld, wenn ich unverständlich bin.

    Kommentar

    • svethi
      Lebende Foren Legende
      • 25.08.2015
      • 6322

      #4
      Liest sich als kommt es aus einem Übersetzer.
      English?
      Du scheinst es aber richtig verstanden zu haben.
      Miniserver; KNX; Vitogate; EnOcean (EnOceanPi); Loxone Air; Caldav-Kalenderanbindung; RaspberryPi und für keine Frickellösung zu schade :-)

      Kommentar


      • Tico
        Tico kommentierte
        Kommentar bearbeiten
        Richtig. Ich verlasse mich komplett auf Google Translate für Englisch auf Deutsch. Was es schwierig macht, eine andere Sprache zu verstehen, wenn man über ein unbekanntes Thema spricht.

      • svethi
        svethi kommentierte
        Kommentar bearbeiten
        Christian kann gut english und ich ein bißchen, vielleicht ist es in english besser :-)
    • Christian Fenzl
      Lebende Foren Legende
      • 31.08.2015
      • 11238

      #5
      svethi As I am still in „day processing“, wouldn’t this be a simple task for you, as the URL and POST parameters are already mentioned.
      I think a simple call to stdout would do it, possibly adding a header may be required.
      Hilfe für die Menschen der Ukraine: https://www.loxforum.com/forum/proje...Cr-die-ukraine

      Kommentar


      • svethi
        svethi kommentierte
        Kommentar bearbeiten
        day processing ;-) i like that. Let me think about it. I also have some things to do
    • Tico
      Lox Guru
      • 31.08.2016
      • 1035

      #6
      Ein freundlicher Aufruf an alle, die in diesem Thema helfen können ...
      Ich freue mich, einen Beitrag zur Gemeinschaft zu leisten, auf welche Art auch immer. Ich möchte diesen Eintrag im Loxwiki fortführen -



      Meine Fähigkeiten enden mit Loxwiki-Bearbeitung.



      POST - http://<ip>/servicecgi-bin/suspend_battery_calibration/

      PAYLOAD - {"suspension_time_seconds":10800}
      Zuletzt geändert von Tico; 09.04.2018, 21:31.
      Ich spreche kein Deutsch. Gib Google Translate die Schuld, wenn ich unverständlich bin.

      Kommentar


      • Riesenschnabel
        Riesenschnabel kommentierte
        Kommentar bearbeiten
        "Page Not Found"...
        Irgendwas passt da noch nicht.

        Grüße

      • Tico
        Tico kommentierte
        Kommentar bearbeiten
        Vielen Dank. Link repariert. Der Übersetzer hatte ein wort "with" in "mit" geändert.
    • Tico
      Lox Guru
      • 31.08.2016
      • 1035

      #7
      Hallo.

      Ich bekomme ein Skript, das entwickelt wurde, um den POST-Befehl zu senden. Ich möchte verstehen, wie man die virtuelle Ausgabe einrichtet.
      Ich gehe davon aus, dass das Skript in das Verzeichnis gehören soll -

      /Opt/loxberry/webfrontend/legacy/

      Ich nehme auch an, dass das Skript 'Suspend_Calibration.py' heißen wird.

      Was wird der Befehl für ON in der virtuellen Ausgabe sein?
      Ich spreche kein Deutsch. Gib Google Translate die Schuld, wenn ich unverständlich bin.

      Kommentar

      • Christian Fenzl
        Lebende Foren Legende
        • 31.08.2015
        • 11238

        #8
        Hi Tico,

        virtueller Ausgang: http://loxberry

        Befehl bei EIN: legacy/Suspend_Calibration.py?param1=value&param2=value.. .

        Die Parameter am Ende hängen natürlich vom Script ab.

        Meinst du das?
        Hilfe für die Menschen der Ukraine: https://www.loxforum.com/forum/proje...Cr-die-ukraine

        Kommentar

        • Tico
          Lox Guru
          • 31.08.2016
          • 1035

          #9
          Ich plane nicht, dass irgendwelche Parameter von Loxone definiert werden. Das Skript wird mit dem Befehl POST und der IP-Adresse des Wechselrichters fest codiert.

          POST - http: // <ip> / servicecgi-bin / suspend_battery_kalibrierung /
          PAYLOAD - {"suspension_time_seconds": 10800}

          Ich plane, das Skript zu meinen gewünschten Zeiten vom Miniserver auszulösen.
          Ich spreche kein Deutsch. Gib Google Translate die Schuld, wenn ich unverständlich bin.

          Kommentar

          • Christian Fenzl
            Lebende Foren Legende
            • 31.08.2015
            • 11238

            #10
            Dann lässt du beim "Befehl bei EIN" einfach die Parameter weg.
            Hilfe für die Menschen der Ukraine: https://www.loxforum.com/forum/proje...Cr-die-ukraine

            Kommentar


            • Tico
              Tico kommentierte
              Kommentar bearbeiten
              Danke.
          • Tico
            Lox Guru
            • 31.08.2016
            • 1035

            #11
            Ich habe Fortschritte gemacht und habe jetzt ein Skript.

            Das Skript wurde platziert in -

            /opt/loxberry/webfrontend/legacy/

            Es funktioniert nicht und ich stelle das beigefügte JSON zur Verfügung, das vom Inverter zurückgebracht wird (Abbildung 1).

            "Ausführung fehlgeschlagen: fehlender Parameter suspension_time_seconds."

            Zur Fehlersuche führe ich das Skript über den Loxberry File Manager - Direkt link Button aus.

            Ist etwas offensichtlich falsch? Die IP, Benutzername und Passwort sind korrekt ausgefüllt. Die Person, die beim Schreiben des Skripts geholfen hat, hat keinen Loxberry.

            Hier ist das Skript -

            PHP-Code:
            <?php
            ###################################################
            # TODO: Update IP address, username and password
            $ip = "x.x.x.x";
            
            $username = "username";
            $password = "password";
            ###################################################
            
            # TEST URL: $url = "https://httpbin.org/digest-auth/auth/user/passwd";
            $url = "http://" . $ip . "/servicecgi-bin/suspend_battery_calibration/";
            
            $post_data = array(
                'suspension_time_seconds' => '10800'
            );
            
            $options = array(
                CURLOPT_URL            => $url,  
                CURLOPT_VERBOSE        => false,
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_FOLLOWLOCATION => true,
                CURLOPT_SSL_VERIFYPEER => false,
                CURLOPT_USERPWD        => $username . ":" . $password,
                CURLOPT_HTTPAUTH       => CURLAUTH_DIGEST,
                CURLOPT_POST           => true,
                CURLOPT_CUSTOMREQUEST  => 'POST',
                CURLOPT_POSTFIELDS     => http_build_query($post_data) 
            );
            
            $ch = curl_init();
            
            curl_setopt_array( $ch, $options );
            
            try {
              $raw_response  = curl_exec( $ch );
            
              echo $raw_response;
            
              // validate CURL status
              if(curl_errno($ch))
                  throw new Exception(curl_error($ch), 500);
            
              // validate HTTP status code (user/password credential issues)
              $status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
              if ($status_code != 200)
                  throw new Exception("Response with Status Code [" . $status_code . "].", 500);
            
            } catch(Exception $ex) {
                if ($ch != null) curl_close($ch);
            
                throw new Exception($ex);
            }
            
            if ($ch != null) curl_close($ch);
            
            ?>
            Ich spreche kein Deutsch. Gib Google Translate die Schuld, wenn ich unverständlich bin.

            Kommentar

            • Christian Fenzl
              Lebende Foren Legende
              • 31.08.2015
              • 11238

              #12
              Tico Hast du den Link zur API zur Hand?
              Bisher hatten wir von einem JSON gesprochen, das ist jetzt aber kein JSON mehr.

              Probier mal, dich an die Lösung von hier zu halten:

              Here is my code, $url = 'url_to_post'; $data = array( "first_name" =&gt; "First name", "last_name" =&gt; "last name", "email"=&gt;"email@gmail.com", "addresses" =&gt; array ( ...

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

              Kommentar

              • Tico
                Lox Guru
                • 31.08.2016
                • 1035

                #13
                Das einzige Detail, das Fronius zur Verfügung stellt, ist das -

                POST - http: // <ip> / servicecgi-bin / suspend_battery_kalibrierung /

                PAYLOAD - {"suspension_time_seconds": 10800}

                Hier ist ein Screenshot eines Programms, das funktioniert, um den POST-Befehl zu senden. (Bild 1)

                Ich vermute, dass im Skript möglicherweise etwas vorhanden ist, das die Nutzdaten nicht korrekt bildet. Mangel an verschnörkelten Klammern? Doppelpunkt?
                Ich spreche kein Deutsch. Gib Google Translate die Schuld, wenn ich unverständlich bin.

                Kommentar

                • svethi
                  Lebende Foren Legende
                  • 25.08.2015
                  • 6322

                  #14
                  Wenn ich das richtig sehe soll da der Parameter als JSON übergeben werden. Hier wird es aber also normaler Parameter übergeben.
                  Also als POST Data übergeben was da als Payload steht
                  Miniserver; KNX; Vitogate; EnOcean (EnOceanPi); Loxone Air; Caldav-Kalenderanbindung; RaspberryPi und für keine Frickellösung zu schade :-)

                  Kommentar

                  • Christian Fenzl
                    Lebende Foren Legende
                    • 31.08.2015
                    • 11238

                    #15
                    Code:
                    $data_string = json_encode($post_data);
                    $options = array(
                        CURLOPT_URL            => $url,  
                        CURLOPT_VERBOSE        => false,
                        CURLOPT_RETURNTRANSFER => true,
                        CURLOPT_FOLLOWLOCATION => true,
                        CURLOPT_SSL_VERIFYPEER => false,
                        CURLOPT_USERPWD        => $username . ":" . $password,
                        CURLOPT_HTTPAUTH       => CURLAUTH_DIGEST,
                        CURLOPT_HTTPHEADER => array('Content-Type:application/json'),
                        CURLOPT_POST           => true,
                        CURLOPT_CUSTOMREQUEST  => 'POST',
                        CURLOPT_POSTFIELDS     => $data_string,
                    );
                    Hilfe für die Menschen der Ukraine: https://www.loxforum.com/forum/proje...Cr-die-ukraine

                    Kommentar


                    • svethi
                      svethi kommentierte
                      Kommentar bearbeiten
                      Naja, zuerst packst Du den einen Wert in ein Array und dann ins JSON ... warum denn nicht gleich den String?
                  Lädt...