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 » 12.07.2017, 15:55

Hi,

hab mal versucht nicht über Moskau nach Hamburg zu reisen, habe viel gelesen in den langen Sommerabenden, die Augen sind jetzt dann 4-eckig, die richtige Lösung hab ich leider nicht gefunden.

Anbei der derzeitige Code, leider kann ich ihn nicht testen, jedoch beim Compilieren lief er ohne Fehler durch. Das Ziel ist das Übertragen des Levels auf den Webserver von HPCL. Wenn jemand mal kontrollieren könnte ob ich auf dem Holzweg bin wäre dies schön.

Dann geht es natürlich weiter, wie hol ich die Werte ab, eigentlich möchte ich kein Makro über Zeitsteuerung, da müsste ich ja im Ernstfall auf 1s gehen.

Gruß Axel

Code: Alles auswählen

/*
    WeMos LevelControl

    verbindet sich mit dem vorhandenen WLAN als Server
    und der EE (HPCL) Client

    Getesteter Aufbau:
       AZDelivery D1 Mini NodeMcu Lua ESP8266 ESP-12E WLAN WIFI Internet Module Entwicklungsboard für Arduino, 100% kompatibel mit WeMos D1 Mini

       Pin-Belegung:
          A0 = analoger Eingang

    9.Februar 2016 —m.yoda
    12. Juli 2017 -AFi
    Version 2.0
*/

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ESP8266WebServer.h>

// ******* Netzwerkeinstellungen, bitte anpassen! *******
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(.......); // Subnetzmaske
IPAddress ip(.......); // feste IP-Adresse für den WeMos
const char* host = "....."; // IP-Adresse der CCU (mit Punkten!)
ESP8266WebServer server(80); // Webserver initialisieren auf Port 80
String completeURI = "http://........./addons/contronics/CLWebI.ccc?GETVARBYNAME1&LevelMessung";
float sensorPin = A0;
unsigned long deltaMessungSekunden = 10; //Zeitintervall (Sekunden) nach dem eine Messung erfolgt
float korrLevel = 0; // Korrekturwert fuer die Level Messung


// ******* Einstellungen fuer Meldungen an die HPCL, bitte anpassen! *******
unsigned long deltaMeldungSekunden = 3000; // Zeitintervall (Sekunden) nach dem eine CCU-Meldung erfolgt (0 bedeutet nie)
float deltaLevel = 5; // Levelaenderung (*mmWS) bei der eine CCU-Meldung erfolgt (0 bedeutet nie)

float level = 0, levelCCU = 0;
unsigned long jetztMillis = 0;
unsigned long deltaMessungMillis = deltaMessungSekunden * 1000, letzteMessungMillis = 0;
unsigned long deltaMeldungMillis = deltaMeldungSekunden * 1000, letzteMeldungMillis = 0;
String requestResult;
String antwort = "", meldung = "", letzteMeldungCCUzeit = "";

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 messung() { // Sensor abfragen
  level = analogRead(sensorPin) + korrLevel;
  if (isnan(level)) {
    Serial.println(zeitstempel() + "  Fehler: Sensor konnte nicht abgefragt werden");
    delay(100);
    return;
  }
  letzteMessungMillis = jetztMillis;
  Serial.println(zeitstempel() + "  Messung LEVEL: " + level + " mWS ");
}

void melde_HPCL() { // Werte an EE HPCL melden
  HTTPClient http;
  http.begin(completeURI);
  int httpCode = http.GET();
  if (httpCode == HTTP_CODE_OK) {
    requestResult = http.getString();
    Serial.println(requestResult);
  }
  else
  {
    Serial.print("Result-Code");
    Serial.println(httpCode);
  }
  http.end();
}

void setup() {
  // Seriellen Monitor für Kontrollausgaben öffnen
  Serial.begin(57600);
  Serial.println("");
  Serial.println("WeMos Levelsensor");

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

  // Verbindungsaufbau abwarten
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  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("");

  // HTTP-Server starten
  server.begin();
  Serial.println(zeitstempel() + "  HTTP-Server gestartet");

  // Startwerte fuer Zeittrigger
  letzteMessungMillis = millis();
  letzteMeldungMillis = millis();
}

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

  jetztMillis = millis();

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

  // neue Meldung an HPCL falls Zeitintervall erreicht
  if (!deltaMeldungMillis == 0 && jetztMillis - letzteMeldungMillis > deltaMeldungMillis) {
    Serial.print(zeitstempel() + "  Zeitintervall erreicht: ");
    melde_HPCL();
  }

  // neue Meldung an HPCL falls Level den Schwellwert erreicht
  if (!deltaLevel == 0 && abs(level - levelCCU) >= deltaLevel) {
    Serial.print(zeitstempel() + "  Levelaenderung: ");
    melde_HPCL();
  }
}

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 » 12.07.2017, 17:45

Hi,

wenn man mal davon absieht, das Du eine Variable vom Namen her abfragst, könnte das so funktionieren, Du musst halt ein SETVARBYNAME oder so machen, und den gemessenen Füllstand entsprechend mit in die URL einbauen, und dann wird der Wert automatisch in des HPCL-Objekt mit dem Namen gesetzt, und ggf. das Objekt auf Änderung innerhalb der EE getriggert.

Ich würde aber erstmal die URL am PC solange zusammenbauen/testen, bis der gewünschte Erfolg auf HPCL-Seite eintritt, und dann entsprechend die URL auf dem wemos zusammenbauen.
Dann könnte es nur noch passieren, das der WebServer wegen falscher Formatierung/fehlender Einträge im Header mault, aber das wäre dann ein anderes Thema.

Der Familienvater

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

Re: Steuerung Pumpenvorlage mittels Füllstandskontrolle

Beitrag von AFi » 12.07.2017, 20:11

Hi,

habe derzeit folgenden Fehler, von dem abgesehen, dass du es anders herum machen würdest (hab mich einfache auf dieser Seite bereits weiter entwickelt):

000:05:04 Messung LEVEL: 693.00 mmWS
000:05:04 Levelaenderung: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<html><head><title>CL-WEB-Interface</title></head><body>
RESULT->ERROR -1
</body></html>

Kann es sein, dass der WebServer auf HPCL etwas alt ist, gegenüber der Lib auf Wemos.

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 » 12.07.2017, 20:29

Hi,

ganz langsam:
Der Wemos ermittelt den Füllstand, richtig? Also muss der Wemos den Füllstand an HPCL melden, per SETVARBYNAME.
Mit GETVARBYNAME1 kannst Du den Wert eines Objektes in HPCL abfragen und bekommst das Ergebnis als HTML, aber warum sollte der Wemos HPCL nach dem Füllstand fragen? Denn kennt er ja wohl?

Natürlich könnte man es andersrum machen, und HPCL regelmäßig eine Webseite des Wemos abrufen lassen, und dort den Füllstand mit HPCL-Bordmitteln rausoperieren, aber da bist Du bei dem Thema, das Du im Sekundentakt den Wemos fragen musst, das findet weder HPCL noch der Wemos witzig.

Deswegen fange ganz klein an, auf Deinem PC, im Browser Deiner Wahl:
2017-07-12_20h20_13.png
2017-07-12_20h20_13.png (18.67 KiB) 4179 mal betrachtet
Setze einfach die richtige IP ein, und dann sollte die Abfrage der Uhrzeit vom PC aus klappen, sonst stimmt was auf der CCU/mit dem CLWeb-Addon nicht.

Dann kommt die nächste Stufe:
2017-07-12_20h23_44.png
2017-07-12_20h23_44.png (21.04 KiB) 4179 mal betrachtet
Wir setzen z.B. die Variable XT_GAESTE auf 123.4
Und Kontrollieren das ggf. noch mal:
2017-07-12_20h25_16.png
Wir stellen fest, mein Objekt XT_GAESTE ist vom Typ Zeichen, deswegen ist die Antwort in Anführungszeichen, aber das Ändern des Objekts funktioniert. (Du willst aber im Zweifelsfall auf dem Wemos gar keine Werte von Objekten in HPCL abfragen!)

Und dann, wenn es vom PC aus funktioniert, das Du Dein Objekt in HPCL über das CLWebI.ccc-Interface setzen kannst, dann machst Du dich daran, das ganze auf dem Wemos zu machen, und dann kannst Du evtl. die Antwort vom CLWebI.ccc auf RESULT->OK prüfen, und sonst kann es dem Wemos auch fast egal sein...

Der Familienvater

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

Re: Steuerung Pumpenvorlage mittels Füllstandskontrolle

Beitrag von AFi » 12.07.2017, 20:35

Hi,

sorry, hab ich natürlich vergessen zu schreiben, deine Fehlerkorrektur hab ich natürlich gelesen, eingepflegt und hochgeladen:

String completeURI = "http://192.999.999.99/addons/contronics ... velMessung";

Gruß Axel

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

Re: Steuerung Pumpenvorlage mittels Füllstandskontrolle

Beitrag von AFi » 12.07.2017, 21:11

Hi,

hoffe ich hab es jetzt richtig verstanden:

Ich lege in HPCL eine Variable an, die ich sinnvollerweise als Zahl deklariere und sende über den WebServer via Wemos und Befehl:

"http://999.999.999.999/addons/contronic ... L-Variable>"

den Wert. In HPCL setze ich die Option "Ausführen bei Empfang" in der Variable.

Der Abruf der Uhrzeit hat funktioniert, jedoch nicht das setzen des Wertes.
Unbenannt.PNG
Unbenannt.PNG (7.21 KiB) 4168 mal betrachtet
Gruß Axel

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

Re: Steuerung Pumpenvorlage mittels Füllstandskontrolle

Beitrag von AFi » 12.07.2017, 21:14

Hi,

jetzt das gesamte Sichtfeld.

Gruß Axel
Unbenannt.PNG
Unbenannt.PNG (11.03 KiB) 4168 mal betrachtet

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 » 12.07.2017, 23:19

Hi,

das sieht nach Leerstellen in der URL aus, da dürfen keine drin sein, und es kommt drauf an, was V_001Versuchsanzeige für ein Objekttyp ist.

Wichtig (wie auch im PDF steht): Immer den Variablennamen in Grossbuchstaben (ich habe es nicht getestet, ob es wirklich sein muss, mach es einfach alles gross, und eine Fehlerquelle weniger).
Ich behaupte einfach mal: Keine Anführungszeichen! Schau Dir meine URL aus den Screenshots an, direkt der Wert hinter dem Gleichheitszeichen. Bei Zahlen ohne Nachkommastelle ist es eh einfach, da gibt es keine Trennzeichen, bei Zahlen mit Nachkommastellen kann ich nur zum Ausprobieren raten, ich würde auf den "." als Trennzeichen tippen, ein Komma könnte bei HTML wieder eine andere Bedeutung haben. Ich meine mich zu erinnern, das ich RK geschrieben hatte, das "keinerlei %-Codierung" stattfindet, wer mit %20 (?) versucht Leerzeichen innerhalb eines Strings zu kodieren, bekommt alles, nur keine Leerzeichen, sondern %20 in den String, mit Leerzeichen hat aber der Browser seine Probleme, die URL zusammenzubauen.

Aber:
Um einfache Strings oder Long-Zahlen zu übermitteln, eignet sich das ganze ganz gut...

Der Familienvater

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

Re: Steuerung Pumpenvorlage mittels Füllstandskontrolle

Beitrag von AFi » 13.07.2017, 20:41

Hi,

erst mal herzlichen Dank für die Geduld mit mir, aber manchmal könnte ich über die Antworten schon verzweifeln.

Der letzte Fehler bei der Eingabe am Browser war die Kleinschreibung der Variable und Lerzeichen bei " = ".

Das Problem bei dem ich jetzt anstehe ist in C beim Arduino:

Code: Alles auswählen

String completeURI = "http://999.999.999.99/addons/contronics/CLWebI.ccc?SETVARBYNAME&P_004Level=";
...
...
http.begin(completeURI&LevelMessung); // geht so natürlich nicht, da ich umwandeln muss
Das Problem liegt in der Zusammensetzung eines Textes mit einer Zahl zu einem Text.

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 » 13.07.2017, 23:57

Hi,

das schöne am wemos und dem c++, sofern die Klassen gut sind, ist alles ganz einfach...

Du nutzt schon String, und die Klasse ist hat auch Operator-Überladungen:

Code: Alles auswählen

String text="";
float LevelMessung=123.4;
text += "Am Anfang ";
text += "war das Chaos ";
text += "und dann ";
text += "kam der Computer :-).";
text += "Level-Messung ist ";
text += LevelMessung;
Wichtig ist nur, das bei der impliziten Typumwandlung der Float oder auch ein int oder long "alleine" steht, dann macht das c++ im Hintergrund, sonst müsste man mit LevelMessung.toString() oder so nachhelfen, für solche Fragen bzgl. der Umsetzung von einfachen Problemen in Standard-Sprachen nutze ich grundsätzlich gerne Ergebnisse von Stackoverflow, damit kann man regelmäßig auch Lösungen für sehr spezielle Dinge schnell googlen, sofern es um Lösungen für c, c++, java, c#, vb, vba oder sql geht (wahrscheinlich auch für andere Sprachen, aber damit bin ich regelmäßig konfrontiert, und ich muss öfters Dinge in fremdem, bestehenden Code leicht erweitern/anpassen, obwohl ich die Sprache nicht wirklich kann, ein "hello world" selbst from Scratch kann ich nur in den wenigsten Sprachen ohne googlen selbst erstellen)

Der Familienvater

Antworten

Zurück zu „homeputer CL“