Steuerung Pumpenvorlage mittels Füllstandskontrolle

Programmierung der HomeMatic CCU mittels contronics homeputer CL

Moderator: Co-Administratoren

AFi
Beiträge: 166
Registriert: 14.12.2016, 20:44

Re: Steuerung Pumpenvorlage mittels Füllstandskontrolle

Beitrag von AFi » 20.08.2017, 08:12

Hi,

genau dies wollte ich nicht tun, die Logik sollte immer in HPCL sein, der Wemos sollte immer ein Befehlsempfänger und Melder sein. Klar kann ich mich durchringen diese Teillogik im Wemos zu realisieren und die Befüllung aus HPCL mit einem Befehl zu starten, bei der Gartenbeleuchtung wird dies nicht gehen, da ich die BW aus HPCL benötige zur Einschaltung des Lichtes und zur Detektierung ob das Licht brennt. Dies bedeutet ich werde Schaltbefehle aus HPCL an Wemos senden müssen.

Kannst Du bitte etwas konkreter werden mit Shell-Aufruf und wget, dass ist wieder komplettes Neuland für mich.

Gruß Axel

Familienvater
Beiträge: 7151
Registriert: 31.12.2006, 15:18
System: Alternative CCU (auf Basis OCCU)
Wohnort: Rhein-Main
Danksagung erhalten: 34 Mal

Re: Steuerung Pumpenvorlage mittels Füllstandskontrolle

Beitrag von Familienvater » 20.08.2017, 09:55

Hi,

wenn Du keine "Rückmeldung" bzw. das Ergebnis von dem WebAufrauf brauchst, dann würde ich ein

Code: Alles auswählen

strURL := "http://die.ip.des.wemos/UrlAufDemWemos?GGfParameter"
strCommand := "/usr/bin/wget -q -O /dev/null "+strURL
startprogramm(strCommand)
machen, das ist wie die URL im Browser eingeben und Enter drücken. Wenn man die Rückgabe/das Ergebnis der URL-Aufrufes braucht, ist das so keine Lösung, dann ist das einfachste, den getsite-Befehl zu nutzen (der aber aktuell Probleme bereiten kann, wenn man ihn zu schnell hintereinander/parallel einsetzt)

Der Familienvater

AFi
Beiträge: 166
Registriert: 14.12.2016, 20:44

Re: Steuerung Pumpenvorlage mittels Füllstandskontrolle

Beitrag von AFi » 21.08.2017, 10:28

Hi,
besten dank, genau richtig.
Gruß Axel

AFi
Beiträge: 166
Registriert: 14.12.2016, 20:44

Re: Steuerung Pumpenvorlage mittels Füllstandskontrolle

Beitrag von AFi » 03.09.2017, 17:18

Hi,

der Urlaub ist vorbei, das Programm geschrieben und der Schaltschrank gebaut.

Zuerst das komplette Programm des Wemos, funktionstüchtig.
Es wird Licht, Pumpe und Magnetventile geschaltet und der Füllstand gemessen.

Code: Alles auswählen

/*
Steuerung im Gartenhaus
==============================================================
Autor:.................: AFi
Erstellt...............: 29.8.2017
Version................: 1

Wemos verbindet sich mit dem definierten WLAN als Server und
der Haussteuerung (EE HPCL) als Client

Hardware: WeMos D1 mini (oder Clone)
          5 Relais Shield 10A 220V
          Ultraschall Sensor; HC-SR04
==============================================================
*/
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ESP8266WebServer.h>
#define ECHO_PIN 4                                                //ACHTUNG D2!!!!; Wemos blau - Sensor weiß
#define TRIGGER_PIN 2                                             //ACHTUNG D4!!!!; Wemos dunkelgrün - Sensor gelb
#define SCHALLGESCHWINDIGKEIT 0.343                               //343 m/s = 0,343 mm/µs
#define braun_MV_Ansaugstutzen 5                               //ACHTUNG D1!!!!; Magnetventil Ansaugstutzen
#define orange_MV_ZurTonne 13                                  //ACHTUNG D7!!!!; Magnetventil zur Tonne
#define gelb_WaPumpe 12                                        //Achtung D6!!!!; Wasserpumpe
#define gruen_LichtGarten 14                                   //Achtung D5!!!!; Licht Garten


//Netzwerkeinstellungen und Variablen Definition
const char* ssid = ".............";                                 //SSID des vorhandenen WLANs
const char* password = "...............";                        //Passwort für das vorhandene WLAN
IPAddress gateway(..............);                                 //IP-Adresse des WLAN-Gateways
IPAddress subnet(...........);                                  //Subnetmask
IPAddress ip(...........);                                     //feste IP-Adresse für den WeMos
const char* host = "..............";                              //IP-Adresse der CCU (Haussteuerung)
ESP8266WebServer server(80);                                      //Webserver initialisieren auf Port 80
String SendeURL = "";                                             //Übergabe URL an CCU (Haussteuerung)
unsigned long deltaMessungSekunden = 5;                           //Zeitintervall (Sekunden) nachdem eine Messung erfolgt
float h_Tonne = 740;                                              //Höhe Tonne, bzw. max Abstand Sensor bis Boden
String ErgebnisMeldung;                                           //Ergebnismeldung bei Sendung Daten an URL
unsigned long deltaMeldungSekunden = 3600;                        //Zeitintervall (Sekunden) nachdem eine Meldung an CCU (Haussteuerung) erfolgt; 0 nie
float DeltaLevel = 10;                                            //Level Änderung bei der eine Meldung an CCU erfolgt in mm; 0 nie
float LevelCCU;                                                   //Level der an CCU gesendet wird
float Level;                                                      //Level aus Messung
unsigned long jetztMillis = 0;                                    //Variable Zeit für Vergleichsabfragen
unsigned long deltaMessungMillis = deltaMessungSekunden * 1000;   //Umrechnung Sekunden in Millisekunden
unsigned long letzteMessungMillis = 0;
unsigned long deltaMeldungMillis = deltaMeldungSekunden * 1000;
unsigned long letzteMeldungMillis = 0;
char MAC_char[18];                                                // globale Variable mit der Mac-Adresse des WLAN-Moduls

String ZeitStempel() {                                            //Ablaufzeit / Betriebszeit als hh:mm:ss
  static char stempel[10];
  int lfdStunden = millis() / 3600000;
  int lfdMinuten = millis() / 60000 - lfdStunden * 60;
  int lfdSekunden = millis() / 1000 - lfdStunden * 3600 - lfdMinuten * 60;
  sprintf (stempel, "%02d:%02d:%02d", lfdStunden,lfdMinuten,lfdSekunden);
  return stempel;
}

void MV_Ansaugstutzen_auf() {
  digitalWrite(braun_MV_Ansaugstutzen, HIGH);
  server.send(200, "text/plain", "Ansaugstutzen Magnetventil ist auf");
  delay(100);
  Serial.println(ZeitStempel() + " Ansaugstutzen Magnetventil ist auf");
}

void MV_Ansaugstutzen_zu() {
  digitalWrite(braun_MV_Ansaugstutzen, LOW);
  server.send(200, "text/plain", "Ansaugstutzen Magnetventil ist zu");
  delay(100);
  Serial.println(ZeitStempel() + " Ansaugstutzen Magnetventil ist zu");
}

void MV_ZurTonne_auf() {
  digitalWrite(orange_MV_ZurTonne, HIGH);
  server.send(200, "text/plain", "Zur Tonne Magnetventil ist auf");
  delay(100);
  Serial.println(ZeitStempel() + " Zur Tonne Magnetventil ist auf");
}

void MV_ZurTonne_zu() {
  digitalWrite(orange_MV_ZurTonne, LOW);
  server.send(200, "text/plain", "Zur Tonne Magnetventil ist zu");
  delay(100);
  Serial.println(ZeitStempel() + " Zur Tonne Magnetventil ist zu");
}

void WaPumpe_an() {
  digitalWrite(gelb_WaPumpe, HIGH);
  server.send(200, "text/plain", "Wasserpumpe ist an");
  delay(100);
  Serial.println(ZeitStempel() + " Wasserpumpe ist an");
}

void WaPumpe_aus() {
  digitalWrite(gelb_WaPumpe, LOW);
  server.send(200, "text/plain", "Wasserpumpe ist aus");
  delay(100);
  Serial.println(ZeitStempel() + " Wasserpumpe ist aus");
}

//Sicherheitsabschaltung Pumpe / Ueberlaufschutz
void WaPumpe_aus_Max() {
  digitalWrite(gelb_WaPumpe, LOW);
  server.send(200, "text/plain", "Wasserpumpe ist aus");
  delay(100);
  Serial.println(ZeitStempel() + " Wasserpumpe ist aus");
}

//If-Abfrage notwendig, da Wechselschaltung
void LichtGarten_an() {
  if (digitalRead(gruen_LichtGarten) == HIGH) {
    digitalWrite(gruen_LichtGarten, LOW);
  }
  else {
    digitalWrite(gruen_LichtGarten, HIGH);
  }
  server.send(200, "text/plain", "Licht Garten ist an");
  delay(100);
  Serial.println(ZeitStempel() + " Licht Garten ist an");
}
//If-Abfrage notwendig, da Wechselschaltung
void LichtGarten_aus() {
  if (digitalRead(gruen_LichtGarten) == LOW) {
    digitalWrite(gruen_LichtGarten, HIGH);
  }
  else {
    digitalWrite(gruen_LichtGarten, LOW);
  }
  server.send(200, "text/plain", "Licht Garten ist aus");
  delay(100);
  Serial.println(ZeitStempel() + " Licht Garten ist aus");
}

void setup() {
  pinMode(ECHO_PIN, INPUT);
  pinMode(TRIGGER_PIN, OUTPUT); 
  pinMode(braun_MV_Ansaugstutzen, OUTPUT);
  pinMode(orange_MV_ZurTonne, OUTPUT);
  pinMode(gelb_WaPumpe, OUTPUT);
  pinMode(gruen_LichtGarten, OUTPUT);
  Serial.begin(115200);
  Serial.println("");
  Serial.println("==================================");
  Serial.println(" WeMos D1 mini Füllstandsmessung,");
  Serial.println(" Bewaesserung und Lichtsteuerung");
  Serial.println("      G A R T E N H A U S");
  Serial.println("----------------------------------");
  Serial.println("Stand: 16.08.2017     Version: 1.0");
  Serial.println("==================================");

  //WLAN-Verbindung aufbauen
  WiFi.config(ip, gateway, subnet);
  WiFi.begin(ssid, password);
  Serial.print("Verbindungsaufbau....");
  //Verbindungsaufbau abwarten
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(200);
    Serial.print(".");
  }
  Serial.println(" erfolgreich!");
  Serial.println("");
  Serial.print("Verbunden mit: ");
  Serial.println(ssid);
  Serial.print("Signalstärke: ");
  int rssi = WiFi.RSSI();
  Serial.print(rssi);
  Serial.println(" dBm");
  Serial.print("IP-Adresse: ");
  Serial.println(WiFi.localIP());
  Serial.println("");
  
  //HTTP-Server starten
  server.begin();
  Serial.println(ZeitStempel() + " HTTP-Server gestartet");
  Serial.println("");
  //Startwerte für Zeittrigger
  letzteMessungMillis = millis();
  letzteMeldungMillis = millis();

  //MAC-Adresse Arduino auslesen
  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-Adresse steht in der globalen Variable: MAC_char
  Serial.print("MAC-Adresse: ");
  Serial.print(MAC_char);
  Serial.println(" ");

  //HTTP-Anfragen bearbeiten
  server.on("/braun_MV_Ansaugstutzen_auf", MV_Ansaugstutzen_auf);
  server.on("/braun_MV_Ansaugstutzen_zu", MV_Ansaugstutzen_zu);
  server.on("/orange_MV_ZurTonne_auf", MV_ZurTonne_auf);
  server.on("/orange_MV_ZurTonne_zu", MV_ZurTonne_zu);
  server.on("/gelb_WaPumpe_an", WaPumpe_an);
  server.on("/gelb_WaPumpe_aus", WaPumpe_aus);
  server.on("/gruen_LichtGarten_an", LichtGarten_an);
  server.on("/gruen_LichtGarten_aus", LichtGarten_aus);
}
// Messung mit Sensor ausführen
void MissEntfernungMitUltraschall() {
    digitalWrite(TRIGGER_PIN, HIGH);
    delayMicroseconds(10);
    digitalWrite(TRIGGER_PIN, LOW);
    int pulsdauer = pulseIn(ECHO_PIN, HIGH);
    //Abfrage ob Messung erfolgreich oder Störung auf Sensor
    if (isnan(pulsdauer)) {
      Serial.println (ZeitStempel() + " Fehler: Sensor konnte nicht abgefragt werden!!");
      delay(100);
      return;
    }
    letzteMessungMillis = jetztMillis;
    Level = h_Tonne - (pulsdauer*SCHALLGESCHWINDIGKEIT) / 2;
    Serial.println(ZeitStempel() + " Der Füllstand beträgt: " + Level + " mmWS");
}
//Meldung an HPCL (homeputerCL/CCU absetzen
void melde_HPCL() {
  HTTPClient http;
  SendeURL = "http://....IPCCU2......../addons/contronics/CLWebI.ccc?SETVARBYNAME&VIRTSENSOR_LEVELTONNE=";
  SendeURL += Level;
  http.begin(SendeURL);
  int httpCode = http.GET();
  if (httpCode == HTTP_CODE_OK) {
    ErgebnisMeldung = http.getString();
    Serial.println(ZeitStempel() + " Übertragung: " + ErgebnisMeldung);
    LevelCCU = Level;
  }
  else
  {
    Serial.println(ZeitStempel() + " Übertragung: " + httpCode);
  }
  http.end();
}
//Hauptroutine
void loop() 
{
  // auf HTTP-Anfragen warten
  server.handleClient();                  //auf HTTP-Anfragen warten
  jetztMillis = millis();
  
  // neue Messung falls Zeitintervall erreicht
  if (jetztMillis - letzteMessungMillis > deltaMessungMillis)
  {
    letzteMessungMillis = jetztMillis;
    MissEntfernungMitUltraschall();
  }
  
  // neue Meldung an CCU falls Zeitintervall erreicht
  if ((deltaMeldungMillis != 0) && ((jetztMillis - letzteMeldungMillis) > deltaMeldungMillis))
  {
    Serial.println(ZeitStempel() + " Zeitintervall erreicht");
    letzteMeldungMillis = jetztMillis;
    melde_HPCL();
  }

  // neue Meldung an CCU falls Level den Schwellwert erreicht
  if ((DeltaLevel != 0) && (abs(Level - LevelCCU) >= DeltaLevel))
  {
    Serial.println(ZeitStempel() + " Leveländerung erreicht");
    LevelCCU = Level;
    melde_HPCL();
  }
  // Sicherheitsbaschaltung Wasserpumpe
  if (Level >= 605) {                   //max Level
    WaPumpe_aus_Max();
  }
}

Die Steuerung über den Explorer funktioniert, z.B.: "//...IPWemos..../gelb_WaPumpe_an", jedoch nicht aus HPCL.

Ich habe für die Pumpe einen virtuellen Schalter angelegt und folgendes Makro dazu geschrieben:

Code: Alles auswählen

//===================================================================
//Pumpe Garten per Schalter einschalten
//
//===================================================================
Wenn  Virt_01_Pumpe = 1 dann
	strURL3 := "http://....IPWemos.........../gelb_WaPumpe_an"
	strCommand3 := "/usr/bin/wget - q -0 /dev/null "+strURL3
	startprogramm(strCommand3)
endewenn
Wenn  Virt_01_Pumpe = 0 dann
	strURL3 := "http://........IPWemos....../gelb_WaPumpe_aus"
	strCommand3 := "/usr/bin/wget - q -0 /dev/null "+strURL3
	startprogramm(strCommand3)
endewenn


Variablendefinition:
strURL3 = Text
strCommand = Text

Ausführen bei Änderung aktiviert

Unter Allgemein: Ausführen bei Eingabe aktiviert

Was mach ich falsch, dass es aus HPCL nicht funktioniert??

Viele Grüße
Axel

Familienvater
Beiträge: 7151
Registriert: 31.12.2006, 15:18
System: Alternative CCU (auf Basis OCCU)
Wohnort: Rhein-Main
Danksagung erhalten: 34 Mal

Re: Steuerung Pumpenvorlage mittels Füllstandskontrolle

Beitrag von Familienvater » 03.09.2017, 18:25

Hi,

die wget-Zeile am besten komplett auf der Konsole per SSH ausprobieren, Du hast auf jeden Fall ein Leerzeichen zuviel zwischen - und q, und Asche auf mein Haupt, es muss ein kleines o sein...

Code: Alles auswählen

 /usr/bin/wget -q -o /dev/null 
Es kann evtl. noch notwendig sein, die URL in Quotes oder DoubleQuotes zu setzen, das würdest Du aber merken, wenn Du von der Konsole aus probierst, und es Fehler gäbe, Quotes sind einfach, einfach die URL in ' einpacken (das Zeichen, was man normal mit Shift+# bekommt), ansonsten müssen es doppelte Anführungszeichen sein, also " (das Shift-2), das ist aber komplizierter...

Der Familienvater

AFi
Beiträge: 166
Registriert: 14.12.2016, 20:44

Re: Steuerung Pumpenvorlage mittels Füllstandskontrolle

Beitrag von AFi » 03.09.2017, 19:03

Hi,

der erste Test ist positiv, "Leerzeichen und kleines o" waren der Fehler.

Besten Dank für die tolle Unterstützung.

Viel Grüße
Axel

AFi
Beiträge: 166
Registriert: 14.12.2016, 20:44

Re: Steuerung Pumpenvorlage mittels Füllstandskontrolle

Beitrag von AFi » 11.09.2017, 20:16

Hi,

habe bei der weiteren Programmierung festgestellt, dass der Wemos D1 mini ein "offenes" WLAN generiert.
Wie kann ich verhindern, dass dieses WLAN offen ist? Der von mir verwendete Code ist 3 - 4 Beiträge früher.

Gruß Axel

Familienvater
Beiträge: 7151
Registriert: 31.12.2006, 15:18
System: Alternative CCU (auf Basis OCCU)
Wohnort: Rhein-Main
Danksagung erhalten: 34 Mal

Re: Steuerung Pumpenvorlage mittels Füllstandskontrolle

Beitrag von Familienvater » 11.09.2017, 20:28

Hi,

wäre mir neu, das der sowohl Client als auch Hotspot gleichzeitig sein kann, bist Du sicher, das es dieser Wemos ist, und nicht ein anderer?

Der Familienvater

AFi
Beiträge: 166
Registriert: 14.12.2016, 20:44

Re: Steuerung Pumpenvorlage mittels Füllstandskontrolle

Beitrag von AFi » 11.09.2017, 20:36

Hi,

eigentlich ja, es erscheinen die letzten 4 Ziffern der Mac-Adresse und als ich ihn ausgeschalten haben war das Netz weg.

Werde es jedoch nochmals testen, sobald ich die Hardware und Software aktualisiert habe. Musste feststellen, dass man eine Stromwechselschaltung (Handschalter + Relais) ohne Stromdetektierung leider nicht vernünftig schalten kann. Die Bewegungsmelder schalten je nach Situation das Licht aus. :lol:

Gruß Axel

AFi
Beiträge: 166
Registriert: 14.12.2016, 20:44

Re: Steuerung Pumpenvorlage mittels Füllstandskontrolle

Beitrag von AFi » 02.10.2017, 22:34

Hi,

ich möchte den Stand des Projekts Gartenhaus aktualisieren.

Derzeit wird die komplette Steuerung über den Wemos D1 mini vor Ort durchgeführt. Die Befehle erfolgen von HPCL. Bei der Lichtsteuerung (Wechselschaltung, Relais und Handschalter) erfolgen auch Rückmeldungen an HPCL und den Zustand "Licht an" bzw. "Licht aus" festzulegen. Die Rückmeldung erfolgt mittels Strommessung, zu beachten ist, dass es hier wirklich nur darum geht ob ein Stromverbrauch vorhanden ist oder nicht, die Werte sind irrelevant. Die Schwierigkeit besteht hier darin, dass durch das Schalten von Relais (bis zu 4 Stck.) die Versorgungsspannung des Wemos in die Knie geht, dies wurde durch Konstanten, die empirisch ermittelt wurden, ausgeglichen.

Bspl. Lichtschaltung aus HPCL (Virtueller Schalter)

Code: Alles auswählen

//===================================================================
// Licht Garten per Schalter einschalten
//
//===================================================================
Wenn  Virt_01_LichtGarten = 1 dann
	strURL2 := "http://999.999.999.60/gruen_LichtGarten_an"
	strCommand2 := "/usr/bin/wget -q -o /dev/null "+strURL2
	startprogramm(strCommand2)
	Makro_LichtGartenBewegungm.LichtGeschBewegungsmelder:=1
endewenn

Wenn  Virt_01_LichtGarten = 0 dann
	strURL2 := "http://999.999.999.60/gruen_LichtGarten_aus"
	strCommand2 := "/usr/bin/wget -q -o /dev/null "+strURL2
	startprogramm(strCommand2)
	Makro_LichtGartenBewegungm.LichtGeschBewegungsmelder:=0
endewenn

Code im Wemos

Code: Alles auswählen

/*
Steuerung im Gartenhaus
==============================================================
Autor:.................: AFi
Erstellt...............: 2.10.2017
Version................: 1.5

Wemos verbindet sich mit dem definierten WLAN als Server und
der Haussteuerung (EE HPCL) als Client

Hardware: WeMos D1 mini (oder Clone)
          5 Relais Shield 10A 220V
          Ultraschall Sensor; HC-SR04
          Strommesser ACS712 20A

          Derzeitiges Problem:
          0,48 A Messung, wenn Hand an, jedoch Relais angezogen??!! -> Licht jedoch aus
          0 A Messung, wenn Hand aus, jedoch Relais aus!!?? -> Licht auch aus
          Lösung: konstante mit Korrektur
==============================================================
*/


#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ESP8266WebServer.h>
#define ECHO_PIN 4                                                //ACHTUNG D2!!!!; Wemos blau - Sensor weiß
#define TRIGGER_PIN 2                                             //ACHTUNG D4!!!!; Wemos dunkelgrün - Sensor gelb
#define SCHALLGESCHWINDIGKEIT 0.343                               //343 m/s = 0,343 mm/µs
#define braun_MV_Ansaugstutzen 5                               //ACHTUNG D1!!!!; Magnetventil Ansaugstutzen
#define orange_MV_ZurTonne 13                                  //ACHTUNG D7!!!!; Magnetventil zur Tonne
#define gelb_WaPumpe 12                                        //Achtung D6!!!!; Wasserpumpe
#define gruen_LichtGarten 14                                    //Achtung D5!!!!; Licht Garten
#define blau_StromM A0                                          //Analog A0 Strommessung


//Netzwerkeinstellungen und Variablen Definition
const char* ssid = "...........";                                 //SSID des vorhandenen WLANs
const char* password = ".................";                        //Passwort für das vorhandene WLAN
IPAddress gateway(.....);                                 //IP-Adresse des WLAN-Gateways
IPAddress subnet(......);                                  //Subnetmask
IPAddress ip(.......);                                     //feste IP-Adresse für den WeMos
const char* host = ".........";                              //IP-Adresse der CCU (Haussteuerung)
ESP8266WebServer server(..);                                      //Webserver initialisieren auf Port 80
String SendeURL = "";                                             //Übergabe URL an CCU (Haussteuerung)
unsigned long deltaMessungSekundenLevel = 5;                           //Zeitintervall (Sekunden) nachdem eine Messung erfolgt
unsigned long deltaMessungSekundenStrom = 1;
float h_Tonne = 740;                                              //Höhe Tonne, bzw. max Abstand Sensor bis Boden
String ErgebnisMeldung;                                           //Ergebnismeldung bei Sendung Daten an URL
unsigned long deltaMeldungSekundenLevel = 3600;                   //Zeitintervall (Sekunden) nachdem eine Meldung an CCU (Haussteuerung) erfolgt; 0 nie
unsigned long deltaMeldungSekundenStrom = 10;                     //dito Strom
float DeltaLevel = 10;                                            //Level Änderung bei der eine Meldung an CCU erfolgt in mm; 0 nie
float LevelCCU;                                                   //Level der an CCU gesendet wird
float Level;                                                      //Level aus Messung
float amp = 0;                                                    //Messung Ampere Einzelwert
float max_amp = 0;                                                //maximal gemessener Amperewert aus Sinuskurve über Statistik
float letzteMess_max_amp_CCU = 0;                                 //Abweichung Strom zum letzten Wert->gemeldet
float nullpunkt = 679;                                            //Messwertabweichung ACS712 bei 0 Ampere, ohne Formel; je nach Netzteil unterschiedlich
float Korrektur = 0.0;                                          //gemessene Abweichung bei angezogenem Relais
float Strom_Schw = 5;                                          //Schwellwert für Strom an und aus
float Delta_Strom = 5;                                          //Schwellwert für Stromänderung, Meldung an CCU2
int i;                                                            //Zähler for Schleife Strommessung
int LichtGesch = 0;
unsigned long jetztMillis = 0;                                    //Variable Zeit für Vergleichsabfragen
unsigned long deltaMessungMillisLevel = deltaMessungSekundenLevel * 1000;   //Umrechnung Sekunden in Millisekunden
unsigned long letzteMessungMillisLevel = 0;
unsigned long deltaMeldungMillisLevel = deltaMeldungSekundenLevel * 1000;
unsigned long letzteMeldungMillisLevel = 0;

unsigned long letzteMessungMillisStrom = 0;
unsigned long deltaMessungMillisStrom = deltaMessungSekundenStrom * 1000;
unsigned long letzteMeldungMillisStrom = 0;
unsigned long deltaMeldungMillisStrom = deltaMeldungSekundenStrom * 1000;

char MAC_char[18];                                                // globale Variable mit der Mac-Adresse des WLAN-Moduls

String ZeitStempel() {                                            //Ablaufzeit / Betriebszeit als hh:mm:ss
  static char stempel[10];
  int lfdStunden = millis() / 3600000;
  int lfdMinuten = millis() / 60000 - lfdStunden * 60;
  int lfdSekunden = millis() / 1000 - lfdStunden * 3600 - lfdMinuten * 60;
  sprintf (stempel, "%02d:%02d:%02d", lfdStunden,lfdMinuten,lfdSekunden);
  return stempel;
}

void MV_Ansaugstutzen_auf() {
  digitalWrite(braun_MV_Ansaugstutzen, HIGH);
  server.send(200, "text/plain", "Ansaugstutzen Magnetventil ist auf");
  delay(100);
  Serial.println(ZeitStempel() + " Ansaugstutzen Magnetventil ist auf");
}

void MV_Ansaugstutzen_zu() {
  digitalWrite(braun_MV_Ansaugstutzen, LOW);
  server.send(200, "text/plain", "Ansaugstutzen Magnetventil ist zu");
  delay(100);
  Serial.println(ZeitStempel() + " Ansaugstutzen Magnetventil ist zu");
}

void MV_ZurTonne_auf() {
  digitalWrite(orange_MV_ZurTonne, HIGH);
  server.send(200, "text/plain", "Zur Tonne Magnetventil ist auf");
  delay(100);
  Serial.println(ZeitStempel() + " Zur Tonne Magnetventil ist auf");
}

void MV_ZurTonne_zu() {
  digitalWrite(orange_MV_ZurTonne, LOW);
  server.send(200, "text/plain", "Zur Tonne Magnetventil ist zu");
  delay(100);
  Serial.println(ZeitStempel() + " Zur Tonne Magnetventil ist zu");
}

void WaPumpe_an() {
  digitalWrite(gelb_WaPumpe, HIGH);
  server.send(200, "text/plain", "Wasserpumpe ist an");
  delay(100);
  Serial.println(ZeitStempel() + " Wasserpumpe ist an");
}

void WaPumpe_aus() {
  digitalWrite(gelb_WaPumpe, LOW);
  server.send(200, "text/plain", "Wasserpumpe ist aus");
  delay(100);
  Serial.println(ZeitStempel() + " Wasserpumpe ist aus");
}

//Sicherheitsabschaltung Pumpe / Ueberlaufschutz
void WaPumpe_aus_Max() {
  digitalWrite(gelb_WaPumpe, LOW);
  server.send(200, "text/plain", "Wasserpumpe ist aus");
  delay(100);
  Serial.println(ZeitStempel() + " Wasserpumpe ist aus");
}

//Licht Garten an; If-Abfrage notwendig, da Wechselschaltung
void LichtGarten_an() {
  Serial.println("Wir wollen einschalten!!!!");
  LichtGesch=0;
  if ((digitalRead(gruen_LichtGarten) == LOW) && (max_amp < Strom_Schw)) {
    digitalWrite(gruen_LichtGarten, HIGH);
    LichtGesch=1;  
  }
  if ((digitalRead(gruen_LichtGarten) == HIGH) && (max_amp < Strom_Schw) && (LichtGesch != 1)) {
    digitalWrite(gruen_LichtGarten, LOW);
    Serial.println(ZeitStempel() + " Licht Garten ist an aus LOW");
  }
  server.send(200, "text/plain", "Licht Garten ist an");
  //Serial.println(ZeitStempel() + " Licht Garten ist an");
  delay(100);
}
//Licht Garten aus; If-Abfrage notwendig, da Wechselschaltung
void LichtGarten_aus() {
  Serial.println("Wir wollten ausschalten!!!!!!!!!!");
  LichtGesch = 0;
  if ((digitalRead(gruen_LichtGarten) == LOW) && (max_amp >= Strom_Schw)) {
    digitalWrite(gruen_LichtGarten, HIGH);
    Serial.println(ZeitStempel() + " Licht Garten ist aus aus LOW");
    LichtGesch=1;
  }
  if ((digitalRead(gruen_LichtGarten) == HIGH) && (max_amp >= Strom_Schw) && (LichtGesch != 1)) {
     digitalWrite(gruen_LichtGarten, LOW);
  }
  server.send(200, "text/plain", "Licht Garten ist aus");
  //Serial.println(ZeitStempel() + " Licht Garten ist aus");
  delay(100);
}
//Strommessung mit ACS712 20
//wird benötigt um Schaltzustand Wechselschaltung zu ermitteln, Licht
void Strommessung() {
  amp=0;
  max_amp=0;
  Korrektur = 0;
  for(i=0;i<1000;i++) {
    amp =  abs(analogRead(blau_StromM));

    if(amp>max_amp) {
      max_amp = amp;
    }
  }
  //Serial.print("Stromfluß ungefiltert: ");
  //Serial.println(max_amp);
  
  //Hilfskrücke, da Spannungsabfall für jedes Relais und somit Messfehler
  //
  if(digitalRead(gruen_LichtGarten) == HIGH) {
    Korrektur = Korrektur + 11;
  }
  if(digitalRead(gelb_WaPumpe) == HIGH) {
    Korrektur = Korrektur + 11;
  }
  if(digitalRead(orange_MV_ZurTonne) == HIGH) {
    Korrektur = Korrektur + 11;
  }
  if(digitalRead(braun_MV_Ansaugstutzen) == HIGH) {
    Korrektur = Korrektur + 11;
  }
  max_amp = (max_amp-nullpunkt) + Korrektur;
  //Nur zum Abgleich aktivieren!! CCU überfordert
  //melde_EXPLORER_Strom();
  delay(100);
}
//Meldung Strommessung (nur Einstellungsversuch)
void melde_EXPLORER_Strom() {
    HTTPClient http;
    SendeURL = "http://................./addons/contronics/CLWebI.ccc?SETVARBYNAME&V_001VERSUCHSANZEIGE=";
    SendeURL +=max_amp;
    http.begin(SendeURL);
    int httpCode = http.GET();
    if (httpCode == HTTP_CODE_OK) {
      ErgebnisMeldung = http.getString();
      Serial.println(ZeitStempel() + " Strommessung " + ErgebnisMeldung);
    }
}

//Meldung Strom an HPCL (Stromfluß oder nicht)
//Schaltet in HPCL virtueller Schalter ein bzw. aus
//Notwendigkeit aufgrund Wechselschaltung mit einem Handschalter (mechanisch)
void melde_HPCL_Strom() {
  if (max_amp < Strom_Schw) {
    Serial.print("Stromfluß mit Nullpunktabgleich (Licht aus): "); 
    Serial.println(max_amp);    
    HTTPClient http;
    SendeURL = "http://................/addons/contronics/CLWebI.ccc?SETVARBYNAME&VIRT_01_LICHTGARTEN=0";
    http.begin(SendeURL);
    int httpCode = http.GET();
    if (httpCode == HTTP_CODE_OK) {
      ErgebnisMeldung = http.getString();
      Serial.println(ZeitStempel() + " Übertragung Licht aus: " + ErgebnisMeldung);
    }
    else
    {
      Serial.println(ZeitStempel() + " Übertragung Licht aus: " + httpCode);
    }
    http.end();
    delay(100);
  }
  if (max_amp >= Strom_Schw) {
    Serial.print("Stromfluß mit Nullpunktabgleich, (Licht an): "); 
    Serial.println(max_amp);    
    HTTPClient http;
    SendeURL = "http://.............../addons/contronics/CLWebI.ccc?SETVARBYNAME&VIRT_01_LICHTGARTEN=1";
    http.begin(SendeURL);
    int httpCode = http.GET();
    if (httpCode == HTTP_CODE_OK) {
      ErgebnisMeldung = http.getString();
      Serial.println(ZeitStempel() + " Übertragung Licht an: " + ErgebnisMeldung);
    }
    else
    {
      Serial.println(ZeitStempel() + " Übertragung Licht an: " + httpCode);
    }
    http.end();
    delay(100);    
  }
}
// Messung mit Level Sensor ausführen (Ultraschallsensor)
void MissEntfernungMitUltraschall() {
    digitalWrite(TRIGGER_PIN, HIGH);
    delayMicroseconds(10);
    digitalWrite(TRIGGER_PIN, LOW);
    int pulsdauer = pulseIn(ECHO_PIN, HIGH);
    //Abfrage ob Messung erfolgreich oder Störung auf Sensor
    if (isnan(pulsdauer)) {
      Serial.println (ZeitStempel() + " Fehler: Sensor konnte nicht abgefragt werden!!");
      delay(100);
      return;
    }
    letzteMessungMillisLevel = jetztMillis;
    Level = h_Tonne - (pulsdauer*SCHALLGESCHWINDIGKEIT) / 2;
    Serial.println(ZeitStempel() + " Der Füllstand beträgt: " + Level + " mmWS");
}
//Meldung an HPCL (homeputerCL/CCU absetzen für Level
void melde_HPCL_Level() {
  HTTPClient http;
  SendeURL = "http://.............../addons/contronics/CLWebI.ccc?SETVARBYNAME&VIRTSENSOR_LEVELTONNE=";
  SendeURL += Level;
  http.begin(SendeURL);
  int httpCode = http.GET();
  if (httpCode == HTTP_CODE_OK) {
    ErgebnisMeldung = http.getString();
    Serial.println(ZeitStempel() + " Übertragung Füllstand: " + ErgebnisMeldung);
    LevelCCU = Level;
  }
  else
  {
    Serial.println(ZeitStempel() + " Übertragung Füllstand: " + httpCode);
  }
  http.end();
}
void setup() {
  pinMode(ECHO_PIN, INPUT);
  pinMode(TRIGGER_PIN, OUTPUT); 
  pinMode(braun_MV_Ansaugstutzen, OUTPUT);
  pinMode(orange_MV_ZurTonne, OUTPUT);
  pinMode(gelb_WaPumpe, OUTPUT);
  pinMode(gruen_LichtGarten, OUTPUT);
  pinMode(blau_StromM, INPUT);
  Serial.begin(115200);
  Serial.println("");
  Serial.println("==================================");
  Serial.println(" WeMos D1 mini Füllstandsmessung,");
  Serial.println(" Bewaesserung und Lichtsteuerung");
  Serial.println("      G A R T E N H A U S");
  Serial.println("----------------------------------");
  Serial.println("Stand: 02.10.2017              Version: 1.5");
  Serial.println("==================================");

  //WLAN-Verbindung aufbauen
  WiFi.config(ip, gateway, subnet);
  WiFi.begin(ssid, password);
  Serial.print("Verbindungsaufbau....");
  //Verbindungsaufbau abwarten
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(200);
    Serial.print(".");
  }
  Serial.println(" erfolgreich!");
  Serial.println("");
  Serial.print("Verbunden mit: ");
  Serial.println(ssid);
  Serial.print("Signalstärke: ");
  int rssi = WiFi.RSSI();
  Serial.print(rssi);
  Serial.println(" dBm");
  Serial.print("IP-Adresse: ");
  Serial.println(WiFi.localIP());
  Serial.println("");
  
  //HTTP-Server starten
  server.begin();
  Serial.println(ZeitStempel() + " HTTP-Server gestartet");
  Serial.println("");
  //Startwerte für Zeittrigger
  letzteMessungMillisLevel = millis();
  letzteMeldungMillisLevel = millis();

  //MAC-Adresse Arduino auslesen
  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-Adresse steht in der globalen Variable: MAC_char
  Serial.print("MAC-Adresse: ");
  Serial.print(MAC_char);
  Serial.println(" ");

  //HTTP-Anfragen bearbeiten
  server.on("/braun_MV_Ansaugstutzen_auf", MV_Ansaugstutzen_auf);
  server.on("/braun_MV_Ansaugstutzen_zu", MV_Ansaugstutzen_zu);
  server.on("/orange_MV_ZurTonne_auf", MV_ZurTonne_auf);
  server.on("/orange_MV_ZurTonne_zu", MV_ZurTonne_zu);
  server.on("/gelb_WaPumpe_an", WaPumpe_an);
  server.on("/gelb_WaPumpe_aus", WaPumpe_aus);
  server.on("/gruen_LichtGarten_an", LichtGarten_an);
  server.on("/gruen_LichtGarten_aus", LichtGarten_aus);

}

//Hauptroutine
void loop() 
{
  // auf HTTP-Anfragen warten
  server.handleClient();                  //auf HTTP-Anfragen warten
  jetztMillis = millis();
  
  // neue Messung Level falls Zeitintervall erreicht
  if (jetztMillis - letzteMessungMillisLevel > deltaMessungMillisLevel)
  {
    letzteMessungMillisLevel = jetztMillis;
    MissEntfernungMitUltraschall();
  }
  
  // neue Meldung Level an CCU falls Zeitintervall erreicht
  if ((deltaMeldungMillisLevel != 0) && ((jetztMillis - letzteMeldungMillisLevel) > deltaMeldungMillisLevel))
  {
    Serial.println(ZeitStempel() + " Zeitintervall erreicht");
    letzteMeldungMillisLevel = jetztMillis;
    melde_HPCL_Level();
  }

  // neue Meldung Level an CCU falls Schwellwert erreicht
  if ((DeltaLevel != 0) && (abs(Level - LevelCCU) >= DeltaLevel))
  {
    Serial.println(ZeitStempel() + " Leveländerung erreicht");
    LevelCCU = Level;
    melde_HPCL_Level();
  }

  // neue Messung Strom (Lichtschaltung) Intervall
  if ((deltaMessungMillisStrom != 0) && ((jetztMillis - letzteMessungMillisStrom) > deltaMessungMillisStrom))
  {
    letzteMessungMillisStrom = jetztMillis;
    Strommessung();
  }

  //neue Meldung Strom an CCU
  if ((Delta_Strom != 0) && (abs(max_amp - letzteMess_max_amp_CCU)>= Delta_Strom)) {
    Serial.println(ZeitStempel() + " Stromverbrauch Änderung");
    letzteMess_max_amp_CCU = max_amp;
    melde_HPCL_Strom();  
  }
  
  // Sicherheitsabschaltung Wasserpumpe
  if (Level >= 620) {                   //max Level
    WaPumpe_aus_Max();
  }
}

Natürlich alles ohne Gewähr!!

Gruß AFi

Antworten

Zurück zu „homeputer CL“