Ankündigung

Einklappen
Keine Ankündigung bisher.

Support Thread für das Webservices Plugin

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

    #16
    Hallo,

    ich muss doch nochmal nachfragen. Ich bin sicher kein Fachmann, aber bei dem WebServices Plugin geht es doch um eine REST api, oder?

    Kommentar


      #17
      Sisamiwe ich habe eine REST API zu SmartHomeNG gebaut, ja. Mit dieser greifst du lesend/schreibend auf Items und lesend auf Itemsets zu. Das Datenformat ist dabei JSON, zudem kann man nur den Itemwert oder auch alle Metadaten abfragen (ersteres damit meine Apps am Handy/Uhr nicht 1000 unnötige Daten empfangen müssen).

      Im Übrigen ist das alles sehr akribisch in der README beschrieben: https://github.com/smarthomeNG/plugi...ices/README.md

      Das hilft Dir aber nichts, wenn Du externe APIs auslesen und weiterverarbeiten willst.

      Daneben gibt es noch eine "Simple" Webservices API, die im Unterschied zu REST (dort: PUT, POST) erlaubt, Werte direkt über die URL in einem GET Request ins Item zu schreiben.

      Ich habe den Namen so allgemein auf "Webservices" gelassen, damit auch andere Protokolle (bspw SOAP) eines Tages dazu können.


      Willst Du eine API auslesen empfehle ich eine Logik oder ein Plugin. Hier als Beispiel: https://github.com/smarthomeNG/plugi...init__.py#CL68
      Zuletzt geändert von psilo; 11.03.2018, 13:26.

      Kommentar


        #18
        In unserem neuen BLOG habe ich einen Artikel zum Plugin untergebracht: https://www.smarthomeng.de/das-smart...ervices-plugin

        In Zukunft stelle ich auch noch Anwendungsfallbeispiele, wie eine ESP32 Nutzung und die Anzeige auf Garmin Uhren ein.

        Kommentar


          #19
          Hallo an die Profis,

          ich verscuhe nun seit geraumer Zeit meine Aussentemperatur von einem ESP8266.client an das Webservices plugin von SmarthomeNG zu senden. Leider schaffe ich es nicht. Ich habe auch die Anleitung von https://www.smarthomeng.de/das-smart...ervices-plugin gelesen aber irgendwie werden ich daraus nicht schlau. Bin jetzt nicht der Crack in solchen Sachen. Es funktioniert alles soweit mit den Items usw. auch wenn ich die URL im Browser eingebe kann ich z.B. ein Licht schalten oder Tempwerte in einem plot anzeigen lassen. Die URL lautet:
          (url) http://IP-von Raspi:8384/ws/item/Aussenbereich.Temperatur/value

          Nun wollte ich das ganze über die REST API in meinem ESP8266 implementieren dazu lautet die URL nur geringfügig anders:
          (url) http://IP-von Raspi:8384/rest/item/Aussenbereich.Temperatur/value

          Mein Code (Ausschnitt) den ich über Arduino IDE auf den ESP8266 gespielt habe sieht folgendermassen aus:
          Code:
          WiFiClient client;
          
             if(client.connect(host, 8384)){
              Serial.println("connected");
             } else {
              Serial.println("not connected");
             }
          
          
            Serial.print("Requesting URL: ");
            Serial.println(url); //meine URL als String übergeben siehe 2.te URL oben
          
            // This will send the request to the server
            HTTPClient http;    //Declare object of class HTTPClient
          
             http.begin(url);      //Specify request destination
             http.addHeader("Content-Type", "application/json");  //Specify content-type header
          
             int httpCode = http.POST(url);   //Send the request
             String payload = http.getString();                  //Get the response payload
          
             Serial.println(httpCode);   //Print HTTP return code
             Serial.println(payload);    //Print request response payload
          
             http.end();  //Close connection
          Bei httpCode erscheint dann im Seriellen Monitor Fenster "-1" und Payload liefert gar nichts zurück. Vermutlich weil ich die Syntax nicht beherrsche.
          Könnte mir jemand helfen?

          Gruß Thorsten
          Zuletzt geändert von Hellbounda; 06.04.2018, 21:35.
          Anfänger in Sachen KNX:
          Computer: Win 7 32bit
          Software: ETS5; IP-Router: Weinzierl 752 secure
          Spannungsversorgung: ABB SU/S 30.640.1
          SmarthomeNG:1.4; SmartVisu: 2.8

          Kommentar


            #20
            geht es denn vom esp ohne rest? weil ich auch nicht tagtaeglich c code schreibe, habe ich es im tutorial (das zum esp32, siehe ein post weiter unten) daher ueber das simple if gemacht. kann es die tage aber auch mal mit rest testen

            da ich in 2 wochen neben Familie, arbeit und osterurlaub aber ca 30 seiten blogposts geschrieben habe, kann ich nicht auf jede sonderkonstellation eingehen
            Zuletzt geändert von psilo; 07.04.2018, 06:08.

            Kommentar


              #21
              ps: du musst den wert den du schreiben willst bei REST in den http body schreiben. das sehe ich in deinem code nicht?

              willst du auslesen musst du einen http get machen. im master branch koennte es zudem sein, dass anstatt Post nur ein http Put geht um werte via REST zu schreiben.

              teste das doch einfach mit der chrome extension die ich im webservice artikel zeige. danach solltest du die unterschiede zw rest und simple interface verstehen

              wenn du nicht auf rest beharrst hilft dir vielleicht auch https://www.smarthomeng.de/entfernun...nd-smarthomeng
              Zuletzt geändert von psilo; 07.04.2018, 06:37.

              Kommentar


                #22
                Guten Morgen Psilo,

                Code:
                void sendHttpData(String url) {
                
                   WiFiClient client;
                
                   if(client.connect(host, 8384)){
                    Serial.println("connected");
                   } else {
                    Serial.println("not connected");
                   }
                
                
                  Serial.print("Requesting URL: ");
                  Serial.println(url);
                
                  // This will send the request to the server
                  HTTPClient http;    //Declare object of class HTTPClient
                
                   http.begin("http://192.168.178.41:8384/rest/items/Aussenbereich.Luftfeuchtigkeit/");      //Specify request destination
                   http.addHeader("Content-Type", "application/json");  //Specify content-type header
                
                   int httpCode = http.GET();   //Send the request
                   String payload = http.getString();                  //Get the response payload
                
                   Serial.println(httpCode);   //Print HTTP return code
                   Serial.println(payload);    //Print request response payload
                   httpCode = http.POST("http://192.168.178.41:8384/rest/items/Aussenbereich.Luftfeuchtigkeit/45");   //Send the request
                   payload = http.getString();                  //Get the response payload
                   Serial.println(httpCode);   //Print HTTP return code
                   Serial.println(payload);    //Print request response payload
                   http.end();  //Close connection
                }
                Dann sieht mein Serieller Monitor folgendermassen aus:

                Code:
                connected
                Requesting URL: 192.168.178.41:8384/rest/items/Aussenbereich.Temperatur/23.90
                200
                {"value": 45, "path": "Aussenbereich.Luftfeuchtigkeit"}
                400
                <!DOCTYPE html>
                <head>
                    <link rel="stylesheet" href="/static/css/font-awesome.min.css" type="text/css"/>
                    <link rel="stylesheet" href="/static/css/bootstrap.min.css" type="text/css"/>
                    <link rel="icon" href="/static/img/favicon.ico" type="image/png">
                </head>'
                <body>
                    <h1 class="margin-base-vertical">
                        &nbsp;<img src="/static/img/logo_small_120x120.png" width="40" height="40" style="vertical-align:top">
                        &nbsp; Oops, Error 400:
                    </h1>
                    <br>
                    <h3>
                        &nbsp;Invalid JSON document
                    </h3>
                    <br>
                    <h5 style="color: #2269aa;"> </h5>
                </body>
                Es kann eigentlich nur noch ein kleiner Fehler in der Syntax bei http.POST sein. Ich erkenne ihn aber irgendwie nicht.
                Im Prinzip benötigt er wohl 2 Werte, da er mir ja auch beim GET request 2 liefert (siehe Monitor). Einmal den "Value" und zum anderen den "Path":

                {"value": 45, "path": "Aussenbereich.Luftfeuchtigkeit"}
                Weit kann ich vom Ziel nicht mehr entfernt sein.......

                Gruß Thorsten
                Anfänger in Sachen KNX:
                Computer: Win 7 32bit
                Software: ETS5; IP-Router: Weinzierl 752 secure
                Spannungsversorgung: ABB SU/S 30.640.1
                SmarthomeNG:1.4; SmartVisu: 2.8

                Kommentar


                  #23
                  du hast schon gelesen was ich oben schreibe? du gibst dem post keine daten zum senden mit. diverse ansaetze zum test stehen oben

                  Kommentar


                    #24
                    achja ausserdem steht bei dir der wert bei REST in der url. das geht natuerlich nicht. nach rest standard muss dieser im payload der post/put daten stehen. daher kennt cherrypy deine url nicht. alternativ das simple ws interface nutzen. das gibt es damit der wert via url uebergebbar ist.

                    das nutze ich auch im esp32 artikel..

                    so genug handygetippse. ich widme mich jetzt der familie. du hast genug anhaltspunkte
                    Zuletzt geändert von psilo; 07.04.2018, 06:45.

                    Kommentar


                      #25
                      Alles klar, ich werde mich den Ansätzen widmen und es versuchen. Ich poste es dann hier. Ich wünsche Dir und Deiner Familie ein schönes Wochenende.
                      Gruß Thorsten
                      Anfänger in Sachen KNX:
                      Computer: Win 7 32bit
                      Software: ETS5; IP-Router: Weinzierl 752 secure
                      Spannungsversorgung: ABB SU/S 30.640.1
                      SmarthomeNG:1.4; SmartVisu: 2.8

                      Kommentar


                        #26
                        machs einfach wie in meinem esp32 artikel. ein GET mit wert in der url gegen die simple webservices und nicht die REST url

                        Kommentar


                          #27
                          Hier übrigens das REST Beispiel. Im DEV geht das mit PUT und POST, im Master vermutlich nur wie hier mit PUT dargestellt:

                          Code:
                           if (client.connect(host, port)) {
                               HTTPClient http;    //Declare object of class HTTPClient
                               char portStr[12];
                               sprintf(portStr, "%d", port);
                               char url[128];
                               sprintf(url, "http://%s:%s/rest/items/%s", host, portStr, cm_item);
                               http.begin(url);  //Specify request destination
                               Serial.println(url);
                               http.addHeader("Content-Type", "application/json");                //Specify content-type header
                               char cmStr[12];
                               sprintf(cmStr, "%f", cm);
                               int httpCode = http.PUT(cmStr);                                    //Send the request
                               String payload = http.getString();                                 //Get the response payload
                               Serial.println(payload);  
                               Serial.println(httpCode);                                          //Print HTTP return code
                               http.end();            
                          }
                          Ich habe das Beispiel in https://www.smarthomeng.de/entfernun...nd-smarthomeng hinzugefügt.

                          Die Beispiele sind im Webservices-Artikel nun auch prominent verlinkt.
                          Zuletzt geändert von psilo; 07.04.2018, 09:03.

                          Kommentar


                            #28
                            Hellbounda hat meine REST Implementierung weitergeholfen?

                            Kommentar


                              #29
                              psilo

                              Ich möchte an der Stelle weitermachen, um noch eine zweite ESP Firmware und deren REST API testen.
                              Es handelt sich um ESPURNA. Eine Beschreibung des REST API gibt es hier.

                              Mit dieser Firmware kann man unter anderem den WIFI RGBWW Dimmer H801 einbinden.

                              Nun nutzt diese Firmware einen API Key. Zitat:
                              This is the key you will have to pass with every HTTP request to the API, either to get or write values. All API calls must contain the apikey parameter with the value above. To know what APIs are enabled do a call to /apis.
                              Wie müsste man das WebServiceInterfacePlugin konfigurieren, damit die Integration klappt?

                              Danke für die Rückmeldung.

                              Kommentar


                                #30
                                verstehe ich richtig, dass du auf eine rest api zugreifen willst? dazu ist das plugin nicht gedacht. es bietet selber eine an. nimm doch einfach requests als python lib

                                Kommentar

                                Lädt...
                                X