NEWS
Arduino und RestfulAPI
-
@thisoft Was steht denn im IPString?
-
@mcu Im IPString steht die IP-Adresse - ist doch aber eigentlich auch egal solange eben irgend welche Zeichen drinstehen - oder?
String IPString = "192.168.137.30";
-
@thisoft Wenn ich es richtig verstehe, möchtest du die IP von deinem Ardunio an ioBroker senden über simpleApi?
https://github.com/amcewen/HttpClient/blob/master/examples/SimpleHttpExample/SimpleHttpExample.ino
Nach dem Beispiel würde es ausreichen, wenn http.get genutzt wird (192.168.178.80 Beispiel musst du mit Deiner ioBroker-IP ersetzen)EthernetClient client; HttpClient http(client); String postData; String IPString = '192.168.178.30'; postData = "?value=" + IPString; err = http.get('192.168.178.80:8087', '/set/javascript.1.Regenwasser.RegentankDuino.IP'+postData); if (err = 0) { Serial.print("Connect ok Data send"); } else { Serial.print("Connect failed: "); Serial.println(err); } http.stop();
-
@mcu Ja das verstehst du richtig. Wobei die IP jetzt nur erstmal zum Testen ist.
Du hast mir auf jeden Fall erstmal weitergeholfen indem der von dir verlinkte HttpClient mir schon mal wesentlich besser zusagt als der "ArduinoHttpClient" den ich da bisher im Einsatz hatte.
Im Prinzip klappt das wie in deinem Beispiel angegeben. Allerdings bekomme ich immer nur eine -1 in err, also "keine Verbindung" wenn ich das richtig sehe. Die Ethernet-Verbindung steht aber, zumindest kann ich über den EthernetClient erfolgreich eine MQTT-Verbindung aufbauen. Ebenso hab ich den API-Aufrufstring erfolgreich im Browser getestet.
Ich bin im Moment etwas ratlos und mach für heute erstmal Schluss. Vielleicht habe ich ja morgen den Geistesblitz... oder du siehst meinen Fehler... -
@thisoft lt. Beschreibung:
int get(const char* aServerName, uint16_t aServerPort, const char* aURLPath, const char* aUserAgent =NULL)
versuch mal den get anders:
EthernetClient client; HttpClient http(client); String postData; String IPString = '192.168.178.30'; postData = "?value=" + IPString; err = http.get('192.168.178.80',8087, '/set/javascript.1.Regenwasser.RegentankDuino.IP'+postData,''); if (err = 0) { Serial.print("Connect ok Data send"); } else { Serial.print("Connect failed: "); Serial.println(err); } http.stop();
Mit WiFi hab ich es hinbekommen, EthernetClient nicht im Einsatz.
Hab es nur mit #include <ESP8266WiFi.h> gemacht auf einem D1 Mini.#include <ESP8266WiFi.h> const char ssid[] = "DeineWLANSSID"; const char pass[] = "DeinWLANPasswort"; int werteCount = 0; //IPAddress server(74,125,232,128); // numeric IP for Google (no DNS) IPAddress server(192, 168, 178, 89); // ioBroker //char server[] = "www.google.com"; // name address for Google (using DNS) WiFiClient client; void printWiFiStatus() { Serial.print("SSID: "); Serial.println(WiFi.SSID()); IPAddress ip = WiFi.localIP(); Serial.print("IP Address: "); Serial.println(ip); long rssi = WiFi.RSSI(); Serial.print("signal strength (RSSI):"); Serial.print(rssi); Serial.println(" dBm"); } void setup() { Serial.begin(115200); WiFi.begin(ssid, pass); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(1000); } Serial.println("Connected to wifi"); printWiFiStatus(); Serial.println("\nStarting connection to server..."); if (client.connect(server, 8087)) { Serial.println("connected to server"); // Make a HTTP request: client.println("GET /set/0_userdata.0.Power1?value=20 HTTP/1.1"); client.println("Connection: close"); client.println(); client.stop(); } } void loop() { delay(10000); if (client.connect(server, 8087)) { Serial.println("connected to server"); // Make a HTTP request: werteCount++; //String Senden ="GET /set/0_userdata.0.Power1?value=" + werteCount + " HTTP/1.1"; //sprintf(senden,"GET /set/0_userdata.0.Power1?value=%i HTTP/1.1",werteCount); String Senden = "GET /set/0_userdata.0.Power1?value=" + String(werteCount) + " HTTP/1.1"; client.println(Senden); //client.println("Host: www.google.com"); client.println("Connection: close"); client.println(); Serial.println("Daten wurde gesendet"); client.stop(); } }
-
@mcu Vielen Dank für Deine Bemühungen!
Ich hatte gestern nur wenig Zeit, aber dein erster Vorschlag hat so auch nicht funktioniert.
Der Weg mit dem ESP-WiFi dürfte funktionieren. Das habe ich mit einem ESP auch schon mal so realisiert. Allerdings will ich bei diesem Projekt explizit einen Arduino mit LAN-Verbindung verwenden da ich den LAN-Anschluss dort zur Verfügung habe und WLAN soweit möglich vermeiden möchte.
Das kann doch eigentlich gar nicht so schwierig sein - vermutlich übersehe ich nur irgend eine Kleinigkeit...
-
@thisoft Hier noch ein anderes Beispiel
/* * Created by ArduinoGetStarted.com * * This example code is in the public domain * * Tutorial page: https://arduinogetstarted.com/tutorials/arduino-http-request */ #include <SPI.h> #include <Ethernet.h> // replace the MAC address below by the MAC address printed on a sticker on the Arduino Shield 2 byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; EthernetClient client; int HTTP_PORT = 8087; String HTTP_METHOD = "GET"; char HOST_NAME[] = "192.168.178.80"; String PATH_NAME = "/set/0_userdata.0.Power0"; String queryString = "?value=70";; void setup() { Serial.begin(9600); // initialize the Ethernet shield using DHCP: if (Ethernet.begin(mac) == 0) { Serial.println("Failed to obtaining an IP address using DHCP"); while(true); } // connect to web server on port 80: if(client.connect(HOST_NAME, HTTP_PORT)) { // if connected: Serial.println("Connected to server"); // make a HTTP request: // send HTTP header client.println(HTTP_METHOD + " " + PATH_NAME + queryString + " HTTP/1.1"); client.println("Host: " + String(HOST_NAME)); client.println("Connection: close"); client.println(); // end HTTP header // send HTTP body //client.println(queryString); while(client.connected()) { if(client.available()){ // read an incoming byte from the server and print it to serial monitor: char c = client.read(); Serial.print(c); } } // the server's disconnected, stop the client: client.stop(); Serial.println(); Serial.println("disconnected"); } else {// if not connected: Serial.println("connection failed"); } } void loop() { }
-
@mcu Super, das funktioniert
Du bist mein Held! Danke! Und was mir am Besten daran gefällt ist dass man keinerlei zusätzliche Lib o.ä. braucht.
Allerdings kommt da jetzt gleich meine nächste Frage ;-), kann man jetzt über die RestfulAPI auch was an den Arduino senden? Also so dass man innerhalb des "if(client.available())" darauf reagieren könnte?
-
@thisoft Reicht es nicht, wenn du im loop mit getPlainvalue abfragst "Soll ich was holen?"
Oder halt direkt die Werte abfragen, die du holen willst. -
@mcu Ja, du hast schon recht, das reicht auch.
Vielen Dank nochmal.