WeMos D1 mini als WLAN-Sensor/-Aktor

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

mfahs
Beiträge: 280
Registriert: 18.01.2011, 00:06

WeMos D1 mini als WLAN-Sensor/-Aktor

Beitrag von mfahs » 05.06.2017, 22:50

Hallo fsommer1968,

Du hattest Dir vor längerer Zeit meinen Sketch für den BME280 angesehen - Du erinnerst Dich?
fsommer1968 hat geschrieben: hier sind meine Anmerkungen zu deinem Sketch:
Es hat etwas gedauert, bis ich Deine Vorschläge in die Tat umsetzen konnte (der Wemos wohnt in einem Ferienhaus...), anschließend musste ich ja auch noch das Ergebnis abwarten.
Es ist einfach zu beschreiben: Seit über 2 Wochen läuft der Wemos mit dem von Dir modifizierten Sketch bisher problemlos durch!
Das sieht ganz großartig aus! Ganz herzlichen Dank!!
fsommer1968 hat geschrieben: Edit: Ich habe mir soeben mal die verwendete Library "BME280_t.h" angesehen, die ist großer Mist! Bau den Sketch am Besten auf Klassischs MOD_1022 Lib um, dann brauchts auch weniger Strom und der Akku hält länger durch. Über die Qualität der Meßwerte kann ich nichts sagen, die können aber unmöglich besser sein, als die der Adafruit Lib.
Den Zusatz habe ich erst eben gerade entdeckt - das muss ich in zwei Wochen mal nachholen, wenn ich wieder Zugriff auf den Wemos habe...

Nochmals vielen Dank!

Martin

klassisch
Beiträge: 3974
Registriert: 24.03.2011, 04:32
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 110 Mal
Danksagung erhalten: 71 Mal

Re: WeMos D1 mini als WLAN-Sensor/-Aktor

Beitrag von klassisch » 06.06.2017, 22:34

Wer es noch nicht gesehen hat: fsommer1968 hat dort viewtopic.php?f=31&t=37489&p=366518#p366518 dankenswerterweise einen bewußt einfach gehaltenen aber professionell programmierten Sketch für einen T, H, p, Helligkeit, UV-Sensor mit Batteriebetrieb zur Verfügung gestellt. So stromsparend wie es mit einem ESP8266 nur geht.
Anbindung an CCU ist gegeben. Wählbar via Systemvariablen oder CUxD.
Wer MQTT braucht, kann dort mal nachfragen.

dondaik
Beiträge: 12924
Registriert: 16.01.2009, 18:48
Wohnort: Steingaden
Hat sich bedankt: 1597 Mal
Danksagung erhalten: 222 Mal

Re: WeMos D1 mini als WLAN-Sensor/-Aktor

Beitrag von dondaik » 19.06.2017, 16:23

gerade mal wieder einen für mich neuen sensor entdeckt _ - > Si1145 -

https://www.youtube.com/watch?v=ZIeIlvg ... K2SiFIHk-6
-------
!!! der download der handbüchern auf den seiten von eq3 und das lesen der tips und tricks kann das hm-leben sehr erleichtern - das nutzen der suche nach schlagworten ebenso :mrgreen: !!!
wer schreibfehler findet darf sie behalten.

JimBeam
Beiträge: 11
Registriert: 19.04.2014, 09:37
System: sonstige

Re: WeMos D1 mini als WLAN-Sensor/-Aktor

Beitrag von JimBeam » 22.06.2017, 11:25

Moin,

Ich benötige mal wieder eure hilfe. Ich habe versucht mir einen Sketch zu basteln aus zwei hier im Forum geposteten. Das Ziel ist es über einen Wemos D1 mini ein Relais und einen DS18B20 "anzuklemmen" was auch soweit funktioniert. Was nicht funktioniert ist es die Daten vom DS an die CCU zu übertragen, die Systemvariable ist vorhanden funktioniert auch wenn ich den Sketch nur für den DS benutze sobald ich aber versuche das Relais da irgendwie mit einzubauen funzt es nicht mehr.
Vl. könnt ihr mal über meinen Sketch drüber schauen und mir nen Tip geben.

P.S. ich habe vom programieren so gut wie KEINE AHNUNG, das basiert eher alles auf einer try & error Methode

Code: Alles auswählen

/*
*  WeMos-Schaltaktor (mit Status-Meldung an CUxD und Taster-Support)
*
*  Getesteter Aufbau:
*     WeMos D1 mini
*     Relay Shield mini
*     Pin-Belegung:
*        D1: Steuerleitung Relais
*        D2: Taster-Öffner
*        D4: DS18B20
*/

#include <OneWire.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
// DS18S20 Temperaturchip i/o
OneWire ds(D4); // an pin D4

//Hier die Adressen von den Sensoren eingeben

#define Poolwasser1 "28 FF D0 E3 43 16 3 A6" //Dies sind nur Beispiele

// Einstellungen für Messungen und Meldungen
#define ZEITINTERVALL_MESSUNGEN 10 //Abfragezyklus der Sensoren in Sekunden
#define ZEITINTERVALL_MELDUNGEN 60 //Sendeintervall an die Homematic in Sekunden
#define DELTA_TEMPERATURSCHWELLWERT 0.1 //Temperaturdifferenz zum senden an die Homematic in °C


// ******* Netzwerkeinstellungen, bitte anpassen! *******
const char* ssid = "wlan"; // SSID des vorhandenen WLANs
const char* password = "xxxxxxxxxxxxxxxx"; // Passwort für das vorhandene WLAN
const char* host = "192.168.1.51"; // IP-Adresse der CCU
IPAddress gateway(192,168,1,1); // IP-Adresse des WLAN-Gateways
IPAddress dns_ip(192,168,1,1); // IP-Adresse DNS Server
IPAddress subnet(255,255,255,0); // Subnetzmaske
IPAddress ip(192,168,1,64); // feste IP-Adresse für den WeMos
ESP8266WebServer server(80); // Webserver initialisieren auf Port 80
WiFiServer server2(8181);
//String tempCCUname = "Poolwasser1"; // Bezeichnung der CCU-Systemvariable für die gemessene Temperatur
// virtuelle CCU 
String virtual_CCU = "nein"; // ja/nein

  
// ab hier muß eigentlich nichts mehr geändert werden.....
 
// ******* Einstellungen HTML *******
String HTML_title = "Sandfilter (Poolpumpe)";
String HTML_background_color = "0D4C75"; //0D4C75
String HTML_title_color = "C9C9C9"; //9A916C
String HTML_text_color = "FFFFFF";
String HTML_color1 = "CECECE";
String HTML_color2 = "9A916C";
String Version = "1.2";
String Status = "0";
String Status_alt = "0";
String Status_Aenderung = "nein";
String Taster = "unbekannt";
String action = "0";
String transmit_state = "ja";

String HTML_head = "<h2><font color='#" + HTML_title_color +"'>" + HTML_title + "</font></h2>";
String HTML_end = "</body></html>";
String HTML_style = "style='background-color: #" + HTML_background_color +"; color: #" + HTML_text_color +";' alink='#" + HTML_color2 +"' link='#" + HTML_color1 +"' vlink='#" + HTML_color1 +"'";
// ******* Einstellungen für CUxD, bitte anpassen! *******
String transmit_state_R1 = "ja"; // ja/nein
String CUxD_Geraet = "CUX2801012:1"; // SN:Kanal

// Definition der Ports ....
const int relay_R1 = D1 ;
const int switch_R1 = D2 ;

char ConnectString[255] = "";
String Antwort = "";
unsigned long deltaMessungSekunden = ZEITINTERVALL_MESSUNGEN; //Zeitintervall (Sekunden) nach dem eine Messung erfolgt
unsigned long deltaMeldungSekunden = ZEITINTERVALL_MELDUNGEN; // Zeitintervall (Sekunden) nach dem eine CCU-Meldung erfolgt (0 bedeutet nie)
unsigned long jetztMillis = 0;
unsigned long deltaMessungMillis = deltaMessungSekunden * 1000, letzteMessungMillis = 0;
unsigned long deltaMeldungMillis = deltaMeldungSekunden * 1000, letzteMeldungMillis = 0;
String antwort = "", meldung = "";
float deltaTemp = DELTA_TEMPERATURSCHWELLWERT; // Temperaturaenderung (*C) bei der eine CCU-Meldung erfolgt (0 bedeutet nie)
float temp = 0, tempCCU = 0;
float NewTemp[10] = {-255};
float OldTemp[10] = {-255};


String zeitstempel()
{ // Betriebszeit als Stunde:Minute:Sekunde
char stempel[10];
int lfdStunden = millis()/3600000;
int lfdMinuten = millis()/60000-lfdStunden*60;
int lfdSekunden = millis()/1000-lfdStunden*3600-lfdMinuten*60;
sprintf (stempel,"%03d:%02d:%02d", lfdStunden, lfdMinuten, lfdSekunden);
return stempel;
}

void status_aktuallisieren(){
  if (digitalRead(relay_R1) == HIGH) {Status = "1";}
  if (digitalRead(relay_R1) == LOW) {Status = "0";}
}


void set_CUxD() {
  String meldung = "";
  WiFiClient client; // Webclient initialisieren
  if (!client.connect(host, 8181)) { // mit dem CCU-Port 8181 verbinden
    Serial.println(" Fehler: Verbindung zur CCU konnte nicht aufgebaut werden");
    delay(50);
    return;
  }
  meldung = meldung +"GET /WeMos.exe?state=dom.GetObject('CUxD." + CUxD_Geraet + ".SET_STATE').State('" + Status + "')";
  client.println(meldung); // Daten an CCU melden
}

void WLANVerbindung()
{
// WLAN-Verbindung herstellen
WiFi.config(ip, gateway, subnet); // auskommentieren, falls eine dynamische IP bezogen werden soll
WiFi.begin(ssid, password);
Serial.print("Verbindungsaufbau");
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("");

sprintf(ConnectString, "</br></br>Verbunden mit: %s </br>Signalstaerke: %d dBm </br></br>", ssid, rssi);

server.on("/", Hauptseite);
// HTTP-Server starten

server.begin();
  Serial.println(zeitstempel() + " HTTP-Server gestartet");
  if (transmit_state == "ja") {set_CUxD();} 
  int sensorVal = digitalRead(switch_R1);
 // Serial.println(sensorVal);
  if (sensorVal == HIGH) {Taster = "schliesser";} else {Taster = "oeffner";}
  
  
  // Start server2
  if (virtual_CCU == "ja") {server2.begin(); Serial.println(zeitstempel() + " virtuelle CCU gestarted");}
}



void cmd() { // bei Aufruf von "../cmd"  R1%3D0 R1%3D1

  String CUxD = server.arg("CUxD");
  String R1 = server.arg("R1");
  String transmit = server.arg("transmit");

  if (R1 == "1" && transmit == "1") {action = "1"; action_1();}
  else if (R1 == "0" && transmit == "1") {action = "0"; action_1();}
  else if ( (R1 == "1" && transmit == "0") || (R1 == "1") ) {action = "1"; action_2();}
  else if ( (R1 == "0" && transmit == "0") || (R1 == "0") ) {action = "0"; action_2();} 
  else if (R1 == "state") {get_state();}
  else if (CUxD == "0") {transmit_state_R1 = "ja"; help(); Serial.println("CUxD-Meldungen: ja");}
  else if (CUxD == "1") {transmit_state_R1 = "nein"; help(); Serial.println("CUxD-Meldungen: nein");}
  else {
   help();
        delay(100);
        Serial.println(zeitstempel() + " Help");
  }
}

void setup(void){
// inputs/outputs initialisieren
// seriellen port starten
  pinMode(relay_R1, OUTPUT); // Relais-Pin als Ausgang setzen
  digitalWrite(relay_R1, LOW);  
  pinMode(switch_R1, INPUT_PULLUP); // Taster zum schaltet

  Serial.begin(115200);
  Serial.println("");
  Serial.println("WeMos-Schaltaktor");
    server.on("/", root);
  server.on("/R1-1", [](){action = "1"; action_1();});
  server.on("/R1-0", [](){action = "0"; action_1();});
  server.on("/cmd", cmd);
  server.on("/taster", taster);   
  server.on("/help", help);
//ListSensors();
WLANVerbindung();
}
bool Contains(String s, String search)
{
int max = s.length() - search.length();

for (int i = 0; i <= max; i++) {
if (s.substring(i) == search) return true; // or i
}

return false; //or -1
}


void MeldeWert(char* Sensor, float Temp) {
String meldung1 = "";
WiFiClient client; // Webclient initialisieren
if (!client.connect(host, 8181)) { // mit dem CCU-Port 8181 verbinden
Serial.println(" Fehler: Verbindung zur CCU konnte nicht aufgebaut werden");
delay(50);
return;
}
  meldung1 = meldung1 +"GET /WeMos.exe?befehl=dom.GetObject('" + Sensor +"').SET_State('" + Temp + "')";
client.println(meldung1); // Daten an CCU melden
}

void root() { // bei Aufruf des Root-Verzeichnisses
  String tempCCUname = "Poolwasser1"; // Bezeichnung der CCU-Systemvariable für die gemessene Temperatur
  String HTML_content = "";
  String button_text = "null";
  String button_color = "FFD06E";
  String button = "<span style='margin-left: 10px; background-color: #" + button_color +"; color: #000; display: inline-block; padding: 2px 10px; font-weight: bold; border: 2px solid #4f4f4f; border-radius: 2px; text-decoration: none;'>" + button_text +"</span>";
  String HTML_start = "<html><head><meta http-equiv='refresh' content='3'><meta name='theme-color' content='#" + HTML_background_color +"'><title>" + HTML_title + "</title></head><body " + HTML_style + ">";
  String temp = zeitstempel();
  String WeMos_ip = WiFi.localIP().toString();  
  HTML_content = HTML_start + HTML_head;
  if (digitalRead(relay_R1) == HIGH) {
  button_text = "eingeschaltet";
  button_color = "70E670";
  button = "<span style='margin-left: 10px; background-color: #" + button_color +"; color: #000; display: inline-block; padding: 2px 10px; font-weight: bold; border: 2px solid #4f4f4f; border-radius: 2px; text-decoration: none;'>" + button_text +"</span>";
  HTML_content = HTML_content + "<strong>Status: <a target='answer_wemos' href='http://" + WeMos_ip + "/cmd?R1=0'>" + button +"</a></strong><br><br>";
  }
  else {
  button_text = "ausgeschaltet";
  button_color = "A8A8A8";
  button = "<span style='margin-left: 10px; background-color: #" + button_color +"; color: #000; display: inline-block; padding: 2px 10px; font-weight: bold; border: 2px solid #4f4f4f; border-radius: 2px; text-decoration: none;'>" + button_text +"</span>";
  HTML_content = HTML_content + "<strong>Status: <a target='answer_wemos' href='http://" + WeMos_ip + "/cmd?R1=1'>" + button +"</a></strong><br><br>";
  }
  HTML_content = HTML_content + "Betriebszeit: <font color='#" + HTML_color2 +"'><em>" + temp + " (Std:Min:Sek)</em></font><br>";
  HTML_content = HTML_content + "Verbunden mit: <font color='#" + HTML_color2 +"'><em>" + ssid + "</em></font><br>";
  int rssi = WiFi.RSSI();
  HTML_content = HTML_content + "Signalstaerke: <font color='#" + HTML_color2 +"'><em>" + String(rssi) + " dBm</em></font><br><br>";
  HTML_content = HTML_content + "<strong><a href='http://" + WeMos_ip + "/help'>Hilfe</a></strong>"; 
  HTML_content = HTML_content + "<iframe name='answer_wemos' frameborder='no' height='0' width='0'>Sorry, no frames.</iframe>"; 
  server.send(300, "text/html", HTML_content + HTML_end);
  delay(150);
}
void help() {
String HTML_content = "";
String HTML_start = "<html><head><meta name='theme-color' content='#" + HTML_background_color +"'><title>" + HTML_title + "</title></head><body " + HTML_style + ">";
String WeMos_ip = WiFi.localIP().toString();  
  HTML_content = HTML_start + HTML_head;
  HTML_content = HTML_content + "<strong><font color='#" + HTML_title_color +"'>Schaltaktor mit Taster und Statusmeldung an CUxD (28)exec, CCU-RemotePC kompatibel</font>";
  HTML_content = HTML_content + "&nbsp;&nbsp;&nbsp;<font color='#" + HTML_color2 +"'>Version: <em>" + Version + "</em></font></strong>";
  HTML_content = HTML_content + "<h3>Konfiguration fuer R1:</h3>";
  HTML_content = HTML_content + "<li>Status senden: <font color='#" + HTML_color2 +"'><em>" + transmit_state_R1 + "</em></font></li>";
  HTML_content = HTML_content + "<li>CUxD-Geraet: <font color='#" + HTML_color2 +"'><em>" + CUxD_Geraet + "</em></font></li>";
  HTML_content = HTML_content + "<li>Taster-Typ: <font color='#" + HTML_color2 +"'><em>" + Taster + "</em></font></li><br>";
  HTML_content = HTML_content + "<h3>HTTP-Befehlsuebersicht:</h3>";
  HTML_content = HTML_content + "<li>\"<font color='#" + HTML_color1 +"'>http://" + WeMos_ip + "/cmd?R1=0</font>\" schaltet das Relais mit Statusmeldung an CUxD aus</li>";
  HTML_content = HTML_content + "<li>\"<font color='#" + HTML_color1 +"'>http://" + WeMos_ip + "/cmd?R1=1</font>\" schaltet das Relais mit Statusmeldung an CUxD ein</li>";
  HTML_content = HTML_content + "<li>\"<font color='#" + HTML_color1 +"'>http://" + WeMos_ip + "/cmd?R1=0&transmit=0</font>\" schaltet das Relais ohne Statusmeldung an CUxD aus</li>";
  HTML_content = HTML_content + "<li>\"<font color='#" + HTML_color1 +"'>http://" + WeMos_ip + "/cmd?R1=1&transmit=0</font>\" schaltet das Relais ohne Statusmeldung an CUxD ein</li>";
  HTML_content = HTML_content + "<li>\"<font color='#" + HTML_color1 +"'>http://" + WeMos_ip + "/cmd?R1=state</font>\" gibt den Schaltzustand des Relais als Logikwert (\"0\" oder \"1\") zurueck</li>";
  HTML_content = HTML_content + "<li>\"<font color='#" + HTML_color1 +"'>http://" + WeMos_ip + "/cmd?CUxD=0</font>\" Statusmeldung an CUxD bis zum reboot ausschaltet</li>";
  HTML_content = HTML_content + "<li>\"<font color='#" + HTML_color1 +"'>http://" + WeMos_ip + "/cmd?CUxD=1</font>\" Statusmeldung an CUxD einschaltet</li><br>";
  HTML_content = HTML_content + "<h3>CUxD-Integration:</h3>";   
  HTML_content = HTML_content + "<li>Mit CUxD ein Geraet vom Typ (28)System/Exec/Schalter erstellen</li>";  
  HTML_content = HTML_content + "<li>In der CCU im Posteingang konfigurieren:<br>"; 
  HTML_content = HTML_content + "&nbsp;&nbsp;&nbsp;SWITCH|CMD_SHORT: <font color='#" + HTML_color1 +"'>/usr/local/addons/cuxd/curl -s -m 5 \'http://" + WeMos_ip + "/R1-0\'</font><br>"; 
  HTML_content = HTML_content + "&nbsp;&nbsp;&nbsp;SWITCH|CMD_LONG: <font color='#" + HTML_color1 +"'>/usr/local/addons/cuxd/curl -s -m 5 \'http://" + WeMos_ip + "/R1-1\'</font></li><br><br>"; 
  HTML_content = HTML_content + "&nbsp;&nbsp;&nbsp;SWITCH|CMD_SHORT: <font color='#" + HTML_color1 +"'>/usr/local/addons/cuxd/curl -s -m 5 \'http://" + WeMos_ip + "/R2-0\'</font><br>"; 
  HTML_content = HTML_content + "&nbsp;&nbsp;&nbsp;SWITCH|CMD_LONG: <font color='#" + HTML_color1 +"'>/usr/local/addons/cuxd/curl -s -m 5 \'http://" + WeMos_ip + "/R2-1\'</font></li><br><br>";  
  
  HTML_content = HTML_content + "<li>\"virtual_CCU\" im Sketch auf \"ja\" stellen</li>";   
  HTML_content = HTML_content + "<br><strong><a href='http://" + WeMos_ip + "'>zurueck</a></strong><br>";
  server.send(300, "text/html", HTML_content + HTML_end);
}
void turn_on() {
  digitalWrite(relay_R1, HIGH);
  Serial.println("off");
}

void turn_off() {
  digitalWrite(relay_R1, LOW);
  Serial.println("on");
}

// Tasterfunktion
void taster(){
  pinMode(D1, OUTPUT);
  digitalWrite(D1, HIGH);
  delay(1000); // Das ist die Schaltzeit in Millisekunden
  digitalWrite(D1, LOW);
  server.send(200, "text/plain", "Taster wurde betätigt");
  delay(100);
  Serial.println(zeitstempel() + " ueber HTTP Taster betätigt");
}

void action_1() { //keinen status senden
  String aktor_status = "unbekannt";
  if (action == "1") {turn_on(); aktor_status = "eingeschaltet";}
  if (action == "0") {turn_off(); aktor_status = "ausgeschaltet";}
  Status_alt = action;
  status_aktuallisieren();
  server.send(200, "text/plain", "WeMos-Schaltaktor ist "+ aktor_status +", keine Meldung an CUxD");
}

void action_2() { //status senden
  String aktor_status = "unbekannt";
  if (action == "1") {turn_on(); aktor_status = "eingeschaltet";}
  if (action == "0") {turn_off(); aktor_status = "ausgeschaltet";}
  Status_alt = action;
  status_aktuallisieren();
  if (transmit_state == "ja") {set_CUxD();}
  server.send(200, "text/plain", "WeMos-Schaltaktor ist "+ aktor_status +", Meldung an CUxD");
}

void get_state() {
  String temp = zeitstempel();
  status_aktuallisieren();
  server.send(200, "text/plain", Status);
  delay(100);
  Serial.println(zeitstempel() + " ueber HTTP Status gemeldet");
}
void get_state_CCU() {
  String CCU_state = "null";
  String temp = zeitstempel();
  status_aktuallisieren();
  if (Status == "0") {CCU_state = "<state>false</state>";} else {CCU_state = "<state>true</state>";}
  server.send(200, "text/plain", CCU_state);
  delay(100);
  Serial.println(zeitstempel() + " ueber HTTP Status gemeldet");
}

void server_2() {
 // Check if a client has connected

  WiFiClient client = server2.available();
  if (!client) {
    return;
  }

  // Wait until the client sends some data
  Serial.println("new client");
  while(!client.available()){
    delay(1);
  }

  // Read the first line of the request
  String request = client.readStringUntil('\r');
  Serial.println(request);
  client.flush();    
 
  // Match the request
  if (request.indexOf("=dom.GetObject('CUxD.WeMos00000:1.STATE').State(1)") != -1) {action = "1"; action_1();} 
  if (request.indexOf("=dom.GetObject%28%27CUxD.WeMos00000%3A1.STATE%27%29.State%281%29") != -1) {action = "1"; action_1();}   
  
  if (request.indexOf("=dom.GetObject('CUxD.WeMos00000:1.STATE').State(0)") != -1){action = "0"; action_1();}
  if (request.indexOf("=dom.GetObject%28%27CUxD.WeMos00000%3A1.STATE%27%29.State%280%29") != -1) {action = "0"; action_1();}  
  
  if (request.indexOf("=dom.GetObject('CUxD.WeMos00000:1.STATE').Value()") != -1){get_state();} 
  if (request.indexOf("=dom.GetObject%28%27CUxD.WeMos00000%3A1.STATE%27%29.Value%28%29") != -1) {get_state();}  

  // Return the response
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/xml");
  client.println(""); //  do not forget this one
  client.print("<xml><state>");
 
  if(Status == "1") {
    client.print("true");  
  } else {
    client.print("false");
  }
    client.print("</state></xml>");

  delay(1);
  Serial.println("Client disconnected");
  Serial.println("");
}

void ListSensors(void)
{
int count=0,i=0;
byte addr[8];
float Temp = 0.0;

char Adress[10][255] = {""};
while(ds.search(addr))
{
sprintf(Adress[count], "");
for( i = 0; i < 8; i++)
{
sprintf(Adress[count], "%s %X", Adress[count],addr[i]);
}
count++;
}
Antwort += "Gefundene Sensoren \n</br>";
Serial.print("\nGefundene Sensoren\n");
for(count = 0; count<10;count++)
{
if(strcmp(Adress[count], ""))
{
Antwort += Adress[count];
Serial.print(Adress[count]);
Antwort += " Poolwasser: ";
Serial.print(" Poolwasser: ");
Temp = GetRoomTemperature(Adress[count], true);
Antwort += Temp;
Serial.print(Temp);
Antwort += "\n</br>";
Serial.print("\n");
}
}

Antwort += "</br>";
Serial.print("\n");
Antwort += "Definierte Sensoren:\n</br>";
Serial.print("Definierte Sensoren:\n");

for(count = 0; count<10;count++)
{
if(Contains(Adress[count], Poolwasser1) && strcmp(Adress[count], "") && strcmp(Poolwasser1, ""))
{
Antwort += "SENSOR1: ";
Serial.print("SENSOR1: ");
Antwort += Adress[count];
Serial.print(Adress[count]);
Antwort += " Poolwasser: ";
Serial.print(" Poolwasser: ");
Temp = GetRoomTemperature(Adress[count], true);
Antwort += Temp;
Serial.print(Temp);
Antwort += "\n</br>";
Serial.print("\n");
//MeldeWert("Sensor1", Temp);

OldTemp[0] = NewTemp[0];
NewTemp[0] = Temp;
if(OldTemp[0] == -255) OldTemp[0] = Temp;
}
}

Antwort += "</br>";
Serial.print("\n");
Antwort += "Nicht definierte Sensoren:\n</br>";
Serial.print("Nicht definierte Sensoren:\n");

for(count = 0; count<10;count++)
{
//Serial.print(Adress[count]);
if(!(Contains(Adress[count], Poolwasser1) && strcmp(Poolwasser1, "")))

{
if(strcmp(Adress[count], ""))
{
Antwort += Adress[count];
Serial.print(Adress[count]);
Antwort += " Poolwasser: ";
Serial.print(" Poolwasser: ");
Temp = GetRoomTemperature(Adress[count], true);
Antwort += Temp;
Serial.print(Temp);
Antwort += "\n</br>";
Serial.print("\n");
}
}
}
letzteMessungMillis = jetztMillis;
ds.reset_search();
}

void Hauptseite(){
  
Antwort = "";
/*char temp[400];
int sec = millis() / 1000;
int min = sec / 60;
int hr = min / 60;
snprintf ( temp, 400,

"<html>\
<head>\
<meta http-equiv='refresh' content='5'/>\
<body>\
<p>Uptime: %02d:%02d:%02d</p></br>",
hr, min % 60, sec % 60
);
Antwort += temp;*/

Antwort += "<meta http-equiv='refresh' content='60'/>";
ListSensors();
Antwort += ConnectString;
//Antwort += "</body></html>";

server.send ( 300, "text/html", Antwort );
delay(100);

//server.send(300, "text/plain", Antwort);
//delay(150);
}

float GetRoomTemperature(char adress[255], bool doreset)
{
int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract;
byte i,present = 0, data[12], addr[8];
char stradd[255];
while(ds.search(addr))
{
sprintf(stradd, "");
//Serial.print("\nR=");
for( i = 0; i < 8; i++)
{
sprintf(stradd, "%s %X", stradd,addr[i]);
}
ds.reset();
ds.select(addr);
ds.write(0x44,1); // start Konvertierung, mit power-on am Ende

delay(50); // 750ms sollten ausreichen
// man sollte ein ds.depower() hier machen, aber ein reset tut das auch

present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Wert lesen

for ( i = 0; i < 9; i++)
{
// 9 bytes
data[i] = ds.read();
}

if(Contains(stradd, adress))
{
LowByte = data[0];
HighByte = data[1];
TReading = (HighByte << 8) + LowByte;
SignBit = TReading & 0x8000; // test most sig bit

if (SignBit) // negative
{
TReading = (TReading ^ 0xffff) + 1; // 2's comp
}
Tc_100 = (6 * TReading) + TReading / 4; // mal (100 * 0.0625) oder 6.25
/* Für DS18S20 folgendes verwenden Tc_100 = (TReading*100/2); */
Whole = Tc_100 / 100; // Ganzzahlen und Brüche trennen
Fract = Tc_100 % 100;

if (SignBit) // negative Werte ermitteln
{
//Serial.print("-");
}

/*
Serial.print(Whole);
Serial.print(".");
if (Fract < 10)
{
Serial.print("0");
}

Serial.print(Fract);
Serial.print("\n");
Serial.println();
*/
if(doreset)ds.reset_search();
return (float)Whole+((float)Fract/100);
}
}
}
char Sensor[16];
void loop(void)
{
server.handleClient(); // auf HTTP-Anfragen warten

jetztMillis = millis();

// neue Messung falls Zeitintervall erreicht
if(jetztMillis - letzteMessungMillis > deltaMessungMillis)
{
ListSensors();
}

for(int c = 0; c <10;c++)
{
if(deltaTemp != 0 && abs(OldTemp[c]- NewTemp[c]) > deltaTemp)
{
Serial.print("Temperatur änderung bei Sensor: ");
Serial.print(c+1);
Serial.print(" erreicht.");
OldTemp[c] = NewTemp[c];
sprintf(Sensor, "Poolwasser%d", c+1);
MeldeWert(Sensor, NewTemp[c]);
}
}

// neue Meldung an die CCU falls Zeitintervall erreicht
if(!deltaMeldungMillis == 0 && jetztMillis - letzteMeldungMillis > deltaMeldungMillis)
{
Serial.print(zeitstempel() + " Zeitintervall erreicht: \n");
letzteMeldungMillis = jetztMillis;
//melde_CCU();

for(int c = 0; c <10;c++)
{
sprintf(Sensor, "Poolwasser%d", c+1);
MeldeWert(Sensor, NewTemp[c]);
}
}
   if (virtual_CCU == "ja") {server_2();}
}

JimBeam
Beiträge: 11
Registriert: 19.04.2014, 09:37
System: sonstige

Re: WeMos D1 mini als WLAN-Sensor/-Aktor

Beitrag von JimBeam » 23.06.2017, 14:26

keiner ne Idee?

dondaik
Beiträge: 12924
Registriert: 16.01.2009, 18:48
Wohnort: Steingaden
Hat sich bedankt: 1597 Mal
Danksagung erhalten: 222 Mal

Re: WeMos D1 mini als WLAN-Sensor/-Aktor

Beitrag von dondaik » 25.06.2017, 09:10

ich nicht so wirklich ... :-(

der schweizer hat mal wieder eine kiste ausgepackt :-) . .. vieles zum thema esp32 doch wer einen wemos mit akku braucht
https://de.aliexpress.com/item/Wemos-es ... 63490.html
ok, der hersteller gibt 17h betrieb an ...
auch und dann ist da ua noch ein LED-leuchtfeld mit schaltfläche.
-------
!!! der download der handbüchern auf den seiten von eq3 und das lesen der tips und tricks kann das hm-leben sehr erleichtern - das nutzen der suche nach schlagworten ebenso :mrgreen: !!!
wer schreibfehler findet darf sie behalten.

klassisch
Beiträge: 3974
Registriert: 24.03.2011, 04:32
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 110 Mal
Danksagung erhalten: 71 Mal

Re: WeMos D1 mini als WLAN-Sensor/-Aktor

Beitrag von klassisch » 25.06.2017, 10:01

Habe mittlerweile auch 2 ESP32 Lolin, original WeMos, weil im WeMos Schop gekauft. Die meisten anderen nutzen nur den Namen.
Dank pcbreflux habe ich ihn vorletzte Woche auch schon mal in Betrieb genommen.
Allerdings ist es mir nicht gelungen, einen bestehenden ESP8266 Sketch zu migrieren, weil die WiFi lib inkompatibel sind. Hatte letzte Woche leider auch keine Zeit und konnte deshalb auch das Multitasking-Experiment nicht nachvollziehen. Die ESP32 sollten einige Vorteile haben: Trennung zwischen WiFi und Real-time io, RTOS, bessere Batteriebetriebsfähigkeit.
Aber leider eben auch ein paar Inkompatibilitäten, an denen ich bisher gescheitert bin.

dondaik
Beiträge: 12924
Registriert: 16.01.2009, 18:48
Wohnort: Steingaden
Hat sich bedankt: 1597 Mal
Danksagung erhalten: 222 Mal

Re: WeMos D1 mini als WLAN-Sensor/-Aktor

Beitrag von dondaik » 25.06.2017, 10:19

ja, interessant ist er sicherlich! doch wohl noch in den "kinderschuhen" ggf ändert sich das ja mal....
-------
!!! der download der handbüchern auf den seiten von eq3 und das lesen der tips und tricks kann das hm-leben sehr erleichtern - das nutzen der suche nach schlagworten ebenso :mrgreen: !!!
wer schreibfehler findet darf sie behalten.

klassisch
Beiträge: 3974
Registriert: 24.03.2011, 04:32
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 110 Mal
Danksagung erhalten: 71 Mal

Re: WeMos D1 mini als WLAN-Sensor/-Aktor

Beitrag von klassisch » 25.06.2017, 10:40

Ich sehe es so, daß eher ICH noch zu sehr in den Kinderschuhen des Prohrammierens stecke, was durch die ESP8266-Arduino-Integration und die prima Beispiele hier übertüncht wurde. Aber schon wenn es darum geht, die verschiedenen WiFi Komponenten wie Server, Multiserver und Manager auseinander zu halten, weiß ich es nicht und müßte viel lesen, wozu derzeit die Zeit/Prio fehlt.

dondaik
Beiträge: 12924
Registriert: 16.01.2009, 18:48
Wohnort: Steingaden
Hat sich bedankt: 1597 Mal
Danksagung erhalten: 222 Mal

Re: WeMos D1 mini als WLAN-Sensor/-Aktor

Beitrag von dondaik » 25.06.2017, 11:20

warum soll es dir besser ergehen als mir :-) wenn ich alleine sehe was der schweizer so alles auf die beine stellt was man nachmachen könnte... oder wenn man den wemos direkt nach iobroker und co bringen könnte und und und
auf einen verregneten sonntag ... der zum aufräumen des stadels zwingt , nichts mit wemos.
-------
!!! der download der handbüchern auf den seiten von eq3 und das lesen der tips und tricks kann das hm-leben sehr erleichtern - das nutzen der suche nach schlagworten ebenso :mrgreen: !!!
wer schreibfehler findet darf sie behalten.

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“