Hallo,
ich möchte über meinen Wemos D1 mini (EPS8266) die Daten meines Windmessers (Technoline TX20) auslesen. Der Löwenanteil dabei hat mir http://blog.bubux.de/windsensor-tx20-mit-esp8266/ geholfen bzw. bunnyhu https://github.com/bunnyhu/ESP8266_TX20_wind_sensor/ .
Jetzt ist mein Problem das ich die Daten (Windgeschwindigkeit + Windrichtung) gerne per curl an die Openhab Rest API senden würde.
Ich habe im prinzip den Curl Befehl (von einer Raspi-Integration die ich schon die Rest läuft)
weiß nur nicht wie ich den in den Code integriere...
Kann mir da wer helfen?
Mein kompletter Sketch ist bisher:
in dem Sketch gibt es schon 3 Varianten des Abrufens:
1) Website die man aufrufen kann, Daten werden angezeigt
2) Daten per JSON abrufen (an der Website-URL angehangen)
3) Daten vom ESP senden an eine Website
Nun wäre das 3. im Prinzip das senden, aber ich steige beim Code nicht durch. Wie kriege ich meine Rest-API angesprochen?
Diese ist erreichbar unter: "http://192.168.0.5:8080/rest/items/"$item"/state"
Danke!
Gruß
ich möchte über meinen Wemos D1 mini (EPS8266) die Daten meines Windmessers (Technoline TX20) auslesen. Der Löwenanteil dabei hat mir http://blog.bubux.de/windsensor-tx20-mit-esp8266/ geholfen bzw. bunnyhu https://github.com/bunnyhu/ESP8266_TX20_wind_sensor/ .
Jetzt ist mein Problem das ich die Daten (Windgeschwindigkeit + Windrichtung) gerne per curl an die Openhab Rest API senden würde.
Ich habe im prinzip den Curl Befehl (von einer Raspi-Integration die ich schon die Rest läuft)
Code:
curl -u Benutzername:Passwort -s -X PUT -H "Content-Type: text/plain" -d $value "http://192.168.0.5:8080/rest/items/"$item"/state"
Kann mir da wer helfen?
Mein kompletter Sketch ist bisher:
Code:
#include <ESP8266WiFi.h> #include <WiFiManager.h> // WLAN Zugangsdaten const char* ssid = "TX20Test"; const char* password = "12345678"; // Host wo Daten hingesendet werden soll const char* datahost = "192.168.0.5"; unsigned long previousMillis = 0; const long interval = 300000; // 300000ms = 5 Minuten Intervall WiFiServer server(80); ADC_MODE(ADC_VCC); const byte DATAPIN=D2; volatile boolean TX20IncomingData = false; unsigned char chk; unsigned char sa,sb,sd,se; unsigned int sc,sf, pin; String tx20RawDataS = ""; void isTX20Rising() { if (!TX20IncomingData) { TX20IncomingData = true; } } /* * SETUP */ void setup() { pinMode(DATAPIN, INPUT); attachInterrupt(digitalPinToInterrupt(DATAPIN), isTX20Rising, RISING); Serial.begin(115200); delay(10); Serial.println(); Serial.println(); WiFiManager wifiManager; // AP deaktivieren WiFi.softAPdisconnect(); WiFi.disconnect(); WiFi.mode(WIFI_STA); delay(100); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); server.begin(); Serial.println("Server started"); Serial.println(WiFi.localIP()); } boolean readTX20() { int bitcount=0; sa=sb=sd=se=0; sc=0;sf=0; tx20RawDataS = ""; for (bitcount=41; bitcount>0; bitcount--) { pin = (digitalRead(DATAPIN)); if (!pin) { tx20RawDataS += "1"; } else { tx20RawDataS += "0"; } if ((bitcount==41-4) || (bitcount==41-8) || (bitcount==41-20) || (bitcount==41-24) || (bitcount==41-28)) { tx20RawDataS += " "; } if (bitcount > 41-5){ // start, inverted sa = (sa<<1)|(pin^1); } else if (bitcount > 41-5-4){ // wind dir, inverted sb = sb>>1 | ((pin^1)<<3); } else if (bitcount > 41-5-4-12){ // windspeed, inverted sc = sc>>1 | ((pin^1)<<11); } else if (bitcount > 41-5-4-12-4){ // checksum, inverted sd = sd>>1 | ((pin^1)<<3); } else if (bitcount > 41-5-4-12-4-4){ // wind dir se = se>>1 | (pin<<3); } else { // windspeed sf = sf>>1 | (pin<<11); } delayMicroseconds(1220); } chk= ( sb + (sc&0xf) + ((sc>>4)&0xf) + ((sc>>8)&0xf) );chk&=0xf; delayMicroseconds(2000); // just in case TX20IncomingData = false; if (sa==4 && sb==se && sc==sf && sd==chk){ return true; } else { return false; } } /* * LOOP */ void loop() { if (TX20IncomingData) { char a[90]; boolean validData = readTX20(); Serial.println(tx20RawDataS); sprintf(a, "ID: %d\t%d\n", sa, B00100); Serial.write (a); sprintf(a, "Wind direction: %d\t%d\n", sb, se); Serial.write (a); sprintf(a, "Wind speed: %d\t%d\n", sc, sf); Serial.write (a); sprintf(a, "Checksum: %d\t%d\n", sd, chk); Serial.write (a); if (validData){ Serial.println(" :) OK :) OK :) OK :) OK"); } else { Serial.println(" !!! ERROR !!! ERROR !!!"); } Serial.println(""); } Serial.println(""); // Pruefen ob sich ein Client verbunden hat WiFiClient client = server.available(); if (!client) { return; } // Warten bis der Client Daten sendet Serial.println("neuer Client"); while(!client.available()){ delay(1); } // Lese die erste Zeile der Anfrage String req = client.readStringUntil('\r'); Serial.println(req); client.flush(); // WIFI Signalstaerke auslesen long rssi = WiFi.RSSI(); Serial.print("RSSI:"); Serial.println(rssi); // Batteriespannung auslesen float vcc = ESP.getVcc() / 1000.0; /* "externe" Webseite aufrufen um Sensordaten zu übergeben unsigned long currentMillis = millis(); if(currentMillis - previousMillis >= interval) { previousMillis = currentMillis; sendData(); } */ // Anfrage an ESP-Webserver beantworten int val; String content; if (req.indexOf("/json") != -1) { // Sensordaten als JSON zurueck liefern // http://<url_zum_esp>/json Serial.println("JSON"); content = "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n"; //content += "{"Windgeschwindigkeit":"; content += sc; //content += ","Windrichtung":"; content += sb; content += "}\n"; } else { // Sensordaten als Webseite anzeigen Serial.println("HTML"); content = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html><head><title>Windsensor</title></head><body>\r\n"; //style="font-family:verdana;"; content += "<p style='font-size:18px;font-weight:bold;'>Windsensor</p><br>"; content += "<table>"; content += "<tr><td>Windgeschwindigkeit</td><td>"; content += sc; content += "</td></tr><tr><td>Windrichtung</td><td>"; content += sb; content += "</td></tr>"; content += "<tr><td><br></td><td></td></tr>"; content += "<tr><td>WIFI-Signal</td><td>"; content += rssi; content += " dBm</td>"; content += "<tr><td>Signal Qualität</td><td>"; content += 2 * (rssi + 100); content += "%</td></tr>"; content += "<tr><td>Batteriespannung</td><td>"; content += vcc; content += " V</td></tr>"; content += "</table>"; content += "</body></html>\n"; } // Senden der Antwort zum Webserver client.print(content); delay(1); Serial.println("Client Verbindung beendet"); } // Verbindung zu Server herstellen und Sensordaten übermitteln (aktiv) void sendData() { Serial.println(""); Serial.print(F("Verbinde zu '")); Serial.print(datahost); Serial.print("'"); WiFiClient client; const int httpPort = 80; if (!client.connect(datahost, httpPort)) { Serial.println(F(" Fehler beim verbinden zum Host")); return; } String url = "/umwelt/windsensor.php"; url += "?windgeschwindigkeit="; url += sc; url += "&windrichtung="; url += sb; Serial.print("URL-Anfrage: "); Serial.println(url); client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + datahost + "\r\n" + "Connection: close\r\n\r\n"); unsigned long timeout = millis(); while (client.available() == 0) { if (millis() - timeout > 5000) { Serial.println("[Client Timeout]"); client.stop(); return; } } while(client.available()){ String line = client.readStringUntil('\r'); Serial.print(line); } Serial.println(""); Serial.print(F("Verbindung zu '")); Serial.print(datahost); Serial.println(F("' beendet.")); }
1) Website die man aufrufen kann, Daten werden angezeigt
2) Daten per JSON abrufen (an der Website-URL angehangen)
3) Daten vom ESP senden an eine Website
Nun wäre das 3. im Prinzip das senden, aber ich steige beim Code nicht durch. Wie kriege ich meine Rest-API angesprochen?
Diese ist erreichbar unter: "http://192.168.0.5:8080/rest/items/"$item"/state"
Danke!
Gruß
Kommentar