Ankündigung

Einklappen
Keine Ankündigung bisher.

ESP8266 Werte an OpenHab Rest API übergeben

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    #16
    Zitat von FlyingEaglE Beitrag anzeigen
    muss mir mal in ruhe den link ansehen.
    ok, mal auf die schnelle geschaut, mag sein dass es auch mit GET geht. das verfahren als solches ist aber dann gleich.
    diese lib von imhofa erwähnt, macht nix anderes als das was hier im code steht im wesentlichen, außer das es das in einer klasse kapselt und dann der code übersichtlicher ist.
    Inwiefern dieser 2 Jahre alte github Code noch geht, vermag ich derzeit nicht zu sagen.

    Wäre aber schön, wenn es entsprechende Rückmeldungen eurerseits dann gibt und dieser Thread nicht wie so viele einfach aufhören.

    Kommentar


      #17
      Zitat von FlyingEaglE Beitrag anzeigen
      [CODE][...] ist dein benutzername : passwort wirklich so kurz?
      nein in wirklichkeit nicht so kurz, habe es fürs Forum auf "Name:Pass" gekürzt, muss ja nicht jeder decodieren können und die Daten dann kennen...

      Zitat von FlyingEaglE Beitrag anzeigen
      [...] Poste mal deinen kompletten Code

      Code:
      #include <ESP8266WiFi.h>
      #include <WiFiManager.h>
      
      // WLAN Zugangsdaten
      const char* ssid      = "SSIDdesWLANS";
      const char* password  = "PasswortdesWLANS";
      const char* datahost  = "192.168.0.5";
      const int httpPort = 8080;
      
      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);
      
          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");
          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(""); 
        }
      
      WiFiClient client;
      String url = "/rest/items/";
      url += "Windgeschwindigkeit/";
      url += "/state";
      String StateOfItem = "sc";
      client.print("POST ");
      client.print(url);
      client.println(" HTTP/1.1");
      client.print("Host: ");
      client.println(datahost);
      client.println(httpPort);
      client.println("Content-Type: text/plain");
      client.print("Authorization: ");
      client.println("Basic TkFNRTpQQVNT");
      client.print("Content-Length: ");
      client.println(StateOfItem.length());
      client.println();
      client.println(StateOfItem);
      client.println("Connection: close\r\n");  
      
      }
      @imhofa,

      mein großes Problem ist das ich von dem ESP und der Programmierung nicht wirklich Ahnung habe.
      Mein Ziel war es einfach Windgeschwindigkeit und Windrichtung darzustellen.

      Daraus ergab sich aus einem Blog (im ersten Beitrag verlinkt) die Möglichkeit, welche auch wunderbar funktioniert.
      Nur wollte ich diese angezeigten Werte natürlich auch irgendwie verarbeiten. Da kam dann meinen bisher eingesetzte Openhab Oberfläche ins Spiel. Ich weiß somit nur das man per Script (im curl PUT, hier anscheinend Post) die Werte übergeben kann.

      Den Beitrag auf Github von Br3nda habe ich dann gestern durch zufall auch gefunden und werde mal schauen inwiefern ich das umsetzen kann

      aber FlyingEaglE ist mir bisher ja eine sehr gute Hilfe und ich vertraue somit erstmal auf Ihn und versuche die Ratschläge umzusetzen.

      ich habe es so verstanden, dass er genau bei den rest-api-zeugs ein pw vorgeschaltet hat
      das bezieht sich nicht nur auf die Rest-Api, sondern auch die komplette Openhab Oberfläche ist nur mit Name+Passwort erreichbar, da die Homeautomationsoberfläche mit der Zeit auch immer weiter im Punkt "Haussicherheit" eingreift wollte ich noch eine zusätzliche Hürde haben die ein "Cyberkrimineller" hätte um an diese Daten zu gelangen.

      Kommentar


        #18
        Wie kompliziert wäre es denn, wenn du das PW-Gedönsel mal abstellst, dann wissen wir wenigstens ob der Code macht was er soll.
        Dann eben auch die Zeile mit dem Baisc auth raus.

        Und wie gesagt, der Git-Code von Br3nda ist quasi das gleiche nur gekapselt. Enthält aber auch keinerlei Authentifizierungscode.
        Vorteil wäre, das du in deinem Code nur noch einpaar wenige Zeilen hättest zum Senden.

        Hab das mal auf die Schnelle versucht anzupassen, probier das mal aus.
        Code:
        // Angepasst von: http://blog.bubux.de/windsensor-tx20-mit-esp8266/
        #include <ESP8266WiFi.h>
        #include <WiFiManager.h>
        
        // WLAN Zugangsdaten
        const char* ssid      = "<ssid>";
        const char* password  = "<passwort>";
        // Host wo Daten hingesendet werden soll
        const char* datahost  = "<host_name_ip>";
        
        unsigned long previousMillis = 0;
        const long interval = 300000;      // 300000ms = 5 Minuten Intervall
        
        ADC_MODE(ADC_VCC);
        
        const byte DATAPIN=2;
        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;
            }
        }
        
        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");
        
            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(1200);
            }
        
            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;
            }
        }
        
        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, "Windrichtung: %d\t%d\n", sb, se);
                Serial.write (a);
                sprintf(a, "Windgeschwindigkeit: %d\t%d\n", sc, sf);
                Serial.write (a);
                sprintf(a, "Pruefsumme: %d\t%d\n", sd, chk);
                Serial.write (a);
        
                if (validData)
                {
                    Serial.println("OK");
        
                    Serial.println("");
        
                    // 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;
        
                        Serial.println("");
                        Serial.print(F("Verbinde zu '"));
                        Serial.print(datahost);
                        Serial.print("'");
        
                        WiFiClient client;
                        const int httpPort = 8080;
        
                        if (!client.connect(datahost, httpPort))
                        {
                            Serial.println(F(" Fehler beim Verbinden zum Horst"));
                            return;
                        }
                        else
                        {
                            String url = "/rest/items/";
                            url += "Windgeschwindigkeit/";
                            url += "/state";
                            String StateOfItem = sc;
                            client.print("GET ");
                            client.print(url);
                            client.println(" HTTP/1.1");
                            client.print("Host: ");
                            client.println(datahost);
                            client.println("Content-Type: text/plain");
                            client.print("Authorization: ");
                            client.println("Basic TkFNRTpQQVNT");
                            client.print("Content-Length: ");
                            client.println(StateOfItem.length());
                            client.println();
                            client.println(StateOfItem);
                            client.println("Connection: close\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."));
                        }
                    }
                }
                else
                {
                    Serial.println("Fehler");
                }
            }
        
        }
        Schreibt denn der Webserver irgendwas in seine Logs?

        PS: Auch wenn hier ein anderer Ansatz gefragt ist, ich werde bei mir daheim das wesentliche mit MQTT an Daten übertragen. Das ist recht entspannt und es gibt ne recht gute Lib dafür, der Mosquitto ist auch schnell an den Start gebracht. Und dem kannst du per se Benutzeranmeldedaten mitgeben. Gibt dazu einen längeren Thread auf arduino.cc von mir, wo ich das mal in Code gebastelt habe. Die Lib ist nicht von mir.

        PPS: Hatte dir auch eine PN geschrieben.
        Zuletzt geändert von FlyingEaglE; 04.11.2017, 01:21.

        Kommentar


          #19
          Hallo Fly, mit dem Code geschieht auch nichts.
          Leider auch nichtmal ob der TX20 Daten empfängt.

          ich habe als Basis auch nicht den Bubux Blog genommen, sondern den Quellcode (angepasst an den Wemos D1 mini) von hier:

          https://github.com/bunnyhu/ESP8266_TX20_wind_sensor/

          dieser funktioniert an sich wunderbar (mit Serieller Ausgabe), darein habe ich aus dem BubuxBlog nur die WLAN Variablen übernommen.

          ich glaube ich habe noch einen Fehler gefunden, beim kompilieren sagt er immer einen Fehler bei:

          Code:
           
           String StateOfItem = sc;
          da hatte ich dann Testweise

          Code:
           
           String StateOfItem = "sc";
          draus gemacht, aber dann ist es ja keine Variable mehr oder?
          Kann es sein das er dann einfach den sc Wert nicht kennt und somit natürlich nichts übergeben kann?
          Im Openhab Log kommt rein garnichts an :-\

          Kommentar


            #20
            Ich nutze auch den ESP8266 aber ich gehe einen anderen Weg der zu 100% Fuktioniert.

            Ich nutze das MQTT Protokoll ( Internet oft things)
            Damit bin ich viel flexibler und bin nicht nur auf Openhab angewiesen. Ich kann die Daten auch anders anzeigen lassen.
            Man muss einen MQTT Broker installieren, sei es auf dem Raspy oder an einem NAS (Synology)
            nach Mosquitto suchen
            Zum Testen und debuggen nehme ich MQTTfx
            du must natürlich das Openhab MQTT addon installieren und deine Werte im MQTT Service eintragen.

            Wenn du einDiagramm erstellen willst brauchst du eine Persistance rrdj4j influx usw. dort must du eintragen was du loggen willst, oder nimm den Wildcard * für alles.

            Unbedingt den RC2.4.1 benutzen ,da wir einen gösseren seriellen Buffer brauchen.
            https://github.com/esp8266/Arduino/r...com_index.json to File-Preferences-Additional_Boards_Manager_URLs:

            Anbei mal 3 Beispiele.
            du hast sicher das DHT Temperatur Modul von Wemos zum Testen, damit kannst du einfache Wetterstationen bauen

            Damit hast du die Grundlage zum Testen.
            Das Arduino File ist als ZIP Anhang beigefügt.

            Beim ersten Beispiel werden 3 Datensätze übertragen

            1 ein Test wo ich mit der Hand 24 eingetragen habe Zeile 162 ;165 im Sketch
            2 die Luftfeuchtigkeit Zeile 171 im Sketch
            und 3 die Temperatur Zeile 176 im Sketch

            Das 2te Beispiel ist ebenfalls eine Wetterstation.

            Das 3te Beispiel ist die Komplette Auslesung und Visualisierung eines smarten Stromzählers Smartmeter ( Smarty) hier in Luxemburg.

            dort wird die P1 Schnittstelle ausgelesen. Der Stromzähler ist RSA verschlüsselt und die komplette RSA Entschlüsselung übernimmt der ESP8266.
            Das komplette Openhab2 ist mit in der ZIP Datei.
            Angehängte Dateien
            Zuletzt geändert von dididimp; 08.11.2017, 20:34.

            Kommentar


              #21
              Ja, MQTT erwähnte ich bereits. Ist am Ende die schönere "IoT-konformere" Lösung :-)

              PS: Mein TX20 ist eingetroffen, mal sehen wie weit ich komme ;-)
              Zuletzt geändert von FlyingEaglE; 10.11.2017, 19:51.

              Kommentar

              Lädt...
              X