Ankündigung

Einklappen
Keine Ankündigung bisher.

HTTP-Binding richtig verwenden

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

  • HTTP-Binding richtig verwenden

    Hallo!

    Ich habe das Unifi Binding entdeckt, welches anhand des Unifi Controller WiFi Geräte im WLAN entdeckt. Anhand des Beispiels (unten) kann ich schon prima auf der Basic UI sagen, ob das Gerät da ist, oder nicht. Klappt also alles.

    Jetzt würde ich das Ganze gern als Anwesenheitskontrolle an unseren externen Server versenden. Das würde ich am liebsten mit HTTP-Bindings machen.
    Also wenn Matthew's iPhone = online, rufe http://meinserver.de/pfad/datei.php?param=parameter auf.

    Das Beispiel:
    Code:
    Contact MatthewsPhone "Matthew's iPhone [MAP(unifi.map):%s]" { channel="unifi:client:home:matthewsPhone:online" }
    hatte ich bereits ohne Erfolg zweckentfremdet:
    Code:
    Contact MatthewsPhone "Matthew's iPhone [MAP(unifi.map):%s]" { channel="unifi:client:home:matthewsPhone:online", http=">[ON:POST:http://meinserver.de/pfad/datei.php?param=open] >[OFF:POST:http://meinserver.de/pfad/datei.php?param=closed]"
    }
    Hier habe ich 2 Probleme: "Contact" will an dieser Stelle "OPEN/CLOSED"
    Binding configuration of type 'http' of item 'MatthewsPhone' could not be parsed correctly.
    org.eclipse.smarthome.model.item.BindingConfigPars eException: couldn't create Command from 'OPEN'
    und/oder das HTTP-Binding will mit "Contact" generell nichts anfangen:
    Binding configuration of type 'http' of item 'MatthewsPhone' could not be parsed correctly.
    org.eclipse.smarthome.model.item.BindingConfigPars eException: couldn't create Command from 'ON'

    Dem wollte ich dann mit einer Rule entgegen wirken. Dann läuft zwar alles weiter, aber die URL wird nicht aufgerufen.
    Code:
    rule "MatthewsPhonehttp"
    when
        Item MatthewsPhone received command
    then
        sendHttpGetRequest("http://meinserver.de/pfad/datei.php?param=" + receivedCommand.toString)
    end
    Habe ich da irgend einen Denkfehler drin, oder geht es generell nicht?

  • #2
    Warum nutzt Du nicht einfach ein Switch Item statt des Contact Items?

    Kommentar


    • #3
      Danke für die Antwort!
      Das hatte ich vergessen zu schreiben. Dann passiert gar nichts.
      Ich habe es einmal versucht über die rules und einmal direkt in die geschweiften Klammern (so wie im 2. Code Beispiel, nur statt Contact Switch).
      Im Log sehe ich den Wert zu "lastSeen" (ich frage nur online und lastSeen ab), aber nicht zu "online". In der UI wird der Status nicht angezeigt und der HTTP Request wird auch nicht ausgeführt.

      Kommentar


      • #4
        Hmm. Dann bleibt nur die Rule. Eventuell wird gar kein Command geschickt, sondern nur ein Update, bzw. ein Change. Dann müsste die Rule so aussehen:
        Code:
        rule "MatthewsPhonehttp"
        when
            Item MatthewsPhone received update
        // oder
        //  Item MatthewsPhone changed
        then
            sendHttpGetRequest("http://meinserver.de/pfad/datei.php?param=" + MatthewsPhone.state.toString)
        end
        Beim Update müsste man noch nachschauen, ob der Status sich geändert hat, um unnötige Requests zu vermeiden.

        Kommentar


        • #5
          Uhaaaa! Das wars! Besten Dank! Ich freu mich!!

          Darf ich hier gleich noch eine Frage stellen?
          Im Beispiel hatte ich ja schon erwähnt, dass es mehrere Variablen gibt. Zum Beispiel:
          Code:
          DateTime MatthewsPhoneLastSeen "Matthew's iPhone: Last Seen [%1$tH:%1$tM:%1$tS]" { channel="unifi:client:home:matthewsPhone:lastSeen" }
          Wie übergibt man die an die URL? Mir fehlt aufgrund meines flaches Wissens hinsichtlich des Variablenhandlings in openHAB wohl die Basics um Beispiele umzusetzen. Aber ich arbeite mich heran..

          Professionell wäre das, wenn man die Variablen in ein JSON Format bringen kann und diese dann per POST an den Server versendet. Wenn ich das richtig verstanden habe, kann man das mit folgendem Beispiel machen:
          Code:
          val String MY_URL = 'http://...'
          var String myData = '{
            "acState": {
            "on": false,
            "mode": "heat",
            "fanLevel": "auto",
            "targetTemperature": 22
            }
          }'
          
          sendHttpPostRequest(MY_URL, "application/x-www-form-urlencoded", myData)
          Falls ja muss ich jetzt nur noch wissen, wie ich MatthewsPhoneLastSeen dort hinein bekomme und wo ich die Deklaration hinschreibe (direkt nach "then"?).

          Kommentar


          • #6
            Autsch. Du machst es Dir nur unnötig schwer Vor allem ist das ja jetzt nicht eine Frage, sondern ein ganzer Packen voll. Aber der Reihe nach...

            1. MatthewsPhoneLastSeen ist keine Variable sondern ein Item. Items und Variablen sind zwei vollkommen unterschiedliche Dinge! Insbesondere muss man unterschiedlich mit ihnen umgehen.
            2. Da es sich um ein DateTime Item handelt, ist der Status des Items etwas in Richtung UNIX Timestamp. Entweder, Du übergibst den nackten Zahlenwert und lässt das auf Serverseite auswerten, oder Du überlässt openHAB diese Arbeit und übergibst einen String, der die Timestamp repräsentiert.
            Die Methode dazu heißt format, die wird auf den Status angewendet, also
            Code:
            MatthewsPhoneLastSeen.state.format("%1$tA")
            Das wäre ein kompletter Zeitstempel.

            Ob man das jetzt einfach als (Teil-)String an einen Server schickt, oder es vorher nach JSON oder XML umformt, hat meiner Ansicht nichts mit Professionalität zu tun sondern nur mit dem persönlichen Geschmack. Letztlich kommt es vor allem darauf an, was man auf der anderen Seite besonders bequem weiter verarbeiten kann.

            Kommentar


            • #7
              Danke!
              Da hast du Recht. JSON hin oder her.
              Ich habe aber noch nicht ganz verstanden, wie ich die Variablen als POST übergebe.
              Mache ich das einfach mit
              Code:
              var String myData = "param1=" + MatthewsPhone.state.toString + "&param2=" + MatthewsPhoneLastSeen.state.toString
              und packe das in den dritten Parameter?
              Oder erwartet der ne andere Syntax?
              Als GET möchte ich das nicht unbedingt machen wollen.

              Kommentar


              • #8
                Schau mal hier: http://docs.openhab.org/addons/actio...l#http-actions

                Kommentar


                • #9
                  Danke. Da steht ja im Prinzip das selbe wie oben schon erwähnt:
                  Code:
                  sendHttpPostRequest(MY_URL, "application/x-www-form-urlencoded", myData)
                  Mein Problem ist lediglich, wie ich die Daten in "myData" bekomme, so dass sie korrekt übergeben werden. Das meinte ich mit:
                  Code:
                  var String myData = "param1=" + MatthewsPhone.state.toString + "&param2=" + MatthewsPhoneLastSeen.state.toString

                  Kommentar


                  • #10
                    Damit geht es:
                    Code:
                    sendHttpPostRequest(CheckInURL, "application/x-www-form-urlencoded","action="+MatthewsPhone.state.toString+"&value="+MatthewsPhoneLastSeen.state.toString)
                    Keine Ahnung, wieso es nicht mit dem letzten Beispiel geklappt hat.

                    In PHP kann man das jetzt so ausgeben:
                    PHP-Code:
                    <?php
                    echo $_POST['action'] . " - "$_POST['value']; 
                    ?>

                    Kommentar

                    Lädt...
                    X