ESP8266 Werte an OpenHab Rest API übergeben

Themen auf die es innerhalb eines Jahres keine Antwort gab, werden hier archiviert.

Moderatoren: Cyrelian, seppy, udo1toni

Gesperrt
desidia
Beiträge: 22
Registriert: 20. Okt 2017 23:15

ESP8266 Werte an OpenHab Rest API übergeben

Beitrag von desidia »

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)

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"
weiß nur nicht wie ich den in den Code integriere...

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&auml;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."));
}
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ß

Gesperrt