Skip to content
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Logo
  1. ioBroker Community Home
  2. Deutsch
  3. Hardware
  4. Wemos D1 Mini (Arduino) - Basis Sketch

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.1k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    1.8k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.1k

Wemos D1 Mini (Arduino) - Basis Sketch

Scheduled Pinned Locked Moved Hardware
21 Posts 11 Posters 13.3k Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • ruhr70R Offline
    ruhr70R Offline
    ruhr70
    wrote on last edited by
    #1

    Inspiriert von:

    • @eric2905 (Abwandlung seines Basissketchs)

    • http://homematic-forum.de/forum/viewtop … 31&t=29321

    • http://www.renmet.com/wiki/index.php?title=Hauptseite

    Der Wemos D1 Mini ist ein kleiner Arduino Mikrocontroller mit integriertem WLAN Chip.

    Kosten: ca. 4,00 $ (Bestellung über China).

    327_wemos_d1_mini.jpg
    327_wemos_d1_mini_led_d4_an.jpg

    An den Wemos D1 Mini lassen sich alle möglichen Messsensoren anschalten, wie z.B.:

    • Luftqualität

    • Temperatur, Luftfeuchtigkeit

    • Ultraschall

    • Luftdruck

    • Geräuschmelder

    • Bewegungsmelder

    • …

    Die Konfiguration erfolgt über sogenannte Sketche.

    Der Basis-Sketch enthält die Grundkonfiguration ohne Code für die Sensoren, u.a. mit folgenden Leistungen:

    • Anmelden an ein vorhandenes WLAN

    • LED Signalisierung: WLAN OK (3 Sek. Takt, abschaltbar)

    • LED Signalisierung: WLAN Fehler, (1 Sek. Takt)

    • Anbindung an ioBroker über die Simple-API

    • Meldung der Wemos Systeminfos an ioBroker, seriellern Monitor und der Wemos Webseite

    -- uptime

    -- WLAN IP-Adresse, MAC-Adresse, ssid

    -- WLAN rssi

    -- Meldung bei jeder WLAN-Änderung (wg. DHCP, wenn man die IP nicht kennt)

    • Ausgabe der Systeminfos und Meldungen über den seriellen Monitor der Arduino IDE

    • Ausgabe der Systeminfos und Meldungen über http (Webseite des Arduino

    • Steuerung zur Laufzeit über eine URL (als Beispiel: Abschaltung LED für WLAN OK)

    • fünf unterschiedliche Intervallzeiten im Loop für Messungen, LED Heartbeat, Systeminfos , Reserve

    • ...

    ioBroker Wemos Objekte:
    327_iobroke_wemos_objekte.jpg

    Webseite des Wemos über den Basis-Sketch):
    327_wemos_webseite.jpg

    Der Basis-Sketch in v1.0.0:

    ! ```
    `/*

    • WeMos ioBroker Basis Sketch V 1.0.0
    • verbindet sich mit dem vorhandenen WLAN als Server
    • und schreibt die Daten in ioBroker Datenpunkte
    • Auf Seite ioBroker muss der Adapter "simpleAPI" installiert und aktiv sein
    • ioBroker Skript zum Anlegen der notwendigen Datenpunkte: xxxxxx.js (V1.0.0)
    • Skript von ruhr70
    • Inspieriert von:
    • eric2905 (Anpassung seines Basis-Skripts für Weomos -> ioBroker)
    • http://homematic-forum.de/forum/viewtopic.php?f=31&t=29321
    • http://www.renmet.com/wiki/index.php?title=Hauptseite
    • Ausgabe:
      • Zugriff per Browser auf die IP des Wemos
      • Datenpunkte in ioBroker
      • Serieller Monitor in der Arduino IDE
    • Steuerung über HTTP-Befehle:
    • "<ip-adresse>/heartbeat?sets=<wert>" Schaltet den Heartbeat ein/aus (true/false)
      
    • Bedeutung der WiFi.status() Meldungen
    • 3 WL_CONNECTED // assigned when connected to a WiFi network;
    • 255 WL_NO_SHIELD // assigned when no WiFi shield is present;
    • 0 WL_IDLE_STATUS // it is a temporary status assigned when WiFi.begin() is called and remains active until the number of attempts expires (resulting in WL_CONNECT_FAILED) or a connection is established (resulting in WL_CONNECTED);
    • 1 WL_NO_SSID_AVAIL // assigned when no SSID are available;
    • 2 WL_SCAN_COMPLETED // assigned when the scan networks is completed;
    • 4 WL_CONNECT_FAILED // assigned when the connection fails for all the attempts;
    • 5 WL_CONNECTION_LOST// assigned when the connection is lost;
    • 6 WL_DISCONNECTED

    */

    ! # define WM_IO_version "v1.0.0" // Version des Skripts (Ausgabe seriell und auf der Webseite)

    define WM_IO_skriptname "ioBroker Basissketch" // Name des Skripts (Ausgabe seriell und auf der Webseite)

    define WM_IO_device_name "51" // Name des Wemosgeräts (für die ioBroker Datenpunkte)

    define WM_IO_WLAN_ssid "xxxx" // ssid des WLANs

    define WM_IO_WLAN_password "yyyyyyyyyyyyy" // Passwort des WLANs

    define WM_IO_iobroker_host "172.16.130.210" // IP oder FQDN von ioBroker

    define WM_IO_iobroker_port 8087 // ioBroker Portnummer Simple-API-Adapter

    define WM_IO_serial_speed 115200 // Geschwindigkeit der seriellen Ausgabe (serieller Monitor in der IDE)

    define WM_IO_heartbead_LED D4 // LED, die für den Heartbeat verwendet wird (D4 ist mit der internen LED verbunden)

    define WM_IO_heartbeat_on true // Heartbeat on (keine WLAN Verbindung wird auch bei on:false signalisiert)

    ! #include <esp8266wifi.h>// https://github.com/ekstrand/ESP8266wifi
    #include <esp8266webserver.h>// Webserver
    ! // Bibliotheken für Sensoren und Anschaltungen
    // #include <wire.h>// für Geräte, die den I2C-Bus verwenden (https://www.arduino.cc/en/Reference/Wire / http://html.szaktilla.de/arduino/6.html)
    ! // ******* Wartezeit in Sekunden zwischen 2 Messungen/Vorgängen, bitte anpassen! *******
    unsigned long deltaMessungSekunden = 60; // Intervall für Messungen
    unsigned long deltaSysinfosSekunden = 5 * 60; // Intervall, in dem rssi und uptime an ioBroker übertragen wird
    unsigned long deltaHeartbeatMillisOK = 3000; // Heartbeat-Intervall bei WIFI Verbindung
    unsigned long deltaHeartbeatMillisError = 1000; // Heartbeat-Intervall keine WLAN Verbindung
    ! // ******* Netzwerkeinstellungen, bitte anpassen! *******
    const char* ssid = WM_IO_WLAN_ssid; // SSID des vorhandenen WLANs
    const char* password = WM_IO_WLAN_password; // Passwort für das vorhandene WLAN
    // wenn nicht DHCP genutzt werden soll, sondern eine feste IP (siehe auch im Setup):
    //IPAddress gateway(192,168,178,1); // IP-Adresse des WLAN-Gateways
    //IPAddress subnet(255,255,255,0); // Subnetzmaske
    //IPAddress ip(192,168,178,180); // feste IP-Adresse für den WeMos
    ! // ******* ioBroker *******
    // host als FQDN ODER IP angeben:
    //const char* host = "iobroker.fritz.box"; // FQDN des ioBroker-Servers
    const char* host = WM_IO_iobroker_host; // IP des ioBroker-Servers
    const int httpPort = WM_IO_iobroker_port; //Port des simpleAPI-Adapters in ioBroker
    ! ESP8266WebServer server(80); // Webserver des Wemos (ESP8266WebServer.h) initialisieren auf Port 80
    ! // Geschwindigkeit für die serielle Ausgabe (Serieller Monitor)
    const unsigned int serialSpeed = WM_IO_serial_speed;
    ! // =========== Einstellungen fuer Meldungen an ioBoker, bitte anpassen! *******
    // Pfad + Gerät + Datenpunkte müssen in ioBroker angelegt sein!!
    // das ioBroker Skript xxxx.js legt die Datenpunkte an
    ! const String ioBrokerBasisPath = "javascript.0.Wemos."; // Basispfad zum Datenpunkt in ioBroker
    const String ioBrokerDevice = "Device." WM_IO_device_name "."; // Gerätename in ioBroker (alle Geräte sollten mit "Device." beginnen)
    !
    // Datenpunkte für die Wemos Systeminfos
    const String dpNameIoBrokerLastStart = "last_start"; // im Basis Pfad für alle Wemos Geräte identisch
    // Datenpunkte: Individuelle Wemos Systeminfos
    const String dpNameIoBrokerRssi = "Systeminfo.rssi";
    const String dpNameIoBrokerUptime = "Systeminfo.uptime";
    const String dpNameIoBrokerSsid = "Systeminfo.ssid";
    const String dpNameIoBrokerWemosIp = "Systeminfo.ip";
    const String dpNameIoBrokerWemosMac = "Systeminfo.mac";
    ! // Datenpunkte für die Messwerte
    const String dpNameIoBrokerDemo1 = "WemosDemo1"; // Bezeichnung des ioBroker-Datenpunktes 1 für die gemessene Temperatur
    const String dpNameIoBrokerDemo2 = "WemosDemo2"; // Bezeichnung des ioBroker-Datenpunktes 2 für die gemessene Temperatur
    ! // Variablen alte Werte für die Messpunkte (für den Vergleich: "nur bei Änderung übermitteln)
    String ioBrokerDemo1ValueAlt = "";
    String ioBrokerDemo2ValueAlt = "";
    ! // ******* Heartbeat *******
    boolean heartbeatOn = true; // true - Heartbeat über LED einschalten
    ! // =========== Allg. Variablen - nicht anfassen 😉 !!! *******
    unsigned long intervallLastMillis[] = {0,0,0,0,0}; // max. 5 Intervalle (0-4)
    ! byte wifiLastStatus =0;
    ! // globale Variable mit der Mac-Adresse des WLAN-Moduls
    char MAC_char[18];
    ! // Kommando an ioBroker und Rückantwort
    String ioBrokerSimpleApiCommand = "";
    String ioBrokerSimpleApiAntwort = "";
    ! // Zeitstempel (uptime) für Debug-Ausgabe berechnen
    // =======================================================================
    // nach ca. 49,6 Tagen erfolgt ein Überlauf und der Zeitstempel fängt wieder bei 0 an
    ! String zeitstempel() { // Betriebszeit als Stunde:Minute:Sekunde
    char stempel[10];
    int lfdStunden = millis()/3600000;
    int lfdMinuten = millis()/60000-lfdStunden60;
    int lfdSekunden = millis()/1000-lfdStunden
    3600-lfdMinuten*60;
    sprintf (stempel,"%03d:%02d:%02d", lfdStunden, lfdMinuten, lfdSekunden);
    return stempel;
    }
    ! // =========== 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;
    }
    ! // =========== MAC-Adresse ermitteln *******
    // See more at: http://www.esp8266.com/viewtopic.php?f=29&t=3587#sthash.QMfjHXQH.dpuf
    ! void myMac() {
    uint8_t MAC_array[6];
    // MAC-Adresse ermitteln und ausgeben
    WiFi.macAddress(MAC_array); // die 6 Byte der MAC-Adresse auselsen und in ein Array schreiben
    for (int i = 0; i < sizeof(MAC_array); ++i){
    sprintf(MAC_char,"%s%02x:",MAC_char,MAC_array[i]);
    }
    MAC_char[strlen(MAC_char)-1] = '\0'; // letztes Zeichen ":" kürzen
    //MAC_char[strlen(MAC_char)-1] = 0; // letztes Zeichen ":" kürzen
    // MAC-Adresse steht in der globalen Variable: MAC_char
    }
    ! // =========== Meldestring an ioBroker beim Start - hallo hier bin ich (Last Start) *******
    ! String lastStart() {
    String lastStartString = "["" + myIp() + "","" + MAC_char + "","" + zeitstempel() + ""]";
    //String lastStartString = "["" + myIp() + "","" + myMac() + "","" + zeitstempel() + ""]";
    return lastStartString;
    }
    ! // ===== wandelt bool in true/false String um =====
    String logikBool2Str(boolean logikBool) {
    String logikStr = "true";
    if(!logikBool) {logikStr = "false";}
    return logikStr;
    }
    ! // =========== Intervalle *******
    ! boolean intervall(byte intervallArr, int millisekunden) {
    if(millis() - intervallLastMillis[intervallArr] > millisekunden) {
    intervallLastMillis[intervallArr] = millis();
    return true;
    }
    return false;
    }
    ! void heartbeatIntervall() {
    unsigned long intervall3 = deltaHeartbeatMillisOK;
    if(WiFi.status() != WL_CONNECTED) {
    intervall3 = deltaHeartbeatMillisError;
    }
    else {
    if(wifiLastStatus != WiFi.status()) {
    delay(200);
    melde_ioBroker(dpNameIoBrokerLastStart, lastStart()); // Hallo ioBroker, hier bin ich. Wemos aktiv und gestartet.
    }
    }
    wifiLastStatus = WiFi.status();
    if(intervall(3, intervall3)) {
    // Heartbeat
    if(heartbeatOn || (WiFi.status() != WL_CONNECTED)) { // Heartbeat über LED, wenn eingeschaltet ODER WLAN Verbindung verloren
    digitalWrite(WM_IO_heartbead_LED, 0);
    delay(50);
    digitalWrite(WM_IO_heartbead_LED, 1);
    if(WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    Serial.print(WiFi.status());
    }
    }
    }
    }
    ! // =========== Webserver *******
    ! void homepage() { // bei Aufruf des Root-Verzeichnisses
    String betriebszeit = zeitstempel();
    String antwort = "";

    int rssi = WiFi.RSSI();

    ! antwort = "WeMos \t" WM_IO_skriptname " (" WM_IO_version ")";
    antwort = antwort + "\n\n";
    antwort = antwort + "\tBetriebszeit: " + betriebszeit + " (Std:Min:Sek)\n";
    antwort = antwort + "\tVerbunden mit: " + ssid + "\n";
    antwort = antwort + "\tSignalstaerke: " + String(rssi) + " dBm\n";
    antwort = antwort + "\tIP: " + myIp() + "\n";
    antwort = antwort + "\tMAC: " + MAC_char;
    ! antwort = antwort + "\n\n";
    antwort = antwort + "ioBroker: \n";
    antwort = antwort + "\tIP: " + host + "\tPort: " + httpPort;
    ! antwort = antwort + "\n\n";
    antwort = antwort + "Systemparameter: \n";
    antwort = antwort + "\tCOM-Port: "+ serialSpeed + " Baud\n";
    antwort = antwort + "\tIntervall: "+ deltaMessungSekunden + " Sek.\n";
    antwort = antwort + "\tHeartbeat LED: "+ logikBool2Str(heartbeatOn);
    ! antwort = antwort + "\n\n";
    antwort = antwort + "HTTP-Befehlsuebersicht:\n\n";
    antwort = antwort + "\thttp://"+myIp()+"/heartbeat?set=<wert>\n\t\tSchaltet den LED Heartbeat ein/aus. ( <wert>= true/false)\n";
    ! antwort = antwort + "\n\n";
    antwort = antwort + "Letzes Kommando an ioBroker:\n";
    antwort = antwort + "\t" + ioBrokerSimpleApiCommand;
    antwort = antwort + "\n\n";
    antwort = antwort + "Letzte Antwort ioBroker: \n\n" + ioBrokerSimpleApiAntwort;
    ! server.send(300, "text/plain", antwort);
    delay(150);
    Serial.println(zeitstempel() + " unspezifische HTTP-Anfrage (Root-Verzeichnis) an den Wemos");
    }
    ! void webSetHeartbeat() { // bei Aufruf von ".../heartbeat"
    String set = server.arg("set");
    if((set == "true") || (set == "1")) {
    heartbeatOn = true;
    server.send(200, "text/plain", "Heartbeat ist eingeschaltet");
    delay(100);
    Serial.println(zeitstempel() + " Heartbeat ist eingeschaltt");
    }
    else if((set == "false") || (set == "0")) {
    heartbeatOn = false;
    server.send(200, "text/plain", "Heartbeat ist ausgeschaltet");
    delay(100);
    Serial.println(zeitstempel() + " Heartbeat ist ausgeschaltt");
    }
    else {
    server.send(200, "text/plain", "ungueltiger Aufruf. /heartbeat?set= <wert>\t <wert>= true/false");
    delay(100);
    Serial.println(zeitstempel() + " ungueltiger Aufruf. /heartbeat?set=<wert>");
    }
    }
    ! // Melderoutine an ioBroker
    // =======================================================================
    // &prettyPrint sorgt für die Rückmeldung des JSON in mehren Zeilen
    // https://github.com/ioBroker/ioBroker.simple-api/blob/master/README.md#set
    ! void melde_ioBroker(String datenpunktName, String wert) {
    String dp = ioBrokerBasisPath + ioBrokerDevice + datenpunktName;
    if (datenpunktName == dpNameIoBrokerLastStart) {
    dp = ioBrokerBasisPath + datenpunktName; // "Hallo ioBroker hier bin ich" -> Datenpunkt deviceunabhängig
    }
    ioBrokerSimpleApiAntwort = ""; // globale Variale für die Rückantwort von ioBroker
    ! Serial.println("\n\n" + zeitstempel() + " <- melde_ioBroker Start\n");

    WiFiClient client; // Webclient initialisieren
    if (!client.connect(host, httpPort)) { // mit dem CCU-Port verbinden
    Serial.println(zeitstempel() + " Fehler: Verbindung zum ioBroker konnte nicht aufgebaut werden (Eric2905)");
    ioBrokerSimpleApiAntwort = zeitstempel() + " Fehler: Verbindung zum ioBroker konnte nicht aufgebaut werden";
    delay(100);
    return;
    }
    String meldung = "GET /set/" + dp + "?value=" + wert + "&prettyPrint HTTP/1.1";
    Serial.println(meldung);
    client.println(meldung);
    ioBrokerSimpleApiCommand = zeitstempel() + ": " + meldung;
    client.println();
    delay(1000);

    ! Serial.println();
    ! ioBrokerSimpleApiAntwort = "\t"+zeitstempel() + ":\n";
    while(client.available()){ // Antwort des ioBrokers zeilenweise auslesen
    ! String zeile = "";
    zeile = client.readStringUntil('\n');
    Serial.println(zeile);
    ! ioBrokerSimpleApiAntwort = ioBrokerSimpleApiAntwort + "\t" + zeile + "\n";

    }
    Serial.println();
    Serial.println(zeitstempel() + " Werte an ioBroker gemeldet --> ");
    }

    ! // regelmässige Systeminfos an ioBroker (RSSI und uptime)
    // =======================================================================
    ! void systeminfos() {

    int rssi = WiFi.RSSI();
    String uptime = zeitstempel();

    ! char tmp[10];
    dtostrf(rssi, 1/minStringWidthIncDecimalPoint/, 0/numVarsAfterDecimal/, tmp);
    String rssiStr = tmp;

    melde_ioBroker(dpNameIoBrokerRssi , rssiStr);
    melde_ioBroker(dpNameIoBrokerUptime , uptime);

    }

    ! // Mess-Routine
    // =======================================================================
    // ausgabe = 0 // Messung wird nur ausgegeben, wenn eine Änderung der Messwerte erfolgte
    // ausgabe = 1 // Messung wird immer ausgegeben, auch wenn die Messwerte gleich geblieben sind
    // alles Messwerte werden als String an ioBroker übermittelt und müssen vor dem Aufruf
    // der Funktion melde_ioBroker in einen String gewandelt werden.
    ! void messung(boolean ausgabe) {

    //Hier kommt dann der Mess-Code rein (oder die echten Messwerte)
    float ioBrokerDemo1Value = 123;
    float ioBrokerDemo2Value = 456;

    ! // Umwandlung float in String
    char tmp[10];
    dtostrf(ioBrokerDemo1Value, 1/minStringWidthIncDecimalPoint/, 2/numVarsAfterDecimal/, tmp);
    String out1 = tmp;
    dtostrf(ioBrokerDemo2Value, 1/minStringWidthIncDecimalPoint/, 2/numVarsAfterDecimal/, tmp);
    String out2 = tmp;
    ! // Messwerte schreiben, wenn sich der Wert geändert hat
    if ((out1 != ioBrokerDemo1ValueAlt) || (ausgabe == 1)) {
    melde_ioBroker(dpNameIoBrokerDemo1,out1);
    ioBrokerDemo1ValueAlt = out1;
    }
    if ((out2 != ioBrokerDemo2ValueAlt) || (ausgabe == 1)) {
    melde_ioBroker(dpNameIoBrokerDemo2,out2);
    ioBrokerDemo2ValueAlt = out2;
    }
    }
    ! // =======================================================================
    // setup() - Setup-Routine
    // =======================================================================
    ! void setup() {
    // Heartbeat
    pinMode(WM_IO_heartbead_LED, OUTPUT); // Pin "WM_IO_heartbead_LED" wird als Output definiert, die interne LED ist mit D4 "fest verdrahtet"
    digitalWrite(WM_IO_heartbead_LED, 1); // 1 = LED aus

    // Seriellen Monitor für Kontrollausgaben öffnen
    Serial.begin(serialSpeed); // initialize serial (Geschwindigkeit in der Variable "serialSpeed")
    delay(10);
    Serial.println("");
    Serial.println("WeMos - " WM_IO_skriptname " (" WM_IO_version ")");
    Serial.println("");

    // WLAN-Verbindung herstellen
    //WiFi.config(ip, gateway, subnet); // auskommentieren, falls eine dynamische IP bezogen werden soll
    WiFi.begin(ssid, password);
    Serial.println("Verbindungsaufbau zur ssid: " WM_IO_WLAN_ssid);
    Serial.println("");
    Serial.print(zeitstempel() + " ");

    ! myMac(); // Mac-Adresse ermitteln und in die globale Variable "MAC_char" schreiben
    ! // Verbindungsaufbau abwarten
    while (WiFi.status() != WL_CONNECTED) {
    heartbeatIntervall();
    //delay(500);
    //Serial.print(".");
    }
    wifiLastStatus = WiFi.status();

    // WLAN verbunden, weiter im setup()

    ! // Ausgaben im seriellen Monitor
    Serial.println("");
    Serial.println(zeitstempel() + " erfolgreich!");
    Serial.println("");
    Serial.println("Verbunden mit: " WM_IO_WLAN_ssid);
    //Serial.println(ssid);
    Serial.print("Signalstaerke: ");
    int rssi = WiFi.RSSI();
    Serial.print(rssi);
    Serial.println(" dBm");
    Serial.print("IP-Adresse: ");
    Serial.print(WiFi.localIP());
    Serial.println("");
    Serial.print("MAC-Adresse: ");
    Serial.println(MAC_char);
    Serial.println("");
    ! // HTTP-Anfragen bearbeiten
    server.on("/" , homepage);
    server.on("/heartbeat", webSetHeartbeat);
    // HTTP-Server starten
    server.begin();
    Serial.println(zeitstempel() + " HTTP-Server gestartet");
    ! // WLAN-/Systeminfos an ioBroker übermitteln (Datenpunkte müssen in ioBroker angelegt sein)
    melde_ioBroker(dpNameIoBrokerLastStart, lastStart()); // Hallo ioBroker, hier bin ich. Wemos aktiv und gestartet.
    systeminfos(); // uptime und rssi
    melde_ioBroker(dpNameIoBrokerSsid , ssid); // ssid
    melde_ioBroker(dpNameIoBrokerWemosIp, myIp()); // ip
    melde_ioBroker(dpNameIoBrokerWemosMac, MAC_char);
    }
    ! // =======================================================================
    // loop() - Schleife, die immer wieder durchlaufen wird
    // =======================================================================
    ! void loop() {
    server.handleClient(); // auf HTTP-Anfragen warten
    ! // kontinuierliche Überprüfung der Messwerte, Ausgabe nur bei Änderung
    messung(0); // 0 = Ausgabe der Messwerte nur bei Änderung, 1 = AUsgabe des Messwerts bei jedem Aufruf (1 ist nur im Intervall sinnvoll)
    ! // Intervall 0: Messintervall - Verarbeiten wenn Zeitintervall erreicht
    if(intervall(0,deltaMessungSekunden * 1000)) { // alle "deltaMessungSekunden" Sekunden
    Serial.print("\nMess-Zeitpunkt : ");
    Serial.println(zeitstempel());
    //messung(1); // wenn zyklisch zusätzlich immer Werte ausgegeben werden sollen -> 1 = Ausgabe der Messwerte, auch wenn die Werte sich nicht geändert haben
    } // Ende Zeitintervall 0
    ! // Intervall 1: Systemmeldungen an ioBroker - Verarbeiten wenn Zeitintervall erreicht
    if(intervall(1, deltaSysinfosSekunden * 1000)) {
    systeminfos();
    }
    ! // Intervall 2: Verarbeiten wenn Zeitintervall erreicht
    // Reserve
    if(intervall(2, 1 * 1000)) { // jede Sekunde
    Serial.print("."); // Reserve - Beispiel
    }
    ! // Intervall 3: Heartbeat - Verarbeiten wenn Zeitintervall erreicht
    heartbeatIntervall();
    ! // Intervall 4: Reserve - Verarbeiten wenn Zeitintervall erreicht
    // Reserve
    if(intervall(4, 5 * 1000)) {
    Serial.print(WiFi.status());
    }
    ! }</wert></wert></wert></wert></wert></wire.h></esp8266webserver.h></esp8266wifi.h></wert></ip-adresse> ! **~~[b]~~Anlegen der Datenpunkte in ioBroker (Javascript):[/b]** ! >! ~~[spoiler]~~[code]// v1.0.0
    ! var wemosId = "51"; // individuelle Nummer oder Bezeichnung des Wemos
    ! //
    var pfad = "Wemos" + ".";
    var device = pfad + "Device." + wemosId + ".";
    var pfadSysteminfos = device + "Systeminfo" + ".";
    ! var forcecration = false;
    ! // Datenpunkte für den Wemos anlegen
    // =============================================================================
    ! // Messpunkte
    ! createState(device + "WemosDemo1", 0 , forcecration, {
    name: 'Demodatenpunkt 1 für den Wemos ' + wemosId,
    desc: 'Demodatenpunkt 1 für den Wemos ' + wemosId,
    type: 'number',
    unit: '',
    role: 'value'
    });
    ! createState(device + "WemosDemo2", 0 , forcecration, {
    name: 'Demodatenpunkt 2 für den Wemos ' + wemosId,
    desc: 'Demodatenpunkt 2 für den Wemos ' + wemosId,
    type: 'number',
    unit: '',
    role: 'value'
    });
    ! // Wemos "last Start" - letzter Start eines Wemos Device, Datenpunkt für alle Wemos gleich
    ! createState(pfad + "last_start", "[]" , false, {
    name: 'Letzter Start eines Wemos Geräts',
    desc: 'Letzter Start eines Wemos Geräts',
    type: 'string',
    unit: '',
    role: 'value'
    });
    ! // Systeminfos
    ! createState(pfadSysteminfos + "rssi", 0 , forcecration, {
    name: 'WLAN Wemos RSSI',
    desc: 'WLAN Wemos RSSI',
    type: 'number',
    unit: 'dBm',
    role: 'value'
    });
    ! createState(pfadSysteminfos + "uptime", "0" , forcecration, {
    name: 'WLAN Wemos Uptime',
    desc: 'WLAN Wemos Uptime',
    type: 'string',
    unit: '',
    role: 'value'
    });
    ! createState(pfadSysteminfos + "ssid", "" , forcecration, {
    name: 'WLAN SSID',
    desc: 'WLAN SSID an dem der Wemods angemeldet ist',
    type: 'string',
    unit: '',
    role: 'value'
    });
    ! createState(pfadSysteminfos + "ip", "" , forcecration, {
    name: 'Wemos IP',
    desc: 'Wemos IP',
    type: 'string',
    unit: '',
    role: 'value'
    });
    ! createState(pfadSysteminfos + "mac", "" , forcecration, {
    name: 'Wemos MAC-Adresse',
    desc: 'Wemos MAC-Adresse',
    type: 'string',
    unit: '',
    role: 'value'
    });
    [/code]`[/spoiler][/i]

    Adapter: Fritzbox, Unify Circuit
    Skripte: dynamic hue, Bluetooth Scan, Multi-Ereignisliste

    1 Reply Last reply
    0
    • O Offline
      O Offline
      Onkel Fritz
      wrote on last edited by
      #2

      Sehr schönes Script! Sieht nach viel Arbeit aus. Danke für's teilen.

      Hast du da weiter dran gearbeitet?

      Ich werde mich mal daran versuchen um es für mich anzupassen und es mit Ausgabe auf dem OLED-Shield erweitern.

      Heute hab ich mir einiges Wemos-Zubehör bestellt. Werd mich also weiter damit befassen. Hab noch viel zu lernen.

      CCU2, einige Heizkörperventile, 2 Raumtermostate, Steckdosen mit Leistungsmessung, Bewegungsmelder, Wetterstation, ...
      Versuche mich z.Z. mit Microcontollern (Arduino, Wemos, ESP32, MQTT), Raspberry Pi + ioBroker

      1 Reply Last reply
      0
      • ruhr70R Offline
        ruhr70R Offline
        ruhr70
        wrote on last edited by
        #3

        @Onkel Fritz:

        Hast du da weiter dran gearbeitet? `

        Ja, habe ich.

        Ich habe einen IAQ-Core CO2 / VOC Sensor integriert und eine 8er LED Leiste mit WS2812 LEDs.

        Zeit per NTP ist eingebaut.

        Der IAQ überträgt CO2 und VOC an ioBroker.

        Die LED-Leiste zeigt beim Start die WLAN Feldstärke mit blauen LEDs an.

        8 LEDs = 0 dBm

        7 LEDs = -10 dbm

        6 LEDs = -20 dBm

        usw.

        Danach läuft der Countdown von 8 grünen LEDs auf 0 LEDs (Systemstart nach WLAN Anmeldung, Starten der Dienste, Übertragen der Systeminfos an ioBroker).

        Dann werden mit den LEDs die Zustände angezeigt.

        LED Betrieb: gn

        LED IAQ: gn = OK, orange = warmup, gelb = standby

        eine LED in grün, gelb, orange, rot für den CO2 Level (IAD Stufe)

        eine LED in grün, gelb, orange, rot für den VOC Level

        eine LED für für die Luftqualität über den MQ-135

        Die 3 LEDs für Luftqualität blinken bei extrem hohen Werten.

        Ein Schalter ist vorbereitet, der die Grünwerte und die Betriebsanzeigen an- und ausschaltet (für das Schlafzimmer) und nur die Luftqualität der drei Messwerte ab gelb anzeigen soll.

        Zwei LEDs sind frei. Die könnten z.B: für Lüftungsempfehlungen, Unwetterwarnung, Temperatur und Regenvorhersage über ioBroke genutzt werden (Visualisierung im Raum).

        Den MQ-135 werde ich wahrscheinlich wieder rausschmeissen.

        Ist noch verdammt viel Arbeit. Momentan ist es etwas unstrukturiert.

        Die nächsten Schritte sind… aufräumen, ausmisten (MQ-135 raus).

        @Onkel Fritz:

        Heute hab ich mir einiges Wemos-Zubehör bestellt. Werd mich also weiter damit befassen. Hab noch viel zu lernen. `

        Viel Spaß 🙂

        Geht mir genauso.

        Adapter: Fritzbox, Unify Circuit
        Skripte: dynamic hue, Bluetooth Scan, Multi-Ereignisliste

        1 Reply Last reply
        0
        • O Offline
          O Offline
          Onkel Fritz
          wrote on last edited by
          #4

          Hoffentlich weißt du dann auch immer, wofür welche LED steht. 😉

          Aber die Idee mit den LEDs ist gut. Leichter ablesbar als Zahlen.

          Deinen Sketch fand ich schön übersichtlich. Obwohl ich mich noch kaum damit auskenne fand ich mich gut zurecht.

          Ich hab jetzt die Anzeige auf dem Wemos OLED-Shield fertig. Das OLED ist ja nicht so ganz einfach. Ich hab ne Weile gebraucht, bis ich überhaupt mal lesbaren Text gesehen habe. Jetzt habe ich die passende Library (SSD1306Ascii) und eine einfache Anzeige von ssid, IP, Empfangsstärke und den beiden Meßwerten.

          Das Display ist schon verdammt klein und schwer lesbar, aber auch praktisch. Keine Kabel und handlich.

          Falls jemand das OLED-Shield hat und Interesse an dem Sketch hat poste ich den gerne.

          CCU2, einige Heizkörperventile, 2 Raumtermostate, Steckdosen mit Leistungsmessung, Bewegungsmelder, Wetterstation, ...
          Versuche mich z.Z. mit Microcontollern (Arduino, Wemos, ESP32, MQTT), Raspberry Pi + ioBroker

          1 Reply Last reply
          0
          • S Offline
            S Offline
            simpixo
            wrote on last edited by
            #5

            Mein OLED SHIELD ist auch schon in China bestellt. Also wäre ich an dem Sketch interessiert [emoji851][emoji12]

            Danke schon mal dafür [emoji1360]

            Gesendet von meinem iPhone mit Tapatalk

            1 Reply Last reply
            0
            • O Offline
              O Offline
              Onkel Fritz
              wrote on last edited by
              #6

              Hier kommt der Sketch von Ruhr70 mit meinen Ergänzungen für das Wemos D1 OLED-Shield.

              Die Library https://github.com/greiman/SSD1306Ascii muß installiert werden. Sie ist einfach, beschränkt sich auf Textausgabe und braucht weniger Speicher als die mit Grafikmöglichkeiten.

              Ich habe das Ausgabeinterwall auf 5 Sekunden gesetzt wegen der Empfangsstärke zum Positionieren des Wemos.

              Später kann man das auf das Meßinterwall hochsetzen.

              Der Basis-Sketch in v1.0.0 mit OLED-Display Ergänzung:

              ! ```
              `/*

              • WeMos ioBroker Basis Sketch V 1.0.0 mit OLED-Display Ergänzung
              • verbindet sich mit dem vorhandenen WLAN als Server
              • und schreibt die Daten in ioBroker Datenpunkte
              • Auf Seite ioBroker muss der Adapter "simpleAPI" installiert und aktiv sein
              • ioBroker Skript zum Anlegen der notwendigen Datenpunkte: xxxxxx.js (V1.0.0)
              • Skript von ruhr70, OLED-Ergänzung von Onkel Fritz
              • Inspieriert von:
              • eric2905 (Anpassung seines Basis-Skripts für Weomos -> ioBroker)
              • http://homematic-forum.de/forum/viewtopic.php?f=31&t=29321
              • http://www.renmet.com/wiki/index.php?title=Hauptseite
              • Ausgabe:
                • Zugriff per Browser auf die IP des Wemos
                • Datenpunkte in ioBroker
                • Serieller Monitor in der Arduino IDE
              • Steuerung über HTTP-Befehle:
              • "<ip-adresse>/heartbeat?sets=<wert>" Schaltet den Heartbeat ein/aus (true/false)
                
              • Bedeutung der WiFi.status() Meldungen
              • 3 WL_CONNECTED // assigned when connected to a WiFi network;
              • 255 WL_NO_SHIELD // assigned when no WiFi shield is present;
              • 0 WL_IDLE_STATUS // it is a temporary status assigned when WiFi.begin() is called and remains active until the number of attempts expires (resulting in WL_CONNECT_FAILED) or a connection is established (resulting in WL_CONNECTED);
              • 1 WL_NO_SSID_AVAIL // assigned when no SSID are available;
              • 2 WL_SCAN_COMPLETED // assigned when the scan networks is completed;
              • 4 WL_CONNECT_FAILED // assigned when the connection fails for all the attempts;
              • 5 WL_CONNECTION_LOST// assigned when the connection is lost;
              • 6 WL_DISCONNECTED
              • Textausgabe auf Wemos OLED-Shield mit
              • SSD1306Ascii Library von https://github.com/greiman/SSD1306Ascii
                */

              ! # define WM_IO_version "v1.0.0" // Version des Skripts (Ausgabe seriell und auf der Webseite)

              define WM_IO_skriptname "ioBroker Basissketch" // Name des Skripts (Ausgabe seriell und auf der Webseite)

              define WM_IO_device_name "51" // Name des Wemosgeräts (für die ioBroker Datenpunkte)

              define WM_IO_WLAN_ssid "*******" // ssid des WLANs

              define WM_IO_WLAN_password "**********" // Passwort des WLANs

              define WM_IO_iobroker_host "..." // IP oder FQDN von ioBroker

              define WM_IO_iobroker_port 8087 // ioBroker Portnummer Simple-API-Adapter

              define WM_IO_serial_speed 115200 // Geschwindigkeit der seriellen Ausgabe (serieller Monitor in der IDE)

              define WM_IO_heartbead_LED D4 // LED, die für den Heartbeat verwendet wird (D4 ist mit der internen LED verbunden)

              define WM_IO_heartbeat_on true // Heartbeat on (keine WLAN Verbindung wird auch bei on:false signalisiert)

              ! #include <esp8266wifi.h> // https://github.com/ekstrand/ESP8266wifi
              #include <esp8266webserver.h> // Webserver
              ! // Bibliotheken für Sensoren und Anschaltungen
              // #include <wire.h> // für Geräte, die den I2C-Bus verwenden (https://www.arduino.cc/en/Reference/Wire / http://html.szaktilla.de/arduino/6.html)
              ! // OLED-Display
              // I2C-Adresse des Displays 0x3C oder 0x3D
              #define I2C_ADDRESS 0x3C
              #include <wire.h>
              #include "SSD1306Ascii.h"
              #include "SSD1306AsciiWire.h"
              #define SCLPIN 5
              #define SDAPIN 4
              SSD1306AsciiWire oled;
              int oledintervall = 5; // Intervall für OLED-Ausgabe
              ! // ******* Wartezeit in Sekunden zwischen 2 Messungen/Vorgängen, bitte anpassen! *******
              unsigned long deltaMessungSekunden = 60; // Intervall für Messungen
              unsigned long deltaSysinfosSekunden = 5 * 60; // Intervall, in dem rssi und uptime an ioBroker übertragen wird
              unsigned long deltaHeartbeatMillisOK = 3000; // Heartbeat-Intervall bei WIFI Verbindung
              unsigned long deltaHeartbeatMillisError = 1000; // Heartbeat-Intervall keine WLAN Verbindung
              ! // ******* Netzwerkeinstellungen, bitte anpassen! *******
              const char* ssid = WM_IO_WLAN_ssid; // SSID des vorhandenen WLANs
              const char* password = WM_IO_WLAN_password; // Passwort für das vorhandene WLAN
              // wenn nicht DHCP genutzt werden soll, sondern eine feste IP (siehe auch im Setup):
              //IPAddress gateway(192,168,178,1); // IP-Adresse des WLAN-Gateways
              //IPAddress subnet(255,255,255,0); // Subnetzmaske
              //IPAddress ip(192,168,178,180); // feste IP-Adresse für den WeMos
              ! // ******* ioBroker *******
              // host als FQDN ODER IP angeben:
              //const char* host = "iobroker.fritz.box"; // FQDN des ioBroker-Servers
              const char* host = WM_IO_iobroker_host; // IP des ioBroker-Servers
              const int httpPort = WM_IO_iobroker_port; //Port des simpleAPI-Adapters in ioBroker
              ! ESP8266WebServer server(80); // Webserver des Wemos (ESP8266WebServer.h) initialisieren auf Port 80
              ! // Geschwindigkeit für die serielle Ausgabe (Serieller Monitor)
              const unsigned int serialSpeed = WM_IO_serial_speed;
              ! // =========== Einstellungen fuer Meldungen an ioBoker, bitte anpassen! *******
              // Pfad + Gerät + Datenpunkte müssen in ioBroker angelegt sein!!
              // das ioBroker Skript xxxx.js legt die Datenpunkte an
              ! const String ioBrokerBasisPath = "javascript.0.Wemos."; // Basispfad zum Datenpunkt in ioBroker
              const String ioBrokerDevice = "Device." WM_IO_device_name "."; // Gerätename in ioBroker (alle Geräte sollten mit "Device." beginnen)
              !
              // Datenpunkte für die Wemos Systeminfos
              const String dpNameIoBrokerLastStart = "last_start"; // im Basis Pfad für alle Wemos Geräte identisch
              // Datenpunkte: Individuelle Wemos Systeminfos
              const String dpNameIoBrokerRssi = "Systeminfo.rssi";
              const String dpNameIoBrokerUptime = "Systeminfo.uptime";
              const String dpNameIoBrokerSsid = "Systeminfo.ssid";
              const String dpNameIoBrokerWemosIp = "Systeminfo.ip";
              const String dpNameIoBrokerWemosMac = "Systeminfo.mac";
              ! // Datenpunkte für die Messwerte
              const String dpNameIoBrokerDemo1 = "WemosDemo1"; // Bezeichnung des ioBroker-Datenpunktes 1 für die gemessene Temperatur
              const String dpNameIoBrokerDemo2 = "WemosDemo2"; // Bezeichnung des ioBroker-Datenpunktes 2 für die gemessene Temperatur
              ! // Variablen alte Werte für die Messpunkte (für den Vergleich: "nur bei Änderung übermitteln)
              String ioBrokerDemo1ValueAlt = "";
              String ioBrokerDemo2ValueAlt = "";
              ! // ******* Heartbeat *******
              boolean heartbeatOn = true; // true - Heartbeat über LED einschalten
              ! // =========== Allg. Variablen - nicht anfassen 😉 !!! *******
              unsigned long intervallLastMillis[] = {0,0,0,0,0,0}; // max. 6 Intervalle (0-5) // eines ergänzt für OLED
              ! byte wifiLastStatus =0;
              ! // globale Variable mit der Mac-Adresse des WLAN-Moduls
              char MAC_char[18];
              ! // Kommando an ioBroker und Rückantwort
              String ioBrokerSimpleApiCommand = "";
              String ioBrokerSimpleApiAntwort = "";
              ! // Zeitstempel (uptime) für Debug-Ausgabe berechnen
              // =======================================================================
              // nach ca. 49,6 Tagen erfolgt ein Überlauf und der Zeitstempel fängt wieder bei 0 an
              ! String zeitstempel() { // Betriebszeit als Stunde:Minute:Sekunde
              char stempel[10];
              int lfdStunden = millis()/3600000;
              int lfdMinuten = millis()/60000-lfdStunden60;
              int lfdSekunden = millis()/1000-lfdStunden
              3600-lfdMinuten*60;
              sprintf (stempel,"%03d:%02d:%02d", lfdStunden, lfdMinuten, lfdSekunden);
              return stempel;
              }
              ! // =========== 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;
              }
              ! // =========== MAC-Adresse ermitteln *******
              // See more at: http://www.esp8266.com/viewtopic.php?f=29&t=3587#sthash.QMfjHXQH.dpuf
              ! void myMac() {
              uint8_t MAC_array[6];
              // MAC-Adresse ermitteln und ausgeben
              WiFi.macAddress(MAC_array); // die 6 Byte der MAC-Adresse auselsen und in ein Array schreiben
              for (int i = 0; i < sizeof(MAC_array); ++i){
              sprintf(MAC_char,"%s%02x:",MAC_char,MAC_array[i]);
              }
              MAC_char[strlen(MAC_char)-1] = '\0'; // letztes Zeichen ":" kürzen
              //MAC_char[strlen(MAC_char)-1] = 0; // letztes Zeichen ":" kürzen
              // MAC-Adresse steht in der globalen Variable: MAC_char
              }
              ! // =========== Meldestring an ioBroker beim Start - hallo hier bin ich (Last Start) *******
              ! String lastStart() {
              String lastStartString = "["" + myIp() + "","" + MAC_char + "","" + zeitstempel() + ""]";
              //String lastStartString = "["" + myIp() + "","" + myMac() + "","" + zeitstempel() + ""]";
              return lastStartString;
              }
              ! // ===== wandelt bool in true/false String um =====
              String logikBool2Str(boolean logikBool) {
              String logikStr = "true";
              if(!logikBool) {logikStr = "false";}
              return logikStr;
              }
              ! // =========== Intervalle *******
              ! boolean intervall(byte intervallArr, int millisekunden) {
              if(millis() - intervallLastMillis[intervallArr] > millisekunden) {
              intervallLastMillis[intervallArr] = millis();
              return true;
              }
              return false;
              }
              ! void heartbeatIntervall() {
              unsigned long intervall3 = deltaHeartbeatMillisOK;
              if(WiFi.status() != WL_CONNECTED) {
              intervall3 = deltaHeartbeatMillisError;
              }
              else {
              if(wifiLastStatus != WiFi.status()) {
              delay(200);
              melde_ioBroker(dpNameIoBrokerLastStart, lastStart()); // Hallo ioBroker, hier bin ich. Wemos aktiv und gestartet.
              }
              }
              wifiLastStatus = WiFi.status();
              if(intervall(3, intervall3)) {
              // Heartbeat
              if(heartbeatOn || (WiFi.status() != WL_CONNECTED)) { // Heartbeat über LED, wenn eingeschaltet ODER WLAN Verbindung verloren
              digitalWrite(WM_IO_heartbead_LED, 0);
              delay(50);
              digitalWrite(WM_IO_heartbead_LED, 1);
              if(WiFi.status() != WL_CONNECTED) {
              Serial.print(".");
              Serial.print(WiFi.status());
              }
              }
              }
              }
              ! // =========== Webserver *******
              ! void homepage() { // bei Aufruf des Root-Verzeichnisses
              String betriebszeit = zeitstempel();
              String antwort = "";

              int rssi = WiFi.RSSI();

              ! antwort = "WeMos \t" WM_IO_skriptname " (" WM_IO_version ")";
              antwort = antwort + "\n\n";
              antwort = antwort + "\tBetriebszeit: " + betriebszeit + " (Std:Min:Sek)\n";
              antwort = antwort + "\tVerbunden mit: " + ssid + "\n";
              antwort = antwort + "\tSignalstaerke: " + String(rssi) + " dBm\n";
              antwort = antwort + "\tIP: " + myIp() + "\n";
              antwort = antwort + "\tMAC: " + MAC_char;
              ! antwort = antwort + "\n\n";
              antwort = antwort + "ioBroker: \n";
              antwort = antwort + "\tIP: " + host + "\tPort: " + httpPort;
              ! antwort = antwort + "\n\n";
              antwort = antwort + "Systemparameter: \n";
              antwort = antwort + "\tCOM-Port: "+ serialSpeed + " Baud\n";
              antwort = antwort + "\tIntervall: "+ deltaMessungSekunden + " Sek.\n";
              antwort = antwort + "\tHeartbeat LED: "+ logikBool2Str(heartbeatOn);
              ! antwort = antwort + "\n\n";
              antwort = antwort + "HTTP-Befehlsuebersicht:\n\n";
              antwort = antwort + "\thttp://"+myIp()+"/heartbeat?set=<wert>\n\t\tSchaltet den LED Heartbeat ein/aus. ( <wert>= true/false)\n";
              ! antwort = antwort + "\n\n";
              antwort = antwort + "Letzes Kommando an ioBroker:\n";
              antwort = antwort + "\t" + ioBrokerSimpleApiCommand;
              antwort = antwort + "\n\n";
              antwort = antwort + "Letzte Antwort ioBroker: \n\n" + ioBrokerSimpleApiAntwort;
              ! server.send(300, "text/plain", antwort);
              delay(150);
              Serial.println(zeitstempel() + " unspezifische HTTP-Anfrage (Root-Verzeichnis) an den Wemos");
              }
              ! void webSetHeartbeat() { // bei Aufruf von ".../heartbeat"
              String set = server.arg("set");
              if((set == "true") || (set == "1")) {
              heartbeatOn = true;
              server.send(200, "text/plain", "Heartbeat ist eingeschaltet");
              delay(100);
              Serial.println(zeitstempel() + " Heartbeat ist eingeschaltt");
              }
              else if((set == "false") || (set == "0")) {
              heartbeatOn = false;
              server.send(200, "text/plain", "Heartbeat ist ausgeschaltet");
              delay(100);
              Serial.println(zeitstempel() + " Heartbeat ist ausgeschaltt");
              }
              else {
              server.send(200, "text/plain", "ungueltiger Aufruf. /heartbeat?set= <wert>\t <wert>= true/false");
              delay(100);
              Serial.println(zeitstempel() + " ungueltiger Aufruf. /heartbeat?set=<wert>");
              }
              }
              ! // Melderoutine an ioBroker
              // =======================================================================
              // &prettyPrint sorgt für die Rückmeldung des JSON in mehren Zeilen
              // https://github.com/ioBroker/ioBroker.simple-api/blob/master/README.md#set
              ! void melde_ioBroker(String datenpunktName, String wert) {
              String dp = ioBrokerBasisPath + ioBrokerDevice + datenpunktName;
              if (datenpunktName == dpNameIoBrokerLastStart) {
              dp = ioBrokerBasisPath + datenpunktName; // "Hallo ioBroker hier bin ich" -> Datenpunkt deviceunabhängig
              }
              ioBrokerSimpleApiAntwort = ""; // globale Variale für die Rückantwort von ioBroker
              ! Serial.println("\n\n" + zeitstempel() + " <- melde_ioBroker Start\n");

              WiFiClient client; // Webclient initialisieren
              if (!client.connect(host, httpPort)) { // mit dem CCU-Port verbinden
              Serial.println(zeitstempel() + " Fehler: Verbindung zum ioBroker konnte nicht aufgebaut werden (Eric2905)");
              ioBrokerSimpleApiAntwort = zeitstempel() + " Fehler: Verbindung zum ioBroker konnte nicht aufgebaut werden";
              delay(100);
              oled.println("ioBroker Fehler");
              return;
              }
              else {
              oled.println("ioBroker ok");

              }
              String meldung = "GET /set/" + dp + "?value=" + wert + "&prettyPrint HTTP/1.1";
              Serial.println(meldung);
              client.println(meldung);
              ioBrokerSimpleApiCommand = zeitstempel() + ": " + meldung;
              client.println();
              delay(1000);

              ! Serial.println();
              ! ioBrokerSimpleApiAntwort = "\t"+zeitstempel() + ":\n";
              while(client.available()){ // Antwort des ioBrokers zeilenweise auslesen
              ! String zeile = "";
              zeile = client.readStringUntil('\n');
              Serial.println(zeile);
              ! ioBrokerSimpleApiAntwort = ioBrokerSimpleApiAntwort + "\t" + zeile + "\n";

              }
              Serial.println();
              Serial.println(zeitstempel() + " Werte an ioBroker gemeldet --> ");
              }

              ! // regelmässige Systeminfos an ioBroker (RSSI und uptime)
              // =======================================================================
              ! void systeminfos() {

              int rssi = WiFi.RSSI();
              String uptime = zeitstempel();

              ! char tmp[10];
              dtostrf(rssi, 1/minStringWidthIncDecimalPoint/, 0/numVarsAfterDecimal/, tmp);
              String rssiStr = tmp;

              melde_ioBroker(dpNameIoBrokerRssi , rssiStr);
              melde_ioBroker(dpNameIoBrokerUptime , uptime);

              }

              ! // Mess-Routine
              // =======================================================================
              // ausgabe = 0 // Messung wird nur ausgegeben, wenn eine Änderung der Messwerte erfolgte
              // ausgabe = 1 // Messung wird immer ausgegeben, auch wenn die Messwerte gleich geblieben sind
              // alles Messwerte werden als String an ioBroker übermittelt und müssen vor dem Aufruf
              // der Funktion melde_ioBroker in einen String gewandelt werden.
              ! void messung(boolean ausgabe) {

              //Hier kommt dann der Mess-Code rein (oder die echten Messwerte)
              float ioBrokerDemo1Value = 123;
              float ioBrokerDemo2Value = 456;

              ! // Umwandlung float in String
              char tmp[10];
              dtostrf(ioBrokerDemo1Value, 1/minStringWidthIncDecimalPoint/, 2/numVarsAfterDecimal/, tmp);
              String out1 = tmp;
              dtostrf(ioBrokerDemo2Value, 1/minStringWidthIncDecimalPoint/, 2/numVarsAfterDecimal/, tmp);
              String out2 = tmp;
              ! // Messwerte schreiben, wenn sich der Wert geändert hat
              if ((out1 != ioBrokerDemo1ValueAlt) || (ausgabe == 1)) {
              melde_ioBroker(dpNameIoBrokerDemo1,out1);
              ioBrokerDemo1ValueAlt = out1;
              }
              if ((out2 != ioBrokerDemo2ValueAlt) || (ausgabe == 1)) {
              melde_ioBroker(dpNameIoBrokerDemo2,out2);
              ioBrokerDemo2ValueAlt = out2;
              }
              }
              ! void oledausgabe(){
              oled.clear();
              oled.setFont(Iain5x7);
              oled.println(WM_IO_WLAN_ssid);
              oled.println(WiFi.localIP());
              int rssi = WiFi.RSSI();
              oled.print(rssi);
              oled.println(" dBm");
              oled.setFont(font5x7);
              oled.println("1: " + ioBrokerDemo1ValueAlt);
              oled.println("2: " + ioBrokerDemo2ValueAlt);
              }
              ! // =======================================================================
              // setup() - Setup-Routine
              // =======================================================================
              ! void setup() {
              // Heartbeat
              pinMode(WM_IO_heartbead_LED, OUTPUT); // Pin "WM_IO_heartbead_LED" wird als Output definiert, die interne LED ist mit D4 "fest verdrahtet"
              digitalWrite(WM_IO_heartbead_LED, 1); // 1 = LED aus

              // Seriellen Monitor für Kontrollausgaben öffnen
              Serial.begin(serialSpeed); // initialize serial (Geschwindigkeit in der Variable "serialSpeed")
              delay(10);
              Serial.println("");
              Serial.println("WeMos - " WM_IO_skriptname " (" WM_IO_version ")");
              Serial.println("");

              // WLAN-Verbindung herstellen
              //WiFi.config(ip, gateway, subnet); // auskommentieren, falls eine dynamische IP bezogen werden soll
              WiFi.begin(ssid, password);
              Serial.println("Verbindungsaufbau zur ssid: " WM_IO_WLAN_ssid);
              Serial.println("");
              Serial.print(zeitstempel() + " ");

              ! myMac(); // Mac-Adresse ermitteln und in die globale Variable "MAC_char" schreiben
              ! // Verbindungsaufbau abwarten
              while (WiFi.status() != WL_CONNECTED) {
              heartbeatIntervall();
              //delay(500);
              //Serial.print(".");
              }
              wifiLastStatus = WiFi.status();

              // WLAN verbunden, weiter im setup()

              ! // Ausgaben im seriellen Monitor
              Serial.println("");
              Serial.println(zeitstempel() + " erfolgreich!");
              Serial.println("");
              Serial.println("Verbunden mit: " WM_IO_WLAN_ssid);
              //Serial.println(ssid);
              Serial.print("Signalstaerke: ");
              int rssi = WiFi.RSSI();
              Serial.print(rssi);
              Serial.println(" dBm");
              Serial.print("IP-Adresse: ");
              Serial.print(WiFi.localIP());
              Serial.println("");
              Serial.print("MAC-Adresse: ");
              Serial.println(MAC_char);
              Serial.println("");
              ! // Ausgabe auf OLED-Display
              Wire.begin(SDAPIN, SCLPIN); //sda, scl
              delay(50);
              oled.begin(&MicroOLED64x48, I2C_ADDRESS);
              oled.clear();
              oled.setFont(Iain5x7);
              oled.println(WM_IO_WLAN_ssid);
              oled.println(WiFi.localIP());
              oled.print(rssi);
              oled.println(" dBm");

              ! // HTTP-Anfragen bearbeiten
              server.on("/" , homepage);
              server.on("/heartbeat", webSetHeartbeat);
              // HTTP-Server starten
              server.begin();
              Serial.println(zeitstempel() + " HTTP-Server gestartet");
              ! // WLAN-/Systeminfos an ioBroker übermitteln (Datenpunkte müssen in ioBroker angelegt sein)
              melde_ioBroker(dpNameIoBrokerLastStart, lastStart()); // Hallo ioBroker, hier bin ich. Wemos aktiv und gestartet.
              systeminfos(); // uptime und rssi
              melde_ioBroker(dpNameIoBrokerSsid , ssid); // ssid
              melde_ioBroker(dpNameIoBrokerWemosIp, myIp()); // ip
              melde_ioBroker(dpNameIoBrokerWemosMac, MAC_char);
              ! }
              ! // =======================================================================
              // loop() - Schleife, die immer wieder durchlaufen wird
              // =======================================================================
              ! void loop() {

              server.handleClient(); // auf HTTP-Anfragen warten

              ! // kontinuierliche Überprüfung der Messwerte, Ausgabe nur bei Änderung
              messung(0); // 0 = Ausgabe der Messwerte nur bei Änderung, 1 = AUsgabe des Messwerts bei jedem Aufruf (1 ist nur im Intervall sinnvoll)
              ! // Intervall 0: Messintervall - Verarbeiten wenn Zeitintervall erreicht
              if(intervall(0,deltaMessungSekunden * 1000)) { // alle "deltaMessungSekunden" Sekunden
              Serial.print("\nMess-Zeitpunkt : ");
              Serial.println(zeitstempel());
              //messung(1); // wenn zyklisch zusätzlich immer Werte ausgegeben werden sollen -> 1 = Ausgabe der Messwerte, auch wenn die Werte sich nicht geändert haben
              } // Ende Zeitintervall 0
              ! // Intervall 1: Systemmeldungen an ioBroker - Verarbeiten wenn Zeitintervall erreicht
              if(intervall(1, deltaSysinfosSekunden * 1000)) {
              systeminfos();
              }
              ! // Intervall 2: Verarbeiten wenn Zeitintervall erreicht
              // Reserve
              if(intervall(2, 1 * 1000)) { // jede Sekunde
              Serial.print("."); // Reserve - Beispiel
              }
              ! // Intervall 3: Heartbeat - Verarbeiten wenn Zeitintervall erreicht
              heartbeatIntervall();
              ! // Intervall 4: Reserve - Verarbeiten wenn Zeitintervall erreicht
              // Reserve
              if(intervall(4, 5 * 1000)) {
              Serial.print(WiFi.status());
              }

              // Intervall 5: OLED-ausgabe alle (oledintervall)Sekunden
              if(intervall(5, oledintervall * 1000)) {
              oledausgabe();
              }

              }</wert></wert></wert></wert></wert></wire.h></wire.h></esp8266webserver.h></esp8266wifi.h></wert></ip-adresse>`

              ! Würde mich freuen, wenn es hilfreich ist.
              ! Ich werde nun für den ersten Einsatz des Wemos ein paar Zeilen zur Steuerung eines Relais in Abhängigkeit eines 1Wire-Temperatursensors hinzufügen.
              ! Damit wird dann meine Brunnen-Pumpe überwacht. Der Brunnen liefert nur sehr begrenzt Wasser. Darum soll die Pumpe nur in kurzen intervallen laufen und dann Pause machen, damit Wasser nachlaufen kann. Falls sie doch mal Luft zieht, steigt die Temperatur am Gehäuse an und ich schalte für längere Zeit ab.
              ! Die Daten will ich dann Grafisch aufbereiten, um dann die optimalen Intervalle herauszufinden.
              ! Ein Hal-Durchflußsensor wäre natürlich idealer als die Temperatur zu messen, weil er schneller reagieren würde. Aber leider habe ich nirgends einen mit 1"-Anschluß gefunden.[/i]

              CCU2, einige Heizkörperventile, 2 Raumtermostate, Steckdosen mit Leistungsmessung, Bewegungsmelder, Wetterstation, ...
              Versuche mich z.Z. mit Microcontollern (Arduino, Wemos, ESP32, MQTT), Raspberry Pi + ioBroker

              1 Reply Last reply
              0
              • B Offline
                B Offline
                Brati
                wrote on last edited by
                #7

                Mahlzeit,

                kennt ihr euch etwas mehr mit Mikrocontrollern aus?

                Ich habe einen Impulssensor an den Wemos angeschlossen.

                709_dsc_2704.jpg

                Das Melden des Impulses klappt ohne Probleme.

                Sketch

                ! ````
                #include <esp8266wifi.h>// Einbinden der WiFi-Library
                #include <wificlient.h>// ******* Netzwerkeinstellungen, bitte anpassen! *******
                const char* ssid = ""; // SSID des vorhandenen WLAN
                const char
                password = "
                "; // Passwort für das vorhandene WLAN
                ! const char
                host = "192.168.178."; // IP-Adresse der CCU (mit Punkten!)
                String impulsVAR = "javascript.0.
                "; // Bezeichnung der Javascriptvariable für den Impuls
                !
                int impulsPin=14; // Anschluss Impulsender (IO14=D5 auf WEMOS D1 mini)
                int meldeInt = 10; // maximales Meldintervall in min (Watchdog meldet auch bei 0 Liter)
                int impulsCounter = 0; // Zähler für 1l Impuls
                int impulsState = 0; // aktueller Statuts Impuls (1=HIGH=offen/ 0=LOW=geschlossen)
                int lastImpulsState = 0; // letzter Status Impuls
                int impulsLED = 2; // interne LED optisches Feedback (LOW = ein)
                ! volatile unsigned long alteZeit=0, entprellZeit=80, lastMillis = 0; // entprellen und Watchdog Timer
                ! String zeitstempel() {
                char stempel[10];
                int lfdStunden = millis()/3600000;
                int lfdMinuten = millis()/60000-lfdStunden60;
                int lfdSekunden = millis()/1000-lfdStunden
                3600-lfdMinuten*60;
                sprintf (stempel,"%03d:%02d:%02d", lfdStunden, lfdMinuten, lfdSekunden);
                return stempel;
                }
                ! void setup() {

                Serial.begin(115200);

                pinMode(impulsPin,INPUT_PULLUP);
                pinMode(impulsLED, OUTPUT);
                meldeInt = meldeInt * 60000;

                Serial.println(""); // Leerzeile ausgeben
                Serial.println("WEMOS D1 mini - Wasser 1l Impuls");
                Serial.println("");
                Serial.println("Watchdog in: " + String(meldeInt) + " ms");
                Serial.println("");
                // WLAN-Verbindung herstellen
                WiFi.mode(WIFI_STA);
                WiFi.begin(ssid, password);
                Serial.print("Verbindungsaufbau");

                ! // Verbindungsaufbau abwarten
                while (WiFi.status() != WL_CONNECTED) {
                delay(500);
                Serial.print(".");
                }

                // Verbindungsaufbau an den seriellen Monitor melden
                Serial.println(" erfolgreich!");
                Serial.println("");
                Serial.print("Verbunden mit: ");
                Serial.println(ssid);
                Serial.print("Signalstaerke: ");
                int rssi = WiFi.RSSI();
                Serial.print(rssi);
                Serial.println(" dBm");
                Serial.print("IP-Adresse: ");
                Serial.println(WiFi.localIP());
                Serial.println();
                digitalWrite(impulsLED, HIGH);
                attachInterrupt(14, impuls, FALLING);
                }

                ! void impuls () {
                if((millis() - alteZeit) > entprellZeit) { // innerhalb der entprellZeit nichts machen
                impulsCounter++;
                alteZeit = millis(); // letzte Schaltzeit merken
                }
                }
                ! void versand(){ // Daten an ioBroker melden

                String url = "GET /set/" + impulsVAR + "?value=" + String (impulsCounter) + " HTTP/1.1";
                Serial.println (url);
                WiFiClient client;
                // mit dem ioBroker-Port 8087 verbinden
                if (!client.connect(host, 8087)) {
                Serial.println(zeitstempel() + " Fehler: Verbindung zu ioBroker konnte nicht aufgebaut werden");
                }

                client.println(url);
                client.print("Host: ");
                client.println(host);
                client.println("Connection: close");
                client.println();
                impulsCounter = 0;
                lastMillis = millis();
                Serial.println(zeitstempel() + " Impuls an iobroker gemeldet!" );
                }

                ! void loop() {

                if (impulsCounter >= 1) {              // wenn Impuls erfasst
                  digitalWrite(impulsLED, LOW);
                
                  Serial.print("Entnahmemenge:  ");
                  Serial.println(impulsCounter);
                  versand();
                  delay(50);                      // Delay a little bit to avoid bouncing
                  digitalWrite(impulsLED, HIGH);    
                }
                

                ! if ((millis() - lastMillis) > meldeInt) {
                versand();
                }
                }</wificlient.h></esp8266wifi.h>

                
                Leider gibt es aber zur Ruhezeit Fehlimpulse. Und das so ca. 30-50x am Tag. Ich habe jetzt zum Test ein HM-MOD-EM-8 (8 fach Sendemodul) angeschlossen und den Sensor wie einen spannungsfreien Taster angeklemmt. So gibt es keine Fehlimpulse. Das geht aber auf den Duty Cycle und ich wollte über den Wemos in der Folge gleich Vorlauf/ Brauchwassertemperatur mitmessen lassen.
                
                Hat jemand eine Idee woher die Fehlimpulse kommen?
                
                Grüße
                
                Brati

                CCU2 - 46 Geräte, ioBroker auf Intel NUC (DN2820FYKH) mit Tab als Frontend, Projekt Gartenhaus mit HM

                1 Reply Last reply
                0
                • G Offline
                  G Offline
                  George_Best
                  wrote on last edited by
                  #8

                  @Brati:

                  Mahlzeit,

                  kennt ihr euch etwas mehr mit Mikrocontrollern aus?

                  Ich habe einen Impulssensor an den Wemos angeschlossen. `

                  Auch auf die Gefahr hin, dass der Schreiber nicht mehr antwortet versuch ich's trotzdem. Wie genau hast du den Sensor an den Wemos angeschlossen?

                  1 Reply Last reply
                  0
                  • B Offline
                    B Offline
                    Brati
                    wrote on last edited by
                    #9

                    Danke für die Antwort, es läuft mittlerweile zuverlässig. Musste noch Kondensatoren mit anschließen und per Software filtern.

                    Aber frag mich nicht wie das war 😉

                    Grüße Brati ~~![](</s><URL url=)<link_text text="https://uploads.tapatalk-cdn.com/201801 ... 7d11c8.jpg">https://uploads.tapatalk-cdn.com/20180126/2e155e0e463bd78d6c4d4dce0c7d11c8.jpg</link_text>" />

                    Von unterwegs gesendet…~~

                    CCU2 - 46 Geräte, ioBroker auf Intel NUC (DN2820FYKH) mit Tab als Frontend, Projekt Gartenhaus mit HM

                    1 Reply Last reply
                    0
                    • G Offline
                      G Offline
                      George_Best
                      wrote on last edited by
                      #10

                      Sieht klasse aus und genau nach dem ich suche 😄

                      Kannst du mal kurz erläutern wie du den Sensor an den Wemo angeschlossen ist? Klasse wäre natürlich eine Erläuterung wie du alles zusammen gebaut und in ioBroker eingebunden hast :mrgreen:

                      1 Reply Last reply
                      0
                      • B Offline
                        B Offline
                        Brati
                        wrote on last edited by
                        #11

                        Hallo George_Best,

                        als ich schrieb: "Frag mich nicht!". Meinte ich das aus Selbstschutz :lol: .

                        Also das Teil läuft bei mir seit 03/ 2017 und hat mich echt viel Zeit gekostet, seit dem habe ich es aber nicht mehr angefasst und vieles wieder vergessen.

                        Ein kleines Manko gibt es, es fehlen so 5-10l am Tage. Das stört mich aber nicht, weil ich vor allem eine Info haben möchte, wenn im Abwesenheit Wasser weg läuft und der Rest ist nice to know.

                        Verbaut sind:

                        • WEMOS D1 Mini

                        • Impulssensor für die Wasseruhr (gibt 1 Impuls pro 1l)

                        • ein DS18B20 Temperaturfühler

                        Wichtig war der 100nF Kondensator zwischen 5V und Ground, der ein Einbrechen der Spannung verhindern soll und das Entprellen im Sketch.

                        Die Funktionsweise ist ganz einfach, beim Impuls wird ein State auf "1" gesetzt und die Temperatur übermittelt. Den State werte ich im Javascript aus und setze ihn wieder auf "0". Alle 10min meldet sich der WeMos auch so, gibt sein Lebenszeichen und übermittelt die Temperatur. Bisher ist er noch nie abgestürzt.

                        Der Sketch sieht wie folgt aus:

                        ! ````
                        #include <esp8266wifi.h>// Einbinden der WiFi-Library
                        #include <wificlient.h>#include <onewire.h>// Für Temperaturfühler
                        #include <dallastemperature.h>// Für Temperaturfühler
                        ! // ******* Netzwerkeinstellungen, bitte anpassen! *******
                        const char* ssid = ""; // SSID des vorhandenen WLAN
                        const char
                        password = "
                        "; // Passwort für das vorhandene WLAN
                        ! const char
                        host = "192.168.178.**"; // IP-Adresse ioBroker (mit Punkten!)
                        String impulsVAR = "javascript.0.Statistik.Wasser.Impuls"; // Bezeichnung der Javascriptvariable für den Impuls
                        String tempVAR = "javascript.0.Statistik.Wasser.Temp"; // Bezeichnung der Javascriptvariable für die Temperatur
                        !
                        int impulsPin=D3; // Anschluss Impulsender (D3 und D4 pull-up, D8 pull-down)
                        int meldeInt = 10; // maximales Meldintervall in min (Watchdog meldet auch bei 0 Liter)
                        int impulsCounter = 0; // Zähler für 1l Impuls
                        int impulsState = 1; // aktueller Statuts Impuls (1=HIGH=offen/ 0=LOW=geschlossen)
                        int lastImpulsState = 1; // letzter Status Impuls
                        int impulsLED = D4; // interne LED optisches Feedback (LOW = ein)
                        float temp = 0; // Temperatur Variable
                        volatile unsigned long lastMillis = 0, entprellZeit = 15, alteZeit = 0; // (17.01.2017: 25)entprellen und Watchdog Timmer
                        #define ONE_WIRE_BUS 14 /-(Connect to Pin D5)-/
                        ! /-----( Declare objects )-----/
                        /* Set up a oneWire instance to communicate with any OneWire device*/
                        OneWire ourWire(ONE_WIRE_BUS);
                        ! /* Tell Dallas Temperature Library to use oneWire Library /
                        DallasTemperature sensors(&ourWire);
                        ! String zeitstempel() {
                        char stempel[10];
                        int lfdStunden = millis()/3600000;
                        int lfdMinuten = millis()/60000-lfdStunden
                        60;
                        int lfdSekunden = millis()/1000-lfdStunden3600-lfdMinuten60;
                        sprintf (stempel,"%03d:%02d:%02d", lfdStunden, lfdMinuten, lfdSekunden);
                        return stempel;
                        }
                        ! void setup() {

                        Serial.begin(115200);

                        pinMode(impulsPin,INPUT);
                        digitalWrite(impulsPin, HIGH); // Pull Up Widerstand aktivieren
                        pinMode(impulsLED, OUTPUT);
                        meldeInt = meldeInt * 60000;
                        Serial.println(""); // Leerzeile ausgeben
                        Serial.println("WEMOS D1 mini - Wasser 1l Impuls");
                        Serial.println("");
                        Serial.println("Watchdog in: " + String(meldeInt) + " ms");
                        Serial.println("");
                        // WLAN-Verbindung herstellen
                        WiFi.mode(WIFI_STA);
                        WiFi.begin(ssid, password);
                        Serial.print("Verbindungsaufbau");

                        ! // Verbindungsaufbau abwarten
                        while (WiFi.status() != WL_CONNECTED) {
                        delay(500);
                        Serial.print(".");
                        }

                        // Verbindungsaufbau an den seriellen Monitor melden
                        Serial.println(" erfolgreich!");
                        Serial.println("");
                        Serial.print("Verbunden mit: ");
                        Serial.println(ssid);
                        Serial.print("Signalstaerke: ");
                        int rssi = WiFi.RSSI();
                        Serial.print(rssi);
                        Serial.println(" dBm");
                        Serial.print("IP-Adresse: ");
                        Serial.println(WiFi.localIP());
                        Serial.println();
                        digitalWrite(impulsLED, HIGH);
                        /-( Start up the DallasTemperature library )-/
                        sensors.begin();

                        versand(); // 1. Lebenszeichen
                        }

                        ! void versand(){ // Daten an ioBroker melden

                        sensors.requestTemperatures();
                        temp = sensors.getTempCByIndex(0);
                        Serial.println(temp);
                        String url1 = "GET /set/" + impulsVAR + "?value=" + String (impulsCounter) + " HTTP/1.1",
                        url2 = "GET /set/" + tempVAR + "?value=" + String (temp) + " HTTP/1.1";

                        WiFiClient client;
                        // mit dem ioBroker-Port 8087 verbinden
                        if (!client.connect(host, 8087)) {
                        Serial.println(zeitstempel() + " Fehler: Verbindung zu ioBroker konnte nicht aufgebaut werden");
                        }
                        Serial.println (url1);
                        client.println(url1);
                        client.print("Host: ");
                        client.println(host);
                        client.println("Connection: close");
                        client.println();
                        Serial.println (url2);
                        client.println(url2);
                        client.print("Host: ");
                        client.println(host);
                        client.println("Connection: close");
                        client.println();

                        lastMillis = millis();
                        

                        !
                        }
                        ! void loop() {

                        impulsState = digitalRead(impulsPin); // Sensor auslesen

                        if (impulsState != lastImpulsState) { // if the state has changed, increment the counter
                        alteZeit = millis();
                        lastImpulsState = impulsState; // aktuellen Status als alten Status setzen
                        }

                        if (impulsState == 0) {                         // wenn LOW=0, dann Impuls erfasst
                          if((millis() - alteZeit) > entprellZeit && impulsCounter == 0) {    // kurze Impulse (unter o.g. Entrpellzeit) ignorieren 
                              impulsCounter=1;      
                              versand();
                            }
                        }
                        

                        if ((millis() - lastMillis) > 70 && impulsCounter == 1) { // (17.01.2017: 100) Prellen verhindern, falls Impuls noch andauert (70ms mindestens)
                        impulsCounter = 0;
                        }

                        if ((millis() - lastMillis) > meldeInt) { // Watchdog nach o. eingestellter Zeit
                        versand();
                        }

                        }</dallastemperature.h></onewire.h></wificlient.h></esp8266wifi.h> 
                        
                        
                        und das ist das JS (da ist auch die Meldung bei Abwesenheit und ein Timer drin) dazu:
                        
                        >! ````
                        /* -- do not edit following lines - START --
                        {
                          "debug": false,
                          "verbose": false
                        }
                        -- do not edit previous lines - END --*/
                        var wasseruhr, delta;
                        createState("Statistik.Wasser.ESP_alive");
                        createState("Statistik.BSZ.Counter.Wasser.DELTA.Wasserverbrauch.0-5MIN",0);
                        createState("Statistik.BSZ.Counter.Wasser.DELTA.Wasserverbrauch.0-5MIN.BEFORE",0);
                        >! // Addieren eines jeden Impulses
                        on({id: 'javascript.0.Statistik.Wasser.Impuls', change: "gt"}, function (obj) {  // Impulszähler
                          var value = obj.state.val;
                          var oldValue = obj.oldState.val;
                          wasseruhr = getState("javascript.0.Statistik.Wasser.Uhr").val;
                          wasseruhr = (typeof wasseruhr == 'number' ? wasseruhr : 0) + getState("javascript.0.Statistik.Wasser.Impuls").val;
                        
                           // Für die temporäre Messung
                        
                            if (getState("javascript.0.Statistik.Wasser.TimerAktiv").val) {
                                value = (getState("javascript.0.Statistik.Wasser.MessungVerbrauch").val) + getState("javascript.0.Statistik.Wasser.Impuls").val;
                                setState("javascript.0.Statistik.Wasser.MessungVerbrauch", value);
                                }  
                        
                          setState("javascript.0.Statistik.Wasser.Uhr"/*Uhr*/, wasseruhr, true);
                          setState("javascript.0.Statistik.Wasser.Impuls"/*Wasser.Impuls*/, 0);
                          log("++++++++++++++++++++++++ Impuls! +++++++++++++++++++++++++++");
                        });
                        >! // Watchdog
                        on({id: 'javascript.0.Statistik.Wasser.Impuls', change: "any"}, function (obj) {  // Watchdog
                          var value = obj.state.val;
                          var oldValue = obj.oldState.val;
                          setState("javascript.0.Statistik.Wasser.ESP_alive"/*Statistik.Wasser.ESP_alive*/, true, true);
                          setStateDelayed("javascript.0.Statistik.Wasser.ESP_alive"/*Statistik.Wasser.ESP_alive*/, false, true, 900000, true);
                        });
                        >! // Übernahme aus der CCU
                        on({id: "hm-rega.0.32127"/*Wasseruhr*/, change: "gt"}, function (obj) {
                          var value = obj.state.val;
                          var oldValue = obj.oldState.val;
                        
                          // Für die temporäre Messung
                        
                          if (getState("javascript.0.Statistik.Wasser.TimerAktiv").val) {
                            value = (getState("javascript.0.Statistik.Wasser.MessungVerbrauch").val) + (getState("hm-rega.0.32127").val) -(getState("javascript.0.Statistik.Wasser.Uhr").val);
                            setState("javascript.0.Statistik.Wasser.MessungVerbrauch", value);
                            }
                        
                          // normale Messung
                        
                          if (getState("hm-rega.0.32127").val > getState("javascript.0.Statistik.Wasser.Uhr").val) {
                            setState("javascript.0.Statistik.Wasser.Uhr"/*Uhr*/, getState("hm-rega.0.32127").val,true);
                        
                          }
                        
                        });
                        >! // 5min Counter
                        schedule("*/5 * * * *", function () {       
                            delta = getState("javascript.0.Statistik.BSZ.Counter.Wasser.DELTA.Wasserverbrauch").val - getState("javascript.0.Statistik.BSZ.Counter.Wasser.DELTA.Wasserverbrauch.0-5MIN.BEFORE").val;
                            setState("javascript.0.Statistik.BSZ.Counter.Wasser.DELTA.Wasserverbrauch.0-5MIN"/*Statistik.BSZ.Counter.Wasser.DELTA.Wasserverbrauch.0-5MIN*/, delta);
                            setState("javascript.0.Statistik.BSZ.Counter.Wasser.DELTA.Wasserverbrauch.0-5MIN.BEFORE"/*Statistik.BSZ.Counter.Wasser.DELTA.Wasserverbrauch.0-5MIN.BEFORE*/, getState("javascript.0.Statistik.BSZ.Counter.Wasser.DELTA.Wasserverbrauch").val);
                        
                            if (!getState("hm-rega.0.7028"/*Anwesenheit*/).val && delta > 0 && !getState("hm-rega.0.13102"/*Verlassen*/).val) {
                                var s = "Menge " + delta + "l";
                                sendTo("pushover.2", {
                                        message:  s, // mandatory - your text message
                                        title:    "Wasserentnahme - Abwesenheit", // optional  - your message's title, otherwise your app's name is used
                                        device:    "XperiaZ5",
                                        priority: 0,
                                        });    
                        
                                }
                        
                        });
                        >! // Wasserverbrauch Timer Messung
                        >! on({id: "javascript.0.Statistik.Wasser.TimerAktiv"/*Timer on off für Wasserverbrauch*/, val: true}, function (obj) {  
                            var zeit;
                            log ("++++++++++ Wassertimer startet"); 
                            setState("javascript.0.Statistik.Wasser.MessungVerbrauch", 0);
                            zeit = (getState("javascript.0.Statistik.Wasser.Timer").val * 60 * 60 * 1000);
                            setStateDelayed("javascript.0.Statistik.Wasser.TimerAktiv", false, zeit) ;
                        
                        });
                        >! setState("javascript.0.Statistik.Wasser.Impuls"/*Wasser.Impuls*/, 0);
                        >! var idTimer         = "Statistik.Wasser.Timer",
                            idTimerAktiv    = "Statistik.Wasser.TimerAktiv",
                            idVerbrauch     = "Statistik.Wasser.MessungVerbrauch";
                        >! createState(idTimer, "", {
                            name: 'Timer für Wasserverbrauch',
                            desc: 'Timer für Wasserverbrauch',
                            type: 'integer',
                            role: 'value',
                            unit: ''
                        });
                        >! createState(idTimerAktiv, false, {
                            name: 'Timer on off für Wasserverbrauch',
                            desc: 'Timer on off für Wasserverbrauch',
                            type: 'boolean',
                            role: 'value',
                            unit: ''
                        });
                        >! createState(idVerbrauch, 0, {
                            name: 'Messwert für Wasserverbrauch',
                            desc: 'Messwert für Wasserverbrauch',
                            type: 'integer',
                            role: 'value',
                            unit: 'l'
                        });
                        >! ````
                        
                        Ich versuche mal noch ein scharfes Foto zu schiessen…
                        
                        Grüße
                        
                        Brati

                        CCU2 - 46 Geräte, ioBroker auf Intel NUC (DN2820FYKH) mit Tab als Frontend, Projekt Gartenhaus mit HM

                        1 Reply Last reply
                        0
                        • B Offline
                          B Offline
                          booehmemaik
                          wrote on last edited by
                          #12

                          Hallo,

                          hat jemand von euch das Sketch noch erweitert und schreibt die Werte vom DHT22 oder 11 vielleicht in den ioBroker ?

                          Gruss

                          Maik

                          1 Reply Last reply
                          0
                          • B Offline
                            B Offline
                            Brati
                            wrote on last edited by
                            #13

                            @booehmemaik:

                            Hallo,

                            hat jemand von euch das Sketch noch erweitert und schreibt die Werte vom DHT22 oder 11 vielleicht in den ioBroker ?

                            Gruss

                            Maik ` Meiner im Beitrag drüber macht das… Im ioBroker muss noch simple API installiert sein.

                            Grüße Brati

                            Von unterwegs gesendet...

                            CCU2 - 46 Geräte, ioBroker auf Intel NUC (DN2820FYKH) mit Tab als Frontend, Projekt Gartenhaus mit HM

                            1 Reply Last reply
                            0
                            • P Offline
                              P Offline
                              pix
                              wrote on last edited by
                              #14

                              Hallo,

                              ich habe das Arduino Basis Skript etwas abgewandelt. Die mit der Homematic stromlose Statusanzeige emulierte Coverflip Funktion war defekt (also der HM Aktor). Ich habe als Ersatz einen Wemos D1 und einen Servo (SG90) verbaut.

                              Hier das Skript

                              ! ```
                              `/*

                              • WeMos ioBroker Basis Sketch V 1.0.0
                              • verbindet sich mit dem vorhandenen WLAN als Server
                              • und schreibt die Daten in ioBroker Datenpunkte
                              • Auf Seite ioBroker muss der Adapter "simpleAPI" installiert und aktiv sein
                              • ioBroker Skript zum Anlegen der notwendigen Datenpunkte: xxxxxx.js (V1.0.0)
                              • Skript von ruhr70 (angepasst von pix am 22.3.2018 für Servo Steuerung)
                              • Inspieriert von:
                              • eric2905 (Anpassung seines Basis-Skripts für Weomos -> ioBroker)
                              • http://homematic-forum.de/forum/viewtopic.php?f=31&t=29321
                              • http://www.renmet.com/wiki/index.php?title=Hauptseite
                              • Ausgabe:
                                • Zugriff per Browser auf die IP des Wemos
                                • Datenpunkte in ioBroker
                                • Serieller Monitor in der Arduino IDE
                              • Steuerung über HTTP-Befehle:
                              • "<ip-adresse>/heartbeat?sets=<wert>" Schaltet den Heartbeat ein/aus (true/false)
                                
                              • Bedeutung der WiFi.status() Meldungen
                              • 3 WL_CONNECTED // assigned when connected to a WiFi network;
                              • 255 WL_NO_SHIELD // assigned when no WiFi shield is present;
                              • 0 WL_IDLE_STATUS // it is a temporary status assigned when WiFi.begin() is called and remains active until the number of attempts expires (resulting in WL_CONNECT_FAILED) or a connection is established (resulting in WL_CONNECTED);
                              • 1 WL_NO_SSID_AVAIL // assigned when no SSID are available;
                              • 2 WL_SCAN_COMPLETED // assigned when the scan networks is completed;
                              • 4 WL_CONNECT_FAILED // assigned when the connection fails for all the attempts;
                              • 5 WL_CONNECTION_LOST// assigned when the connection is lost;
                              • 6 WL_DISCONNECTED
                              • DHT Code von dieser Seite
                                */

                              ! # define WM_IO_version "v1.0.0" // Version des Skripts (Ausgabe seriell und auf der Webseite)

                              define WM_IO_skriptname "ioBroker Basissketch" // Name des Skripts (Ausgabe seriell und auf der Webseite)

                              define WM_IO_device_name "2" // Name des Wemosgeräts (für die ioBroker Datenpunkte)

                              define WM_IO_WLAN_ssid "XXXXXXXXX" // ssid des WLANs

                              define WM_IO_WLAN_password "XXXXXXXXXXX" // Passwort des WLANs

                              define WM_IO_iobroker_host "192.168.XXX.XXX" // IP oder FQDN von ioBroker

                              define WM_IO_iobroker_port 8082 // ioBroker Portnummer Simple-API-Adapter

                              define WM_IO_serial_speed 115200 // Geschwindigkeit der seriellen Ausgabe (serieller Monitor in der IDE)

                              define WM_IO_heartbead_LED D4 // LED, die für den Heartbeat verwendet wird (D4 ist mit der internen LED verbunden)

                              define WM_IO_heartbeat_on true // Heartbeat on (keine WLAN Verbindung wird auch bei on:false signalisiert)

                              ! #include <esp8266wifi.h>// https://github.com/ekstrand/ESP8266wifi
                              #include <esp8266webserver.h>// Webserver
                              ! // *********** Servo Einstellungen *************************
                              #include <servo.h>Servo myservo; // create servo object to control a servo
                              // twelve servo objects can be created on most boards
                              ! int pos = 0; // variable to store the servo position
                              ! int posOn = 85; // Grad Servoposition Tablet EIN (Magnet weggeschwenkt)
                              int posOff = 135; // Grad Servoposition Tablet AUS (senkrecht, Magnet am Tablet)
                              int posOnStep = 5; // Schritte in Grad beim Einschalten
                              int posOffStep = 5; // Schritte in Grad beim Ausschalten (je größer, desto schneller)
                              ! // Bibliotheken für Sensoren und Anschaltungen
                              // #include <wire.h>// für Geräte, die den I2C-Bus verwenden (https://www.arduino.cc/en/Reference/Wire / http://html.szaktilla.de/arduino/6.html)
                              ! // ******* Wartezeit in Sekunden zwischen 2 Messungen/Vorgängen, bitte anpassen! *******
                              unsigned long deltaMessungSekunden = 10; // Intervall für Messungen
                              unsigned long deltaSysinfosSekunden = 5 * 60; // Intervall, in dem rssi und uptime an ioBroker übertragen wird
                              unsigned long deltaHeartbeatMillisOK = 10000; // Heartbeat-Intervall bei WIFI Verbindung
                              unsigned long deltaHeartbeatMillisError = 1000; // Heartbeat-Intervall keine WLAN Verbindung
                              ! // ******* Netzwerkeinstellungen, bitte anpassen! *******
                              const char* ssid = WM_IO_WLAN_ssid; // SSID des vorhandenen WLANs
                              const char* password = WM_IO_WLAN_password; // Passwort für das vorhandene WLAN
                              // wenn nicht DHCP genutzt werden soll, sondern eine feste IP (siehe auch im Setup):
                              //IPAddress gateway(192,168,178,1); // IP-Adresse des WLAN-Gateways
                              //IPAddress subnet(255,255,255,0); // Subnetzmaske
                              //IPAddress ip(192,168,178,21); // feste IP-Adresse für den WeMos
                              ! // ******* ioBroker *******
                              // host als FQDN ODER IP angeben:
                              //const char* host = "iobroker.fritz.box"; // FQDN des ioBroker-Servers
                              const char* host = WM_IO_iobroker_host; // IP des ioBroker-Servers
                              const int httpPort = WM_IO_iobroker_port; //Port des simpleAPI-Adapters in ioBroker
                              ! ESP8266WebServer server(80); // Webserver des Wemos (ESP8266WebServer.h) initialisieren auf Port 80
                              ! // Geschwindigkeit für die serielle Ausgabe (Serieller Monitor)
                              const unsigned int serialSpeed = WM_IO_serial_speed;
                              ! // =========== Einstellungen fuer Meldungen an ioBoker, bitte anpassen! *******
                              // Pfad + Gerät + Datenpunkte müssen in ioBroker angelegt sein!!
                              // das ioBroker Skript xxxx.js legt die Datenpunkte an
                              ! const String ioBrokerBasisPath = "javascript.2.Wemos."; // Basispfad zum Datenpunkt in ioBroker
                              const String ioBrokerDevice = "Device." WM_IO_device_name "."; // Gerätename in ioBroker (alle Geräte sollten mit "Device." beginnen)
                              !
                              // Datenpunkte für die Wemos Systeminfos
                              const String dpNameIoBrokerLastStart = "last_start"; // im Basis Pfad für alle Wemos Geräte identisch
                              // Datenpunkte: Individuelle Wemos Systeminfos
                              const String dpNameIoBrokerRssi = "Systeminfo.rssi";
                              const String dpNameIoBrokerUptime = "Systeminfo.uptime";
                              const String dpNameIoBrokerSsid = "Systeminfo.ssid";
                              const String dpNameIoBrokerWemosIp = "Systeminfo.ip";
                              const String dpNameIoBrokerWemosMac = "Systeminfo.mac";
                              ! // Datenpunkte für die Messwerte
                              const String dpNameIoBrokerDemo1 = "Servo.Position"; // Bezeichnung des ioBroker-Datenpunktes 1 für die gemessene Position Servo1
                              //const String dpNameIoBrokerDemo2 = "DHT22.Temperature"; // Bezeichnung des ioBroker-Datenpunktes 2 für die gemessene Temperatur
                              ! // Variablen alte Werte für die Messpunkte (für den Vergleich: "nur bei Änderung übermitteln)
                              String ioBrokerDemo1ValueAlt = "";
                              //String ioBrokerDemo2ValueAlt = "";
                              ! // ******* Heartbeat *******
                              boolean heartbeatOn = true; // true - Heartbeat über LED einschalten
                              ! // ******* Tablet *******
                              boolean tabletOn = true; // true - Sensor Einstellung 135 Grad false 85 Grad
                              ! // =========== Allg. Variablen - nicht anfassen 😉 !!! *******
                              unsigned long intervallLastMillis[] = {0,0,0,0,0}; // max. 5 Intervalle (0-4)
                              ! byte wifiLastStatus =0;
                              ! // globale Variable mit der Mac-Adresse des WLAN-Moduls
                              char MAC_char[18];
                              ! // Kommando an ioBroker und Rückantwort
                              String ioBrokerSimpleApiCommand = "";
                              String ioBrokerSimpleApiAntwort = "";
                              ! // Zeitstempel (uptime) für Debug-Ausgabe berechnen
                              // =======================================================================
                              // nach ca. 49,6 Tagen erfolgt ein Überlauf und der Zeitstempel fängt wieder bei 0 an
                              ! String zeitstempel() { // Betriebszeit als Stunde:Minute:Sekunde
                              char stempel[10];
                              int lfdStunden = millis()/3600000;
                              int lfdMinuten = millis()/60000-lfdStunden60;
                              int lfdSekunden = millis()/1000-lfdStunden
                              3600-lfdMinuten*60;
                              sprintf (stempel,"%03d:%02d:%02d", lfdStunden, lfdMinuten, lfdSekunden);
                              return stempel;
                              }
                              ! // =========== 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;
                              }
                              ! // =========== MAC-Adresse ermitteln *******
                              // See more at: http://www.esp8266.com/viewtopic.php?f=29&t=3587#sthash.QMfjHXQH.dpuf
                              ! void myMac() {
                              uint8_t MAC_array[6];
                              // MAC-Adresse ermitteln und ausgeben
                              WiFi.macAddress(MAC_array); // die 6 Byte der MAC-Adresse auselsen und in ein Array schreiben
                              for (int i = 0; i < sizeof(MAC_array); ++i){
                              sprintf(MAC_char,"%s%02x:",MAC_char,MAC_array[i]);
                              }
                              MAC_char[strlen(MAC_char)-1] = '\0'; // letztes Zeichen ":" kürzen
                              //MAC_char[strlen(MAC_char)-1] = 0; // letztes Zeichen ":" kürzen
                              // MAC-Adresse steht in der globalen Variable: MAC_char
                              }
                              ! // =========== Meldestring an ioBroker beim Start - hallo hier bin ich (Last Start) *******
                              ! String lastStart() {
                              String lastStartString = "["" + myIp() + "","" + MAC_char + "","" + zeitstempel() + ""]";
                              //String lastStartString = "["" + myIp() + "","" + myMac() + "","" + zeitstempel() + ""]";
                              return lastStartString;
                              }
                              ! // ===== wandelt bool in true/false String um =====
                              String logikBool2Str(boolean logikBool) {
                              String logikStr = "true";
                              if(!logikBool) {
                              logikStr = "false";
                              }
                              return logikStr;
                              }
                              ! // =========== Intervalle *******
                              ! boolean intervall(byte intervallArr, int millisekunden) {
                              if(millis() - intervallLastMillis[intervallArr] > millisekunden) {
                              intervallLastMillis[intervallArr] = millis();
                              return true;
                              }
                              return false;
                              }
                              ! void heartbeatIntervall() {
                              unsigned long intervall3 = deltaHeartbeatMillisOK;
                              if(WiFi.status() != WL_CONNECTED) {
                              intervall3 = deltaHeartbeatMillisError;
                              }
                              else {
                              if(wifiLastStatus != WiFi.status()) {
                              delay(200);
                              melde_ioBroker(dpNameIoBrokerLastStart, lastStart()); // Hallo ioBroker, hier bin ich. Wemos aktiv und gestartet.
                              }
                              }
                              wifiLastStatus = WiFi.status();
                              if(intervall(3, intervall3)) {
                              // Heartbeat
                              if(heartbeatOn || (WiFi.status() != WL_CONNECTED)) { // Heartbeat über LED, wenn eingeschaltet ODER WLAN Verbindung verloren
                              digitalWrite(WM_IO_heartbead_LED, 0);
                              delay(50);
                              digitalWrite(WM_IO_heartbead_LED, 1);
                              if(WiFi.status() != WL_CONNECTED) {
                              Serial.print(".");
                              Serial.print(WiFi.status());
                              }
                              }
                              }
                              }
                              ! // =========== Webserver *******
                              ! void homepage() { // bei Aufruf des Root-Verzeichnisses
                              String betriebszeit = zeitstempel();
                              String antwort = "";

                              int rssi = WiFi.RSSI();
                              

                              ! antwort = "WeMos \t" WM_IO_skriptname " (" WM_IO_version ")";
                              antwort = antwort + "\n\n";
                              antwort = antwort + "\tBetriebszeit: " + betriebszeit + " (Std:Min:Sek)\n";
                              antwort = antwort + "\tVerbunden mit: " + ssid + "\n";
                              antwort = antwort + "\tSignalstaerke: " + String(rssi) + " dBm\n";
                              antwort = antwort + "\tIP: " + myIp() + "\n";
                              antwort = antwort + "\tMAC: " + MAC_char;
                              ! antwort = antwort + "\n\n";
                              antwort = antwort + "ioBroker: \n";
                              antwort = antwort + "\tIP: " + host + "\tPort: " + httpPort;
                              ! antwort = antwort + "\n\n";
                              antwort = antwort + "Systemparameter: \n";
                              antwort = antwort + "\tCOM-Port: "+ serialSpeed + " Baud\n";
                              antwort = antwort + "\tIntervall: "+ deltaMessungSekunden + " Sek.\n";
                              antwort = antwort + "\tHeartbeat LED: "+ logikBool2Str(heartbeatOn);
                              ! antwort = antwort + "\n\n";
                              antwort = antwort + "HTTP-Befehlsuebersicht:\n\n";
                              antwort = antwort + "\thttp://"+myIp()+"/heartbeat?set=<wert>\n\t\tSchaltet den LED Heartbeat ein/aus. ( <wert>= true/false)\n\n";
                              antwort = antwort + "\thttp://"+myIp()+"/tablet?set=<wert>\n\t\tSchaltet das Tablet ueber den Servo ein/aus. ( <wert>= true/false)\n";
                              ! antwort = antwort + "\n\n";
                              antwort = antwort + "Letzes Kommando an ioBroker:\n";
                              antwort = antwort + "\t" + ioBrokerSimpleApiCommand;
                              antwort = antwort + "\n\n";
                              antwort = antwort + "Letzte Antwort ioBroker: \n\n" + ioBrokerSimpleApiAntwort;
                              ! server.send(300, "text/plain", antwort);
                              delay(150);
                              Serial.println(zeitstempel() + " unspezifische HTTP-Anfrage (Root-Verzeichnis) an den Wemos");
                              }
                              ! void webSetHeartbeat() { // bei Aufruf von ".../heartbeat"
                              String set = server.arg("set");
                              if((set == "true") || (set == "1")) {
                              heartbeatOn = true;
                              server.send(200, "text/plain", "Heartbeat ist eingeschaltet");
                              delay(100);
                              Serial.println(zeitstempel() + " Heartbeat ist eingeschaltet");
                              }
                              else if((set == "false") || (set == "0")) {
                              heartbeatOn = false;
                              server.send(200, "text/plain", "Heartbeat ist ausgeschaltet");
                              delay(100);
                              Serial.println(zeitstempel() + " Heartbeat ist ausgeschaltet");
                              }
                              else {
                              server.send(200, "text/plain", "ungueltiger Aufruf. /heartbeat?set= <wert>\t <wert>= true/false");
                              delay(100);
                              Serial.println(zeitstempel() + " ungueltiger Aufruf. /heartbeat?set=<wert>");
                              }
                              }
                              ! void webSetTablet() { // bei Aufruf von ".../tablet"
                              String set = server.arg("set");
                              if(set == "true") {
                              tabletOn = true;
                              setServo(true); // Funktion zum Einschalten
                              server.send(200, "text/plain", "Tablet ist eingeschaltet");
                              delay(100);
                              Serial.println(zeitstempel() + " Tablet ist eingeschaltet");
                              }
                              else if(set == "false") {
                              tabletOn = false;
                              setServo(false); // Funktion zum Ausschalten
                              server.send(200, "text/plain", "Tablet ist ausgeschaltet");
                              delay(100);
                              Serial.println(zeitstempel() + " Tablet ist ausgeschaltet");
                              }
                              else {
                              server.send(200, "text/plain", "ungueltiger Aufruf. /tablet?set= <wert>\t <wert>= true/false");
                              delay(100);
                              Serial.println(zeitstempel() + " ungueltiger Aufruf. /tablet?set=<wert>");
                              }
                              }
                              ! // Servo bewegen
                              /* Sweep
                              by BARRAGAN <http: barraganstudio.com="">This example code is in the public domain.
                              ! modified 8 Nov 2013
                              by Scott Fitzgerald
                              http://www.arduino.cc/en/Tutorial/Sweep
                              ! modified for this Skript by pix
                              23 Mar 2018
                              */
                              void setServo(boolean status) {
                              if(!status) {
                              for (pos = posOn; pos <= posOff; pos += posOffStep) { // goes from 0 degrees to 180 degrees
                              // in steps of 1 degree
                              myservo.write(pos); // tell servo to go to position in variable 'pos'
                              delay(30); // waits 15ms for the servo to reach the position
                              }
                              delay(1000);
                              }
                              else if (status) {
                              for (pos = posOff; pos >= posOn; pos -= posOnStep) { // goes from 180 degrees to 0 degrees
                              myservo.write(pos); // tell servo to go to position in variable 'pos'
                              delay(100); // waits 15ms for the servo to reach the position
                              }
                              delay(1000);
                              }
                              }
                              ! // Melderoutine an ioBroker
                              // =======================================================================
                              // &prettyPrint sorgt für die Rückmeldung des JSON in mehren Zeilen
                              // https://github.com/ioBroker/ioBroker.simple-api/blob/master/README.md#set
                              ! void melde_ioBroker(String datenpunktName, String wert) {
                              String dp = ioBrokerBasisPath + ioBrokerDevice + datenpunktName;
                              if (datenpunktName == dpNameIoBrokerLastStart) {
                              dp = ioBrokerBasisPath + datenpunktName; // "Hallo ioBroker hier bin ich" -> Datenpunkt deviceunabhängig
                              }
                              ioBrokerSimpleApiAntwort = ""; // globale Variale für die Rückantwort von ioBroker
                              ! Serial.println("\n\n" + zeitstempel() + " <- melde_ioBroker Start\n");

                              WiFiClient client; // Webclient initialisieren
                              if (!client.connect(host, httpPort)) { // mit dem CCU-Port verbinden
                                  Serial.println(zeitstempel() + "  Fehler: Verbindung zum ioBroker konnte nicht aufgebaut werden (Eric2905)");
                                  ioBrokerSimpleApiAntwort = zeitstempel() + "  Fehler: Verbindung zum ioBroker konnte nicht aufgebaut werden";
                                  delay(100);
                                  return;
                              }
                              String meldung = "GET /set/" + dp + "?value=" + wert + "&prettyPrint HTTP/1.1";
                              Serial.println(meldung);
                              client.println(meldung);
                              ioBrokerSimpleApiCommand = zeitstempel() + ":  " + meldung;
                              client.println();
                              delay(1000);
                              

                              ! Serial.println();
                              ! ioBrokerSimpleApiAntwort = "\t"+zeitstempel() + ":\n";
                              while(client.available()){ // Antwort des ioBrokers zeilenweise auslesen
                              ! String zeile = "";
                              zeile = client.readStringUntil('\n');
                              Serial.println(zeile);
                              ! ioBrokerSimpleApiAntwort = ioBrokerSimpleApiAntwort + "\t" + zeile + "\n";

                              }
                              Serial.println();
                              Serial.println(zeitstempel() + " Werte an ioBroker gemeldet --> ");
                              

                              }

                              ! // regelmässige Systeminfos an ioBroker (RSSI und uptime)
                              // =======================================================================
                              ! void systeminfos() {

                              int     rssi      = WiFi.RSSI();
                              String  uptime    = zeitstempel();
                              

                              ! char tmp[10];
                              dtostrf(rssi, 1/minStringWidthIncDecimalPoint/, 0/numVarsAfterDecimal/, tmp);
                              String rssiStr = tmp;

                              melde_ioBroker(dpNameIoBrokerRssi   , rssiStr);
                              melde_ioBroker(dpNameIoBrokerUptime , uptime);
                              

                              }

                              ! // Mess-Routine
                              // =======================================================================
                              // ausgabe = 0 // Messung wird nur ausgegeben, wenn eine Änderung der Messwerte erfolgte
                              // ausgabe = 1 // Messung wird immer ausgegeben, auch wenn die Messwerte gleich geblieben sind
                              // alles Messwerte werden als String an ioBroker übermittelt und müssen vor dem Aufruf
                              // der Funktion melde_ioBroker in einen String gewandelt werden.
                              ! void messung(boolean ausgabe) {

                              // Hier kommt dann der Mess-Code rein (oder die echten Messwerte)
                              // Servowerte sind keine Messwerte, da Servo nicht ausgelesen werden kann. Sind die zuletzt gesetzten Werte
                              int ioBrokerDemo1Value;
                              if (tabletOn) {
                              ioBrokerDemo1Value = posOn;
                              } else if (!tabletOn) {
                              ioBrokerDemo1Value = posOff;
                              }

                              ! // Check if any reads failed and exit early (to try again).
                              if (isnan(ioBrokerDemo1Value) /|| isnan(ioBrokerDemo2Value)/) {
                              Serial.println("Failed to read from servo!");
                              return;
                              }
                              ! // Umwandlung float in String
                              char tmp[10];
                              dtostrf(ioBrokerDemo1Value, 1/minStringWidthIncDecimalPoint/, 2/numVarsAfterDecimal/, tmp);
                              String out1 = tmp;
                              //dtostrf(ioBrokerDemo2Value, 1/minStringWidthIncDecimalPoint/, 2/numVarsAfterDecimal/, tmp);
                              //String out2 = tmp;
                              ! // Messwerte schreiben, wenn sich der Wert geändert hat
                              if ((out1 != ioBrokerDemo1ValueAlt) || (ausgabe == 1)) {
                              melde_ioBroker(dpNameIoBrokerDemo1,out1);
                              ioBrokerDemo1ValueAlt = out1;
                              }
                              /*if ((out2 != ioBrokerDemo2ValueAlt) || (ausgabe == 1)) {
                              melde_ioBroker(dpNameIoBrokerDemo2,out2);
                              ioBrokerDemo2ValueAlt = out2;
                              } */
                              }
                              ! // =======================================================================
                              // setup() - Setup-Routine
                              // =======================================================================
                              ! void setup() {
                              // Servo
                              myservo.attach(D5); // attaches the servo on pin 9 to the servo object
                              setServo(true); // ggf auskommentieren, beim Anschließen einschalten

                              // Heartbeat
                              pinMode(WM_IO_heartbead_LED, OUTPUT); // Pin "WM_IO_heartbead_LED" wird als Output definiert, die interne LED ist mit D4 "fest verdrahtet"
                              digitalWrite(WM_IO_heartbead_LED, 1); // 1 = LED aus
                              
                              // Seriellen Monitor für Kontrollausgaben öffnen
                              Serial.begin(serialSpeed);     // initialize serial (Geschwindigkeit in der Variable "serialSpeed")
                              delay(10);
                              Serial.println("");
                              Serial.println("WeMos - " WM_IO_skriptname "  (" WM_IO_version ")");
                              Serial.println("");
                              
                              // WLAN-Verbindung herstellen
                              //WiFi.config(ip, gateway, subnet); // auskommentieren, falls eine dynamische IP bezogen werden soll
                              WiFi.begin(ssid, password);
                              Serial.println("Verbindungsaufbau zur ssid: " WM_IO_WLAN_ssid);
                              Serial.println("");
                              Serial.print(zeitstempel() + " ");
                              

                              ! myMac(); // Mac-Adresse ermitteln und in die globale Variable "MAC_char" schreiben
                              ! // Verbindungsaufbau abwarten
                              while (WiFi.status() != WL_CONNECTED) {
                              heartbeatIntervall();
                              //delay(500);
                              //Serial.print(".");
                              }
                              wifiLastStatus = WiFi.status();

                              // WLAN verbunden, weiter im setup()
                              

                              ! // Ausgaben im seriellen Monitor
                              Serial.println("");
                              Serial.println(zeitstempel() + " erfolgreich!");
                              Serial.println("");
                              Serial.println("Verbunden mit: " WM_IO_WLAN_ssid);
                              //Serial.println(ssid);
                              Serial.print("Signalstaerke: ");
                              int rssi = WiFi.RSSI();
                              Serial.print(rssi);
                              Serial.println(" dBm");
                              Serial.print("IP-Adresse: ");
                              Serial.print(WiFi.localIP());
                              Serial.println("");
                              Serial.print("MAC-Adresse: ");
                              Serial.println(MAC_char);
                              Serial.println("");
                              ! // HTTP-Anfragen bearbeiten
                              server.on("/" , homepage);
                              server.on("/heartbeat", webSetHeartbeat);
                              server.on("/tablet", webSetTablet);
                              // HTTP-Server starten
                              server.begin();
                              Serial.println(zeitstempel() + " HTTP-Server gestartet");
                              ! // WLAN-/Systeminfos an ioBroker übermitteln (Datenpunkte müssen in ioBroker angelegt sein)
                              melde_ioBroker(dpNameIoBrokerLastStart, lastStart()); // Hallo ioBroker, hier bin ich. Wemos aktiv und gestartet.
                              systeminfos(); // uptime und rssi
                              melde_ioBroker(dpNameIoBrokerSsid , ssid); // ssid
                              melde_ioBroker(dpNameIoBrokerWemosIp, myIp()); // ip
                              melde_ioBroker(dpNameIoBrokerWemosMac, MAC_char);
                              }
                              ! // =======================================================================
                              // loop() - Schleife, die immer wieder durchlaufen wird
                              // =======================================================================
                              ! void loop() {
                              server.handleClient(); // auf HTTP-Anfragen warten
                              ! // kontinuierliche Überprüfung der Messwerte, Ausgabe nur bei Änderung
                              messung(0); // 0 = Ausgabe der Messwerte nur bei Änderung, 1 = AUsgabe des Messwerts bei jedem Aufruf (1 ist nur im Intervall sinnvoll)
                              ! // Intervall 0: Messintervall - Verarbeiten wenn Zeitintervall erreicht
                              if(intervall(0,deltaMessungSekunden * 1000)) { // alle "deltaMessungSekunden" Sekunden
                              Serial.print("\nMess-Zeitpunkt : ");
                              Serial.println(zeitstempel());
                              //messung(1); // wenn zyklisch zusätzlich immer Werte ausgegeben werden sollen -> 1 = Ausgabe der Messwerte, auch wenn die Werte sich nicht geändert haben
                              } // Ende Zeitintervall 0
                              ! // Intervall 1: Systemmeldungen an ioBroker - Verarbeiten wenn Zeitintervall erreicht
                              if(intervall(1, deltaSysinfosSekunden * 1000)) {
                              systeminfos();
                              }
                              ! // Intervall 2: Verarbeiten wenn Zeitintervall erreicht
                              // Reserve
                              if(intervall(2, 1 * 1000)) { // jede Sekunde
                              Serial.print("."); // Reserve - Beispiel
                              }
                              ! // Intervall 3: Heartbeat - Verarbeiten wenn Zeitintervall erreicht
                              heartbeatIntervall();
                              ! // Intervall 4: Reserve - Verarbeiten wenn Zeitintervall erreicht
                              // Reserve
                              if(intervall(4, 5 * 1000)) {
                              Serial.print(WiFi.status());
                              }
                              }</http:></wert></wert></wert></wert></wert></wert></wert></wert></wert></wert></wire.h></servo.h></esp8266webserver.h></esp8266wifi.h></wert></ip-adresse>`
                              ! 261_img_5135_ergebnis.jpg 261_videos2.zip
                              ! In ioBroker wird per SimpleAPI hier gespeichert:
                              ! javascript.0.Wemos.Device.NR.....
                              ! 261_objekte.png
                              ! Vielen Dank an Ruhr70 und Eric für die Vorarbeit.
                              ! Gruß
                              ! Pix[/i]

                              ioBroker auf Ubuntu in Proxmox (früher Mac mini (bis OS X 10.12.6 Sierra), VIS via iOS; angeschlossen: Homematic CCU2, Homepilot 1, ConBee II, einige Wemos, Sonos, Unifi CK+Protect, Homekit, Homebridge; KEIN blockly! Github-Profil

                              1 Reply Last reply
                              0
                              • M Offline
                                M Offline
                                mrmomba
                                wrote on last edited by
                                #15

                                Wow,

                                Das Projekt gab es ja schon Oo!

                                Verdammt.

                                Ich habe ein ähnliches Projekt umgesetzt:

                                viewtopic.php?f=34&t=12419

                                Jedoch zielt es bei mir darauf hin ab,

                                Das, wenn man die Anleitung 1:1 befolgt nur eine festdefinierte Anzahl an Funktionen hat und MQTT nutzt.

                                Hier sind aber noch ein paar tolle Ideen versteckt - die schau ich mir mal an.

                                1 Reply Last reply
                                0
                                • K Offline
                                  K Offline
                                  Knorki
                                  wrote on last edited by
                                  #16

                                  Hallo,

                                  ich stehe noch ganz am Anfang mit Arduino und Iobroker, hab versucht mich einzulesen, aber so ganz durchschaue ich das leider noch nicht.

                                  Ich möchte gerne einen Ultraschallsensor HC-SR04 https://www.amazon.de/Aukru-Ultraschall … 225d024523 oder als wasserdichte Version den JSN-SR04T https://www.amazon.de/JSN-SR04T-Waterpr … 896f400905 in den Basissketch einfügen, hab nur leider keinen Plan, wie ich das bewerkstelligen soll.

                                  Hat jemand evtl. dies schon gemacht und kann mir den Code dafür geben? Vielen Dank im Voraus

                                  Gruß

                                  Stefan

                                  1 Reply Last reply
                                  0
                                  • M Offline
                                    M Offline
                                    mrmomba
                                    wrote on last edited by
                                    #17

                                    Das scheint nicht ganz so trivial und arbeitet auch mit 5V statt mit 3.3V.

                                    Denn der Wemos verträgt nur 3.3V an den Pins 😉

                                    1 Reply Last reply
                                    0
                                    • G Offline
                                      G Offline
                                      George_Best
                                      wrote on last edited by
                                      #18

                                      Ich denke die 5V sind die Versorgungsspannung. An den Ausgängen kommen dann die 3.3 V an. Das ist so ziemlich bei allen Erweiterungen für Wemos (Shield Board, Display etc.) so.

                                      1 Reply Last reply
                                      0
                                      • T Offline
                                        T Offline
                                        tom1tom11
                                        wrote on last edited by
                                        #19

                                        Das ist genau das was ich suche, aber ich weiß nicht wie ich das eingebunden bekomme.

                                        Kann man die Datenpunkte wie im Beitrag des Erstellers auch direkt importieren?

                                        1 Reply Last reply
                                        0
                                        • bahnuhrB Online
                                          bahnuhrB Online
                                          bahnuhr
                                          Forum Testing Most Active
                                          wrote on last edited by
                                          #20

                                          @ruhr70 sagte in Wemos D1 Mini (Arduino) - Basis Sketch:

                                          esp8266webserver.h

                                          Hallo,
                                          ich probiere gerade mit o.g. Script klarzukommen.

                                          Habe eine Wemos D1 mini und flashe mit Arduino 1.8.9

                                          Kann mir jemand sagen wo ich die o.g. bibliothek herbekomme.

                                          Also welche muss ich auswählen damit "esp8266webserver.h" gefunden wird.

                                          Irgendwie komme ich damit noch nicht so klar.

                                          Helft mir mal auf die Sprünge.
                                          Danke.

                                          mfg


                                          Wenn ich helfen konnte, dann Daumen hoch (Pfeil nach oben)!
                                          Danke.
                                          gute Forenbeiträge: https://forum.iobroker.net/topic/51555/hinweise-f%C3%BCr-gute-forenbeitr%C3%A4ge
                                          ScreenToGif :https://www.screentogif.com/downloads.html

                                          1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          520

                                          Online

                                          32.4k

                                          Users

                                          81.4k

                                          Topics

                                          1.3m

                                          Posts
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Recent
                                          • Tags
                                          • Unread 0
                                          • Categories
                                          • Unreplied
                                          • Popular
                                          • GitHub
                                          • Docu
                                          • Hilfe