Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Anleitung: Wemos Sketch mit Sensoren

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Anleitung: Wemos Sketch mit Sensoren

    This topic has been deleted. Only users with topic management privileges can see it.
    • bahnuhr
      bahnuhr Forum Testing Most Active last edited by bahnuhr

      Guten Abend,

      da ich selber sehr lange gesucht habe und mir hi und da Skript-Schnipsel angeschaut habe stelle ich hier mal meine Lösung (Sketch) für den D1 mini mit o.g. Sensoren rein.

      Was kann der Sketch:

      • Ultraschallsensor
        Hier wird die Distance ermittelt
      • BME280
        Hier wird Temperatur, Luftfeuchtigkeit, Luftdruck ermittelt.
      • Anbindung an iob per mqtt
        Habe eine neue Instanz in iob mit dem Port 1884 (könnt ihr aber im Sketch ändern) als broker installiert.
        Daten werden dann vom Wemos bei Veränderungen (diese könnt ihr definieren im Sketch) nach einer gewissen vergangenen Zeit (auch änderbar) an iob übertragen. Weiterhin wird an iob übertragen was geändert wurde (in dem Objekt "Meldung".
        Bei den Objekten sieht es dann so aus.
        34018bc5-47c4-4554-9c4f-fe2c992646e0-image.png
      • Webserver
        Per URL (z.B. 192.168.xxx.xx) kann im Browser eine Status-Anzeige angezeigt werden.
        7eaefdf5-baf0-44df-8fec-1262a859d7b8-image.png
        Per URL (z.B. 192.168.xxx.xx/wert?alti=400) kann dann z.B. die altitude im Sketch angepasst werden.

      Und nun das Sketch:

      // ************************************************************
      // Wemos-Sketch: Basis
      // inkl. Ultraschall, BME280, Wifi, MQTT, Webserver, Time
      // 5/2019 bahnuhr, Dieter Mueller
      // ************************************************************
          #include <ESP8266WiFi.h>
          #include <WiFiClient.h>
          #include <ESP8266WebServer.h>
          #include <ESP8266mDNS.h>
          #include <MQTT.h>
          #include <Wire.h>
          #include <NTPtimeESP.h>
          #include "cactus_io_BME280_I2C.h"
      // ************************************************************
      // Eingaben machen:
      // ************************************************************
      // BME 280
          int alti = 314; // aktuelle Hoehe über Meeresspiegel = Altitude -> zur Korrektur von pressure
      // Network Wifi
          String ssid = "Mueller-xxxx";
          const char* password = "abcdefg";
          IPAddress ip = ipaddr_addr("192.168.xxx.xx"); // feste IP-Adresse fuer den WeMos
      // MQTT
          const char* mqtt_user = "abcde"; // Benutzername der MQTT-Instanz auf dem IoBroker
          const char* mqtt_passwd = "ccc"; // Passwort der MQTT-Instanz auf dem IoBroker
          const char* mqtt_ip = "192.168.xxx.xx"; // IP Adresse des IoBroker
          int mqtt_port = 1884; // Port des IoBroker
          const char* mqtt_name = "Wemos-Test"; // Name des Wemos der in IoBroker im Adapter MQTT unter info angezeigt wird.
      // Wemos-System
          String Wemos_Device = "Test";   // z.B. Heizoel
         
      // ************************************************************
      // ab hier keine Veränderung mehr !
      // ************************************************************
      // HC-SR04 Ultraschall        // VCC = 5V ; GND an GND ; echo an D7 ; trig an D6
          #define echoPin D7   // Echo Pin
          #define trigPin D6   // Trigger Pin
          int maximumRange = 200;  int minimumRange = 0; // Maximum und Minimum range needed
          float duration, distance, distance_alt; // Duration used to calculate distance
      // BME280                     // VCC = 3,3V ; GND an GND ; SCL an D1 ; SDA an D2
          BME280_I2C bme(0x76);  // I2C using address 0x76
          float hPa_alt, Grad_alt, feuchte_alt;  // alte Werte
          int hPa_korrektur; 
      // Network Wifi
          IPAddress gateway = ipaddr_addr("192.168.xxx.1"); // IP-Adresse des WLAN-Gateways
          IPAddress subnet = ipaddr_addr("255.255.255.000"); // Subnetzmaske
          IPAddress dns1 = ipaddr_addr("8.8.8.8");//dns 1
          IPAddress dns2 = ipaddr_addr("8.8.4.4");//dns 2
          long rssi_alt; // Signalstärke alt
      // MQTT
          String mqtt_send = "nein";
          WiFiClient net;
          MQTTClient client;
      // Wemos-System
         int serial = 9600; // Übertragungsgeschwindigkeit Serial
         int loop_delay = 3000;  // in ms - Delay in Loop
         int loop_mqtt = 5000;  // in ms - Delay MQTT
         unsigned long letzteMillis_mqtt = 0;   // speichern last time
         int loop_verbindung = 300000;  // in ms - Delay Verbindung -> alle 5 Min. Wifi und mqtt prüfen
         unsigned long letzteMillis_verbindung = 0;   // speichern last time
      // Time
         NTPtime NTPch("2.de.pool.ntp.org");   // Choose server pool as required
         strDateTime dateTime;
         int time_offset = 1;  // offset 1 Std.
         int time_summertime = 1;  // 1=Sommerzeit
         String dayStr = ""; String monatStr = ""; String jahrStr = ""; String stdStr = ""; String minStr = ""; String sekStr = ""; 
      //Server
         ESP8266WebServer server(80);
      
      
      // *************************************************
      // Unterprogramm: void setup
      // *************************************************
      void setup()  {
        Serial.begin(serial);
        // Ultraschall
          pinMode(trigPin, OUTPUT);
          pinMode(echoPin, INPUT);
        // BME 280
          if (!bme.begin()) {
            Serial.println("Es konnte kein BME280 Sensor gefunden werden!");
            Serial.println("Bitte überprüfen Sie die Verkabelung!");
            while (1);
          }
            bme.setTempCal(-1);
        // WiFi, MQTT, Webserver
        setup_wifi();
        setup_mqtt();
        setup_webserver();
      }
      
      
      // *************************************************
      // Unterprogramm: void loop
      // *************************************************
      void loop()  {
        unsigned long aktuellMillis = millis();
          if (aktuellMillis - letzteMillis_mqtt >= loop_mqtt) { mqtt_send = "ja"; } else { mqtt_send = "nein"; }
        // WiFi und MQTT prüfen
          if (aktuellMillis - letzteMillis_verbindung >= loop_verbindung) {
            if (WiFi.status() != WL_CONNECTED) {
              setup_wifi();
            }
            Serial.println("WiFi geprüft und ok");
            client.publish("Wemos_" + Wemos_Device + "/Meldung", "WiFi geprüft und ok.");
          // MQTT prüfen
             if (!client.connect(mqtt_name, mqtt_user, mqtt_passwd)) { // Verbindung zum MQTT wird hergestellt
               setup_mqtt();
             }
             Serial.println("MQTT geprüft und ok");
             client.publish("Wemos_" + Wemos_Device + "/Meldung", "MQTT geprüft und ok.");
          letzteMillis_verbindung = aktuellMillis;
          }
        // Webserver
          server.handleClient(); // auf HTTP-Anfragen warten
        // Time
          Zeit_holen();
        // Ultraschall HC-SR04 Daten abrufen
            digitalWrite(trigPin, LOW);
            delayMicroseconds(2);
            digitalWrite(trigPin, HIGH);
            delayMicroseconds(10);
            digitalWrite(trigPin, LOW);
            duration = pulseIn(echoPin, HIGH);
          // Calculate the distance (in cm) based on the speed of sound.
            distance = duration/58.2;
            if (distance >= maximumRange || distance <= minimumRange){
              Serial.println("---");
            }
            Serial.print(distance); Serial.print(" cm\t");
        // BME 280
          hPa_korrektur = (alti / 8) - 1; 
          bme.readSensor(); 
          Serial.print(bme.getPressure_MB() + hPa_korrektur); Serial.print(" hPa\t");    // Pressure in millibars
          Serial.print(bme.getHumidity()); Serial.print(" %\t\t");
          Serial.print(bme.getTemperature_C()); Serial.print(" °C\t");
        // Wifi-RSSI uebertragen
            int rssi = WiFi.RSSI();
            Serial.print(rssi); Serial.println(" WiFi-RSSI");
        // Daten an MQTT übertragen
          if (mqtt_send == "ja") {
            // Ultraschall
      	if (distance - distance_alt > 1 || distance - distance_alt < -1) {
                client.publish("Wemos_" + Wemos_Device + "/Distance", String(distance)); 
                client.publish("Wemos_" + Wemos_Device + "/Meldung", "Distance geändert (akt.;alt): " + String(distance) + " ; " + String(distance_alt)); 
                distance_alt = distance;
              }
            // BME 280
              if ((bme.getPressure_MB() + hPa_korrektur - hPa_alt) > 1 ||(bme.getPressure_MB() + hPa_korrektur - hPa_alt) < -1) {
                client.publish("Wemos_" + Wemos_Device + "/BME280-Luftdruck", String(bme.getPressure_MB() + hPa_korrektur)); 
                client.publish("Wemos_" + Wemos_Device + "/Meldung", "Luftdruck geändert (akt.;alt): " + String(bme.getPressure_MB()+ hPa_korrektur) + " ; " + String(hPa_alt)); 
                hPa_alt = (bme.getPressure_MB() + hPa_korrektur);
              }
              if (bme.getHumidity()- feuchte_alt > 1 || bme.getHumidity()- feuchte_alt < -1) {
                client.publish("Wemos_" + Wemos_Device + "/BME280-Luftfeuchtigkeit", String(bme.getHumidity())); 
                client.publish("Wemos_" + Wemos_Device + "/Meldung", "Luftfeuchtigkeit geändert (akt.;alt): " + String(bme.getHumidity()) + " ; " + String(feuchte_alt)); 
                feuchte_alt = bme.getHumidity();
              }
              if (bme.getTemperature_C()- Grad_alt > 1 || bme.getTemperature_C()- Grad_alt < -1) {
                client.publish("Wemos_" + Wemos_Device + "/BME280-Temperatur", String(bme.getTemperature_C())); 
                client.publish("Wemos_" + Wemos_Device + "/Meldung", "Temperatur geändert (akt.;alt): " + String(bme.getTemperature_C()) + " ; " + String(Grad_alt)); 
                Grad_alt = bme.getTemperature_C();
              }
            // Wifi-RSSI
              if (rssi-rssi_alt > 2 || rssi-rssi_alt < -2) {
                client.publish("Wemos_" + Wemos_Device + "/WiFi-RSSI", String(rssi)); 
                client.publish("Wemos_" + Wemos_Device + "/Meldung", "WiFi-RSSI geändert (akt.;alt): " + String(rssi) + " ; " + String(rssi_alt)); 
                rssi_alt = rssi;
              }
          letzteMillis_mqtt = aktuellMillis;
          }
      //Delay x before next reading
        delay(loop_delay);
      }
      
      
      // -------------------------------------------------
      // Unterprogramm: setup_wifi
      // -------------------------------------------------
      void setup_wifi() {
        delay(10);
      // Connect WiFi
        Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid);
        WiFi.hostname("Wemos_" + Wemos_Device);
        WiFi.config(ip, gateway, subnet, dns1, dns2); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password);
       
        while (WiFi.status() != WL_CONNECTED) {
          delay(500); Serial.print(".");
        }
        Serial.println(""); Serial.println(""); Serial.println("WiFi verbunden!");
      // Print the IP address
        Serial.print("IP-Addresse: "); Serial.print(WiFi.localIP()); Serial.println("");
      }
      // -------------------------------------------------
      // Unterprogramm: setup_mqtt
      // -------------------------------------------------
      void setup_mqtt() {
        client.begin(mqtt_ip, mqtt_port, net); // Verbindungsaufbau zu MQTT
        Serial.println(); Serial.print("MQTT verbinden!");
        while (!client.connect(mqtt_name, mqtt_user, mqtt_passwd)) { // Verbindung zum MQTT wird hergestellt
          Serial.print(".");
        }
        Serial.println(); Serial.println("MQTT verbunden!"); Serial.println("");
        client.publish("Wemos_" + Wemos_Device + "/IP-Adresse", myIp() );
        client.publish("Wemos_" + Wemos_Device + "/Meldung", "WiFi und MQTT geprüft und ok.");
      }
      // -------------------------------------------------
      // Unterprogramm: setup_webserver
      // -------------------------------------------------
      void setup_webserver() {
        if (MDNS.begin("esp8266")) {
          Serial.println("MDNS responder started");
        }
        server.begin();
        Serial.println("Webserver gestartet!");
        Serial.print("Benutze diese URL: "); Serial.print("http://"); Serial.print(WiFi.localIP()); Serial.println("/"); Serial.println("");
          // HTTP-Anfragen bearbeiten
            server.on("/" , handleRoot);
            server.onNotFound(handleNoRoot);
      }
      // -------------------------------------------------
      // Unterprogramm: IP Adresse ermitteln
      // -------------------------------------------------
      String myIp() {
          char myIpString[24];
          IPAddress myIp = WiFi.localIP();
          sprintf(myIpString, "%d.%d.%d.%d", myIp[0], myIp[1], myIp[2], myIp[3]);
          return myIpString;
      }
      // -------------------------------------------------
      // Unterprogramm: Time
      // -------------------------------------------------
      void Zeit_holen() {
          dateTime = NTPch.getNTPtime(time_offset, time_summertime);
          if(dateTime.valid){
            byte actualHour = dateTime.hour; byte actualMinute = dateTime.minute; byte actualsecond = dateTime.second;
            int actualyear = dateTime.year; byte actualMonth = dateTime.month; byte actualday =dateTime.day;
            byte actualdayofWeek = dateTime.dayofWeek;
            jahrStr = dateTime.year;
            monatStr = dateTime.month < 10 ? "0" + String(dateTime.month) : String(dateTime.month);
            dayStr = dateTime.day < 10 ? "0" + String(dateTime.day) : String(dateTime.day);
            stdStr = dateTime.hour < 10 ? "0" + String(dateTime.hour) : String(dateTime.hour);
            minStr = dateTime.minute < 10 ? "0" + String(dateTime.minute) : String(dateTime.minute);
            sekStr = dateTime.second < 10 ? "0" + String(dateTime.second) : String(dateTime.second);        
            Serial.print("Stand: "); Serial.print(dayStr); Serial.print("."); Serial.print(monatStr); Serial.print("."); Serial.print(dateTime.year);
            Serial.print(" um "); Serial.print(stdStr); Serial.print(":"); Serial.print(minStr); Serial.print(":"); Serial.print(sekStr); Serial.println(" Uhr");
          }  
      }
      // -------------------------------------------------
      // Unterprogramm: Webserver
      // -------------------------------------------------
      void handleRoot() { // bei Aufruf des Root-Verzeichnisses
          String antwort = "";
          int rssi = WiFi.RSSI();
          antwort = "WeMos: \t\t" + Wemos_Device + "\n";
          antwort = antwort + "==============================================\n\n";
          antwort = antwort + "Stand: \t\t" + dayStr + "." + monatStr + "." + jahrStr + " um " + stdStr + ":" + minStr + ":" + sekStr + " Uhr\n";
        // Ultraschall
          antwort = antwort + "\n";
          antwort = antwort + "Ultraschall:";
          antwort = antwort + "\tDistance: \t\t" + distance + " cm\n";
        // BME 280  
          bme.readSensor(); 
          antwort = antwort + "\n";
          antwort = antwort + "BME 280:";
          antwort = antwort + "\tAltitude: \t\t" + alti + " Meter\n";
          antwort = antwort + "\t\tLuftdruck: \t\t" + (bme.getPressure_MB() + hPa_korrektur) + " hPa\n";
          antwort = antwort + "\t\tLuftfeuchtigkeit: \t" + bme.getHumidity() + " %\n";
          antwort = antwort + "\t\tTemperatur: \t\t" + bme.getTemperature_C() + " Grad Celsius\n";
        // System
          antwort = antwort + "\n";
          antwort = antwort + "System:";
          antwort = antwort + "\t\tVerbunden mit: \t\t" + ssid + "\n";
          antwort = antwort + "\t\tSignalstaerke: \t\t" + String(rssi) + " dBm\n";
          antwort = antwort + "\t\tIP-Adresse: \t\t" + myIp() + "\n";
          antwort = antwort + "\n";
        // MQTT
          antwort = antwort + "ioB-MQTT:";
          antwort = antwort + "\tName: \t\t\t" + mqtt_name + "\n";
          antwort = antwort + "\t\tIP-Adresse: \t\t" + mqtt_ip + "\n";
          antwort = antwort + "\t\tMQTT-Port: \t\t" + String(mqtt_port) + "\n";
          antwort = antwort + "\t\tSende-Intervall: \t" + String(loop_mqtt/1000) + " Sekunden\n";
          antwort = antwort + "\n\n";
       
          antwort = antwort + "Folgende Werte einstellen mit: \t" + myIp() + "/wert?...\n";
          antwort = antwort + "---------------------------------------------------------------------------------------\n";
          antwort = antwort + "Sende-Intervall MQTT an iobroker\t" + "delay=x\t\t" + "(x = Sekunden)\n";
          antwort = antwort + "Altitude des aktuellen Standorts\t" + "alti=x\t\t" + "(x = Meter ueber Meeresspiegel)\n";
          antwort = antwort + "SSID fuer Wlan\t\t\t\t" + "ssid=x\t\t" + "(ssid zum einloggen)\n\n\n";
      
          antwort = antwort + "@ 05/2019 bahnuhr, Dieter Mueller";
          server.send(200, "text/plain", antwort);
          delay(150);
      }
      void handleNoRoot() {
          String antwort = "";
          if (server.args() > 0) {
            for (uint8_t i = 0; i < server.args(); i++) {
              if (server.argName(i) == "delay") {
                loop_mqtt = ((server.arg(i)).toInt())*1000;
                Serial.print("Delay eingestellt auf: "); Serial.print(loop_mqtt/1000); Serial.println(" Sekunden"); 
                handleRoot();
              } else if (server.argName(i) == "alti") {
                alti = (server.arg(i)).toInt();
                Serial.print("Altitude eingestellt auf: "); Serial.print(alti); Serial.println(" Meter ueber Meeresspiegel"); 
                handleRoot();
              } else if (server.argName(i) == "ssid") {
                ssid = server.arg(i);
                Serial.print("SSID eingestellt auf: "); Serial.println(ssid);  
                setup_wifi();
                setup_mqtt();
                setup_webserver();
                handleRoot();
              } else {
                server.send(404, "text/plain", "Eingabe ist falsch und konnte nicht bearbeitet werden!");
              }
            }
          } else {
            server.send(404, "text/plain", "Eingabe ist falsch und konnte nicht bearbeitet werden!");
          }
      }
      
      

      Fazit:
      Das Sketch ist mit Sicherheit nicht perfekt. Es macht aber für mich genau das was ich wollte.
      Und ich habe lange gebastelt bis es so lief.
      Verbesserungsvorschläge sind willkommen.
      Wem es gefällt, dann Daumen hoch.

      Viel Spaß damit.

      mfg
      Dieter

      1 Reply Last reply Reply Quote 2
      • bahnuhr
        bahnuhr Forum Testing Most Active last edited by

        Hallo,

        mein o.g. Sketch baut mit meinem Test-Wemos keine mqtt Verbindung zu iob auf.
        mqtt1 mit port 1884 ist eingerichtet.

        b2aeaa54-292b-4982-8fa7-f016752e5bb9-image.png
        3c2a2ac7-f3f1-4d72-b835-1d260001996a-image.png

        Genauer:
        Habe 4 Wemos installiert. 3 sind an der entsprechenden Stelle (z.B. Zisterne) in Betrieb und verbinden sich mit iob.

        Nur mein Test-Wemos funzt nicht. Er bleibt bei mqtt Verindung aufbauen stehen und verbindet sich einfach nicht.
        d130b9f6-dc17-460a-b5c6-753d6e03f33d-image.png

        Hat jemand mal ne Idee für mich, warum das ganze bei 3 funktiniert jedoch bei dem einen nicht.
        Habe diesen auch schon mal ausgetauscht, geht auch nicht.

        1 Reply Last reply Reply Quote 0
        • bahnuhr
          bahnuhr Forum Testing Most Active last edited by

          Auch auf einer neuen win10 iob installation klappt die Verbindung nicht.

          Hat denn keiner mal ne Idee für mich ?

          1 Reply Last reply Reply Quote 0
          • tenkelmann
            tenkelmann last edited by

            Kannst du mal schreiben welche Libraries du verwendet hast?

            1 Reply Last reply Reply Quote 0
            • bahnuhr
              bahnuhr Forum Testing Most Active last edited by

              @bahnuhr sagte in Anleitung: Wemos Sketch mit Sensoren:

              #include <ESP8266WiFi.h>
              #include <WiFiClient.h>
              #include <ESP8266WebServer.h>
              #include <ESP8266mDNS.h>
              #include <MQTT.h>
              #include <Wire.h>
              #include <NTPtimeESP.h>
              #include "cactus_io_BME280_I2C.h"

              Steht ja oben im Script.

              Das komische daran ist, dass das Script ja schon mal lief.

              K tenkelmann 2 Replies Last reply Reply Quote 0
              • Ralla66
                Ralla66 Most Active last edited by

                @bahnuhr sagte in Anleitung: Wemos Sketch mit Sensoren:

                const char* mqtt_name = "Wemos-Test"; // Name des Wemos der in IoBroker im Adapter MQTT unter info angezeigt wird.

                Name hast du angepasst ? Bsp weise Wemos-Test-4.
                Sonst wäre das doppelt im IO.

                1 Reply Last reply Reply Quote 0
                • K
                  klassisch Most Active @bahnuhr last edited by

                  @bahnuhr verwende doch statt mqtt den singleApi Adapter. Das funktioniert zuverlässig und ist einfach umzusetzen. Die Daten werden direkt in die Objektliste geschrieben

                  bahnuhr 1 Reply Last reply Reply Quote 0
                  • tenkelmann
                    tenkelmann @bahnuhr last edited by

                    @bahnuhr Ja, das steht da. Aber welche sind die richtigen? Wenn ich nach mqtt.h suche finde unzählige Möglichkeiten (Adafruit, PubSubClient, etc.). Welche davon ist die richtige?

                    1 Reply Last reply Reply Quote 0
                    • bahnuhr
                      bahnuhr Forum Testing Most Active @klassisch last edited by

                      @klassisch sagte in Anleitung: Wemos Sketch mit Sensoren:

                      verwende doch statt mqtt den singleApi Adapter.

                      Danke für die Info.
                      Wenn dies noch einfacher ist, dann mach ich das natürlich.

                      Verrate mir nur wie das geht.
                      mfg

                      1 Reply Last reply Reply Quote 0
                      • K
                        klassisch Most Active last edited by klassisch

                        Die Beschreibung des simpleAPI Adapters ist in github https://github.com/ioBroker/ioBroker.simple-api
                        Ich verwende i.A. den
                        "setBulk": "http://ipaddress:8087/setBulk?stateID1=0.7&stateID2=0&prettyPrint"

                        Dazu erst manuell die passende Datenspure(en) anlegen. Bei mir heißen die z.B.

                        data.0.heating.Heizraum.Kessel.VorlaufTemp
                        data.0.heating.Heizraum.Kessel.RuecklaufTemp
                        

                        Das passende Kommando würde dann lauten

                        http://ipaddress:8087/setBulk?data.0.heating.Heizraum.Kessel.VorlaufTemp=50.00&data.0.heating.Heizraum.Kessel.RuecklaufTemp=48.88&prettyPrint
                        

                        natürlich statt ipaddress die IP Adresse Deines ioBrokers
                        Du kannst das probeweise in den Browser eintippen und wenn alles funktioniert erhältst Du im Browser als Antwort

                        [
                          {
                            "id": "data.0.heating.Heizraum.Kessel.VorlaufTemp",
                            "val": 50,
                            "value": 50
                          },
                          {
                            "id": "data.0.heating.Heizraum.Kessel.RuecklaufTemp",
                            "val": 48.88,
                            "value": 48.88
                          }
                        ]
                        

                        und die Punkte sind in Deiner Datenstruktur eingetragen.
                        Die Zeile mußt Du in Deinem ESP8266 Programm entsprechend dem von Dir verwendeten Webserver zusammenbasteln und an den Weserver übertragen. Da gibt es mehrere Webserver. Ich habe mich leider einen recht alten aus dem WeMos Thread im Homematic-Forum eingschossen.

                        1 Reply Last reply Reply Quote 0
                        • bahnuhr
                          bahnuhr Forum Testing Most Active last edited by

                          @klassisch sagte in Anleitung: Wemos Sketch mit Sensoren:

                          Danke für die Info.
                          Ich probiere es aus.

                          Wäre es möglich, dass du mir mal dein Arduino sketch sendest.
                          Du benutzt doch auch den D1 mini, richtig?

                          1 Reply Last reply Reply Quote 0
                          • K
                            klassisch Most Active last edited by

                            Ja, benutze den D1Mini.
                            Aber mein Sketch ist mittlerweile ein ziemliches Monster und ich habe schon ange nichts mehr dran gemacht. Keine Ahnung, ob das mit der aktuellen Umgebnung noch compiliert. Und ich arbeite intensiv mit Konfigurationen und EEPROM. Mußte auch mehrfach die Urkonfiguration der Wifi credentials abändern weil die Fritte irgendwann mal WPS nicht mehr richtig unterstützte.

                            Hier mal als kleinen Einblick die Unterprogramme für die Übertragung von Werten und emails an ioBroker via simpleAPI

                            /*
                              Sketch to upload of data to ioBroker using simpleAPI
                              - SimpleAPI has to be installed and instanced in ioBroker
                              - datapoints have to be present in  ioBroker
                            
                              transfer method used:
                               "setBulk": "http://io.Broker.IP.Address:8087/setBulk?stateID1=0.7&stateID2=0&prettyPrint",
                            */
                            
                            
                            void uploadIoBroker() {
                            
                              startUploadIoBroker();
                            }
                            
                            // ################################### UPLOAD ##################################################
                            void startUploadIoBroker() {
                            
                            if ( cfg.ioBrokerDataPointHeader[0] != '-' && cfg.ioBrokerSensorId[0] != '-'){
                              String cmdToIoBroker = F("");
                              cmdToIoBroker = cmdToIoBroker + F("GET /setBulk?");
                            
                              if(cfg.ioBrokerRssiId[0] != '-') 
                              cmdToIoBroker = cmdToIoBroker + F("&") + cfg.ioBrokerDataPointHeader + cfg.ioBrokerSensorId +  cfg.ioBrokerRssiId + F("=") + String(WiFi.RSSI());
                             
                              if(cfg.ioBrokerTemperatureId[0] != '-') 
                              cmdToIoBroker = cmdToIoBroker + F("&") + cfg.ioBrokerDataPointHeader + cfg.ioBrokerSensorId +  cfg.ioBrokerTemperatureId + F("=") + climateValuesSensor1.temp;
                              
                              if(cfg.ioBrokerHumidityRelId[0] != '-') 
                              cmdToIoBroker = cmdToIoBroker + F("&") + cfg.ioBrokerDataPointHeader + cfg.ioBrokerSensorId +  cfg.ioBrokerHumidityRelId + F("=") + climateValuesSensor1.feucht;
                            
                              if(cfg.ioBrokerHumidityAbsId[0] != '-') 
                              cmdToIoBroker = cmdToIoBroker + F("&") + cfg.ioBrokerDataPointHeader + cfg.ioBrokerSensorId +  cfg.ioBrokerHumidityAbsId + F("=") + climateValuesSensor1.absfeucht;
                            
                              if(cfg.ioBrokerHumidityDewTempId[0] != '-') 
                              cmdToIoBroker = cmdToIoBroker + F("&") + cfg.ioBrokerDataPointHeader + cfg.ioBrokerSensorId +  cfg.ioBrokerHumidityDewTempId + F("=") + climateValuesSensor1.tautemp;
                            
                              if(cfg.ioBrokerPressureRedId[0] != '-') 
                              cmdToIoBroker = cmdToIoBroker + F("&") + cfg.ioBrokerDataPointHeader + cfg.ioBrokerSensorId +  cfg.ioBrokerPressureRedId + F("=") + climateValuesSensor1.reducedPressure;
                              
                            	  
                              ////  cmdToIoBroker = cmdToIoBroker + F("&") + cfg.ioBrokerDataPointHeader + cfg.ioBrokerRainVelocityId + F("=") + rainVelocity;
                              ////  cmdToIoBroker = cmdToIoBroker + F("&") + cfg.ioBrokerDataPointHeader + cfg.ioBrokerRainQuantityId + F("=") + rainQuantity;
                              cmdToIoBroker = cmdToIoBroker + F("&prettyPrint");
                            
                            
                              WiFiClient client; // Webclient initialisieren
                              client.connect(cfg.ioBrokerIp, cfg.ioBrokerPort);
                              delay(100);
                              cmdToIoBroker =  cmdToIoBroker + F(" HTTP/1.1\r\n") + F("Host: ") + cfg.ioBrokerIp + F(":") + cfg.ioBrokerPort  + F("\r\n") +  F("Connection: close\r\n\r\n");
                              messagefromFunction = "string sent to ioBroker: " + cmdToIoBroker; ////for debug only but very helpful!
                              client.print(cmdToIoBroker);// Daten an ioBroker melden
                            } // end if ( cfg.ioBrokerSensorId[0] != "-")
                            } // end void startUploadIoBroker()
                            
                            
                            void mailViaIoBroker() {
                            
                              /************************ requires following JScript on ioBroker *****************************************************
                            
                                // ##### sends Mails when triggered. Acts as a gateway for IoT computers ####
                                // ####   triggered by a change of the String variable text           #######
                                //
                                // ####   modified by klassisch  #######
                            
                                var to = getState("data.0.email.to").val; // addressee
                                var from = "my.ioBrokermail@gmail.com"; // sender
                                var subject = getState("data.0.email.subject").val;  // subject
                                var text = getState("data.0.email.text").val;
                            
                                function send_email (From, To, Subject, Text) {
                                  sendTo("email", {
                                  from:    From,
                                  to:      To,
                                  subject: Subject,
                                  text:    Text
                                  });
                                }
                            
                            
                                on({id: "data.0.email.text"},
                                function (obj) {
                                to = getState("data.0.email.to").val; // addressee
                                subject = getState("data.0.email.subject").val;  // subject
                                text = getState("data.0.email.text").val;
                                send_email(from, to, subject, text);
                                });
                            
                              ************************ END required JScript on ioBroker *****************************************************/
                            
                            
                              String cmdToIoBroker = F("");
                            
                              String s_emailTo = String(cfg.emailTo);
                              String(s_emailTo).replace(" ", F("%20")); //prepare String Variables: substitute whitespaces by %20 otherwise it will not be transmitted
                              emailSubject.replace(" ", F("%20"));
                              emailText.replace(" ", F("%20"));
                            //  emailText.replace(F("%B0"), "°"); // ioBroker simpleApi cannot handle %B0 -> But the correct %C2%B0
                            
                              cmdToIoBroker = cmdToIoBroker + F("GET /setBulk?");
                              cmdToIoBroker = cmdToIoBroker + ioBrokerEmailForwarderTo + F("=") + s_emailTo;
                              cmdToIoBroker = cmdToIoBroker + F("&") + ioBrokerEmailForwarderSubject + F("=") + emailSubject;
                              cmdToIoBroker = cmdToIoBroker + F("&") + ioBrokerEmailForwarderText + F("=") + emailText;
                              cmdToIoBroker = cmdToIoBroker + F("&prettyPrint");
                              cmdToIoBroker =  cmdToIoBroker + F(" HTTP/1.1\r\n") + F("Host: ") + cfg.ioBrokerIp + F(":") + cfg.ioBrokerPort  + F("\r\n") +  F("Connection: close\r\n\r\n");
                            
                              WiFiClient client; // Webclient initialisieren
                              client.connect(cfg.ioBrokerIp, cfg.ioBrokerPort);
                              delay(100);
                              messagefromFunction = "string sent to ioBroker: " + cmdToIoBroker; ////for debug only but very helpful!
                              client.print(cmdToIoBroker);// Daten an CCU melden
                            } // end mailViaIOBroker
                            
                            

                            Es wird jeweils geprüft, ob der Parameter gültig parametrisiert ist (kein "-" auf der ersten Position) und dann der Wert (=Namensbestandteil für die Objektspur übernommen.

                            Die Initialisierung der Werte der Struktur "cfg" sieht so aus

                              char ioBrokerDataPointHeader [40] = "data.0." ;// first part of data address
                              char ioBrokerSensorId [40] = "sensorXY."; // the colons are important
                              char ioBrokerTemperatureId [20] = "Temp";
                              char ioBrokerHumidityRelId [20] = "H-rel";
                              char ioBrokerHumidityAbsId [20] = "H-abs";
                              char ioBrokerHumidityDewTempId [20] = "DewT";
                              char ioBrokerPressureRedId [20] = "p-red";
                              char ioBrokerRssiId [20] = "RSSI_PEER"; // according data point in Homematic
                            
                            
                            1 Reply Last reply Reply Quote 0
                            • bahnuhr
                              bahnuhr Forum Testing Most Active last edited by

                              Danke klassisch für deine Info.
                              Klappt aber nicht.

                              simple ist grün.
                              Datenpunkt ist angelegt.
                              6395bd8c-1c6c-4055-8ea1-089caffd0db7-image.png

                              Im Browser kommt:
                              27c3d967-fe26-478a-912e-2e02da1cbf66-image.png

                              1 Reply Last reply Reply Quote 0
                              • bahnuhr
                                bahnuhr Forum Testing Most Active last edited by

                                Im InternetExplorer kommt:
                                023d647a-a3f1-4c7c-94f1-e4463fd94d52-image.png

                                1 Reply Last reply Reply Quote 0
                                • bahnuhr
                                  bahnuhr Forum Testing Most Active last edited by

                                  Kann es sein, dass es wieder mit den eingeschränkten Rechte der neuen Intallationsroutine von stabilo.. zu tun hat ?

                                  Habe den win10 Rechner letzte Woche neu aufgesetzt und die neue iob routine benutzt.

                                  mfg

                                  1 Reply Last reply Reply Quote 0
                                  • K
                                    klassisch Most Active last edited by

                                    Mach mal den / raus. /javascript.0...... ->javascript.0......

                                    1 Reply Last reply Reply Quote 1
                                    • bahnuhr
                                      bahnuhr Forum Testing Most Active last edited by

                                      Danke, das wars.
                                      Vor lauter Wald sieht man....

                                      1 Reply Last reply Reply Quote 0
                                      • bahnuhr
                                        bahnuhr Forum Testing Most Active last edited by

                                        So, habe nun mal ein einfaches kurzes Sketch geschrieben.

                                        #include <ESP8266WiFi.h>
                                            String ssid = "Mueller-abc";
                                            const char* password = "abcde";
                                        
                                        void setup() {
                                          Serial.begin(9600);
                                          setup_wifi();
                                        }
                                        
                                         void loop() {
                                          String host = "192.168.243.11";
                                          int Port = 8087;
                                           WiFiClient client;
                                        
                                          if (!client.connect(host, Port)) {
                                          return;
                                          }
                                           
                                           float temp = 30;
                                            // URL die aufgerufen werden soll generieren
                                            //String url = "/set/javascript.0.Wemos.Test.Distance" + "'?value='" + String(temp) + "&prettyPrint";
                                            //String url = "http://192.168.243.11:8087/set/javascript.0.Wemos.Test.Distance?value=20&prettyPrint";
                                            String url = "http://192.168.243.11:8087/setBulk?javascript.0.Wemos.Test.Distance=30&prettyPrint";
                                            Serial.println("Wert gesendet!");
                                            client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n");
                                            delay(10);
                                        }
                                        
                                        
                                         
                                        
                                        void setup_wifi() {
                                          delay(10);
                                        // Connect WiFi
                                          Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid);
                                          WiFi.mode(WIFI_STA); 
                                          WiFi.begin(ssid, password);
                                         
                                          while (WiFi.status() != WL_CONNECTED) {
                                            delay(500); Serial.print(".");
                                          }
                                          Serial.println(""); Serial.println(""); Serial.println("WiFi verbunden!");
                                        // Print the IP address
                                          Serial.print("IP-Addresse: "); Serial.print(WiFi.localIP()); Serial.println("");
                                        }
                                        

                                        (ssid und pass natürlich geändert).

                                        Der wert kommt aber in iob nicht an.
                                        Seh ich wieder den Baum im Wald nicht??

                                        1 Reply Last reply Reply Quote 0
                                        • K
                                          klassisch Most Active last edited by klassisch

                                          Wie gesagt, funktioniert bei mir recht zuverlässig.
                                          Ein Großteil meiner Sensoren liefert noch über den Umweg Homematic CUxD die Daten ein. Kann mittlerweile aber auch den Weg direkt über simpleAPI konfigurieren und damit alles - incl. Mailversand - direkt an den ioBroker liefern. Die neueren Sensoren arbeiten so und das läuft zuverlässig. Beim Mailversand muß man vor dem Versand einige Sonderzeichen aus dem Text rausfiltern.

                                          Edit: Sorry, war nicht als Antwort auf Deine Frage gedacht. Wurde beim Schreiben unterbrochen. Schau mir Deinen Sketch mal an.

                                          1 Reply Last reply Reply Quote 0
                                          • K
                                            klassisch Most Active last edited by

                                            auf die Schnelle

                                            int Port = 8087;
                                            

                                            verwende ich nicht.
                                            Was geht:

                                            unsigned int ioBrokerPort = 8087
                                            

                                            oder für Homematic

                                            uint16 hostportCCU = 8181;
                                            
                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            807
                                            Online

                                            31.7k
                                            Users

                                            79.8k
                                            Topics

                                            1.3m
                                            Posts

                                            javascript
                                            5
                                            34
                                            3891
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo