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: Alles auswählen
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: Alles auswählen
#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ß