Wenn dies dein erster Besuch hier ist, lies bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Du musst dich vermutlich registrieren, bevor du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um den Registrierungsprozess zu starten. Du kannst auch jetzt schon Beiträge lesen. Suche dir einfach das Forum aus, das dich am meisten interessiert.
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).
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.
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.
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
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
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":
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
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
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?
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
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Kommentar