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 » 07.10.2017, 19:46

Hi,

ich hoffe ich hab jetzt den letzten Stand (brauch mal ne Pause). Inzwischen habe ich den Strommesser ACS712 20A mangels konstanter Ergebnisse entfernt. Die Detektierung erfolgt nun durch ein Koppelrelais parallel zum Stromverbraucher ("Finder 95.95.3; 220 V"), dieser wird mit 3,3 V vom Wemos auf der Schaltseite bestückt und am Wemos D8 auf high oder low geprüft. Ich bitte um Verständnis, dass ich aufgrund der hohen Gefahr bei 220 V den Schaltplan nicht veröffentliche, wer sich auskennt wird diesen selbst erstellen können.
Anbei die geänderte Software am Wemos:

Code: Alles auswählen

/*
Steuerung im Gartenhaus
==============================================================
Autor:.................: AFi
Erstellt...............: 7.10.2017
Version................: 1.7

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
          Koppelrelais "Finder 95.95.3; 220 V"; 3.3V Wemos auf Relais und von Relais Digital in D8

Alles ohne Gewähr, 220V können tödlich sein
==============================================================
*/


#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 15                                          //Achtung D8 Stromdetektion


//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..
String SendeURL = "";                                             //Übergabe URL an CCU (Haussteuerung)
unsigned long deltaMessungSekundenLevel = 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 deltaMeldungSekundenLevel = 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
int LichtGesch = 0;
float letzteMess_max_amp_CCU;
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;

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) && (digitalRead(blau_StromM) == LOW)) {
    digitalWrite(gruen_LichtGarten, HIGH);
    LichtGesch=1;  
  }
  if ((digitalRead(gruen_LichtGarten) == HIGH) && (digitalRead(blau_StromM) == LOW) && (LichtGesch != 1)) {
    digitalWrite(gruen_LichtGarten, LOW);
    Serial.println(ZeitStempel() + " Licht Garten ist an aus LOW");
  }
  delay(500);
  server.send(200, "text/plain", "Licht Garten ist an");
  //Serial.println(ZeitStempel() + " Licht Garten ist an");
}
//Licht Garten aus; If-Abfrage notwendig, da Wechselschaltung
void LichtGarten_aus() {
  Serial.println("Wir wollten ausschalten!!!!!!!!!!");
  LichtGesch = 0;
  if ((digitalRead(gruen_LichtGarten) == LOW) && (digitalRead(blau_StromM) == HIGH)) {
    digitalWrite(gruen_LichtGarten, HIGH);
    Serial.println(ZeitStempel() + " Licht Garten ist aus aus LOW");
    LichtGesch=1;
  }
  if ((digitalRead(gruen_LichtGarten) == HIGH) && (digitalRead(blau_StromM) == HIGH) && (LichtGesch != 1)) {
    digitalWrite(gruen_LichtGarten, LOW);
  }
  delay(500);
  server.send(200, "text/plain", "Licht Garten ist aus");
  //Serial.println(ZeitStempel() + " Licht Garten ist aus");
}

//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 (digitalRead(blau_StromM) == LOW) {
    Serial.println("Stromfluß (Licht aus): "); 
    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 (digitalRead(blau_StromM) == HIGH) {
    Serial.println("Stromfluß (Licht an) ");   
    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: 07.10.2017     Version: 1.7");
  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 auslesen 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();
  }

  // Meldung Lichtschaltung an CCU
  if (digitalRead(blau_StromM) != letzteMess_max_amp_CCU) {
    Serial.println(ZeitStempel() + " Stromverbrauch Änderung");
    Serial.print("Wir kommen aus: " );
    Serial.println(letzteMess_max_amp_CCU);
    delay(200);                                               //wichtiges DELAY um Überlagerungen zu verhindern
    letzteMess_max_amp_CCU = (digitalRead(blau_StromM));
    Serial.print("und gehen auf: ");
    Serial.println(letzteMess_max_amp_CCU);
    melde_HPCL_Strom();  
  }
  
  // Sicherheitsabschaltung Wasserpumpe
  if (Level >= 620) {                   //max Level
    WaPumpe_aus_Max();
  }
}
Wichtig ist das "DELAY" bei der Hauptroutine in der Meldung an die CCU2, ansonsten werden die Rückkoppelungen nicht richtig verarbeitet.


Gruß Axel

Tobias78
Beiträge: 1464
Registriert: 27.06.2010, 01:01
Wohnort: Braunschweig
Hat sich bedankt: 4 Mal

Re: Steuerung Pumpenvorlage mittels Füllstandskontrolle

Beitrag von Tobias78 » 04.02.2020, 17:59

Nur zur Info, da Du auch diesen Befehl in Deinem Skript nutzt...

Mit der RaspberryMatic Version 3.49.17.20191225 hat sicher der Pfad für diesen Befehl geändert!
Es kommt ein "404 Not Found" oder "RaspberryMatic ist noch nicht bereit" Fehler.

neu:
http://IPDERCCU/addons/cl-control/CLWebI.ccc?...

alt/jetzt falsch:
http://IPDERCCU/addons/contronics/CLWebI.ccc?...
--------------------------------------------
Im Einsatz und empfehlenswert:
RaspberryMatic,IO.Broker, Homeputer Studio; CuXD; PocketControl, HomeStatus, Robonect, Alexa, io.Broker
------------------------------------------

Antworten

Zurück zu „homeputer CL“