Skripterstellung zur Erfassung der Regenmenge

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

mhowie1
Beiträge: 13
Registriert: 25.05.2020, 19:32
System: CCU

Skripterstellung zur Erfassung der Regenmenge

Beitrag von mhowie1 » 25.05.2020, 20:17

Hallo liebe Gemeinde,

ich habe bereits öfters hgier in diesem Forum Beiträge gewälzt, aber jetzt war es an der Zeit mich anzumelden da mein aktuelles Problem nur mittels eines Skripts gelöst werden kann - und hier bin ich leider total blank weshalb ich hoffe hier etwas Unterstützung zu erhalten.

Ich habe eine CCU3 in Betrieb auf der etliche (eher viele) Geräte und auch jede Menge Programme laufen - grundsätzlich habe ich von FS20 und MobileAlerts auf Homematic umgestellt.
Seit einigen Monaten läuft auch eine Wetterstation HmIP-SWO-PR an meiner CCU3 und die wichtigsten Daten werden in ein paar Diagramme geschrieben.

In unserem Garten habe ich auch eine automatische Bewässerung eingebaut, die über eine Siemens Logo SPS läuft welche unter anderem von einer 4-Kanal Schaltbaugruppe HM-LC-Sw4-PCB "befeuert" wird (edit: diese Schaltbaugruppe hatte immer mal wieder Empfangsprobleme weshalb ich erfolgreich auf einen HmIP-WGC umgebaut habe). Leider kann ich bei der Wetterstation nicht alle Daten so auslesen und verarbeiten wie ich es für die Bewässerung gerne hätte. Mit Windstärke und Luftfeuchte komme ich gut zurecht, aber leider kann ich die Regenmengen nicht wirklich zur Auswertung nutzen.

Hier die Aufgabenstellung:
Ich möchte gerne die Regenmenge auslesen und in eine Systemvariable schreiben, und mit Hilfe dieser Systemvariable möchte ich entscheiden, ob der Rasen heute gegossen/gesprengt werden soll oder nicht. Als Entscheidungswert möchte ich eine beliebige Obergrenze (mm pro m²) setzen können.
Sobald es regnet soll sich der Niederschlag in die Variable schreiben und bei jedem neuen Regen soll der Wert aktualisiert werden. Sobald es aber 24 Stunden nicht geregnet hat soll die Variable automatisch auf 0 zurückgestellt werden.

Was ich mir bereits zusammenbasteln konnte:
Sobald es regnet wird über ein Programm ein Skript angetriggert:
Programm.JPG
Das Skript schaut aktuell so aus (ich muss dazu sagen dass ich von Skripten überhaupt keine Ahnung habe und nach nach langer "Studierzeit" nichts dazulernen konnte - ich steig da einfach überhaupt nicht durch):

Code: Alles auswählen

!Variablen setzen
var actRain = dom.GetObject('svHmIPRainCounter_34801_00185A499D0BD3:1').Value();
var sumRain = dom.GetObject("Niederschlag").Value();
!Wert schreiben
dom.GetObject("Niederschlag").State(actRain);
Damit wird mir ein Regenwert (kein Tageswert sondern ein Wert, bei dem jeder auftretender Regen automatisch dazuaddiert wird) in die eigens dafür angelegte Systemvariable "Niederschlag" geschrieben - die Systemvariable habe ich als "Zahl" angelegt. Das funktioniert schonmal. Jetzt müsste aber das Skript so erweitert werden (oder halt ein neues Skript erstellt werden das ich extra nochmals anlege) dass wenn sich die Systemvariable innerhalb 24 Stunden nicht ändert der 'svHmIPRainCounter_34801_00185A499D0BD3:1' auf Null gesetzt wird. Das auf Null setzen würde ich nach stundenlangem Probieren vielleicht grad noch so schaffen, aber ich habe nicht die leiseste Ahnung wie ich das mit der Zeit einbauen muss.

Die Systemvariable kann ich dann natürlich wieder selbst in den normalen Ablauf zur Entscheidung Gießen oder nicht Gießen einbinden, das ist kein Problem.

Nur dieses Skript treibt mich noch in den Wahnsinn.
Könnte mir da vielleicht bitte Jemand helfen??

Viele Grüße und besten Dank im Voraus
Manfred
Zuletzt geändert von mhowie1 am 25.05.2022, 19:19, insgesamt 2-mal geändert.

dtp
Beiträge: 10658
Registriert: 21.09.2012, 08:09
System: CCU
Wohnort: Stuttgart
Hat sich bedankt: 320 Mal
Danksagung erhalten: 501 Mal

Re: Skripterstellung zur Erfassung der Regenmenge

Beitrag von dtp » 26.05.2020, 16:13

Wozu willst du das Rad neu erfinden? Das machen doch die internen vom Wettersensor automatisch bei der Anmeldung angelegten Programme schon. Gibt auch entsprechende interne Systemvariablen für die heutige und gestrige Regenmenge.
CCU3 mit stets aktueller FW und den Addons "CUxD" und "Programmedrucken", ioBroker auf Synology DiskStation DS718+ im Docker-Container;
einige Projekte: zentrales Push-Nachrichten-Programm zPNP, DoorPi-Videotürsprechanlage, An- und Abwesenheitsdetektion per Haustürschloss, zentrales Programm zur Steuerung von Beschattungsgeräten zBSP.

mhowie1
Beiträge: 13
Registriert: 25.05.2020, 19:32
System: CCU

Re: Skripterstellung zur Erfassung der Regenmenge

Beitrag von mhowie1 » 26.05.2020, 19:26

Wenn es so einfach wäre hätte ich mir nicht die Mühe gemacht so einen langen Text zu verfassen - leider ist es halt etwas komplizierter damit diese Funktion auch Sinn macht.


Erreichen will ich damit, dass die Gartenbewässerung sich nur einschaltet, wenn es innerhalb 24 Stunden weniger als z.B. 3l/m² geregnet hat. Einfach den Regenwert "Heute" oder "Gestern" zu nehmen funktioniert für meine Anforderung leider nicht - weil:

Der Regenwert für Heute wird automatisch zu einer bestimmten Uhrzeit auf Null gesetzt. Standardwäßig ist da 7Uhr oder 7:30Uhr (weiß ich grad nicht genau) hinterlegt - das habe ich auf 0Uhr abgeändert, aber das nur am Rande. Wenn es also kurz vor dieser Uhrzeit massig geregnet hat und dann 5 Minuten später der Wert automatisch auf Null gesetzt wird wäre die Anforderung erfüllt dass automatisch gegossen werden soll weil das System ja "denkt" dass kein Regen gefallen ist (Regenmenge Null). Deshalb wäre meine Anforderung dass eben innerhalb eines Zeitraumes eine gewisse Regenmenge überschritten werden muss damit das Beregnen deaktiviert wird.

Meine Überlegung war deshalb den Wert der aktuellen Regenmenge aus dem Regenmesser in eine Variable zu schreiben - und das ist eben genau der Wert "Regenmenge" so wie im Screenshot zu sehen:
Regenwert.JPG
Regenwert.JPG (18.36 KiB) 5727 mal betrachtet
Dieser Wert zeigt die Regenmenge an und addiert weiteren Regen dazu - und zwar so lange bis man auf "Reset Regenzähler" drückt - damit wird genullt. Sobald eine Regenmenge erkannt wird schreibt das jetzige Skript diesen Wert in die Variable "Niederschlag" - das funktioniert auch wunderbar. Damit hat die Variable einen Zeitstempel der letzten Änderung. Wenn es nochmals regnet wird der bisherige Wert vom aktuellen Wert überschritten und die Variable hat einen neuen Zeitstempel. Wenn nun ab diesem Zeitstempel für eine gewisse Zeitspanne keine Änderung an der Variable mehr passiert soll der Wert automatisch auf Null gesetzt werden - ich bräuchte also ein Skript das den letzten Zeitstempel einer Variable abfragt und eine zu definierende Zeit (z.B. 24 Stunden) später eine Aktion startet.

Die Variable "Regenmenge" baue ich dann ich die Aktivierung der Beregnung ein, ab dem Wert 3l/m² wird die Beregnung verhintert.

Ich hoffe so ist es etwas verständlicher?

alchy
Beiträge: 10754
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 673 Mal

Re: Skripterstellung zur Erfassung der Regenmenge

Beitrag von alchy » 26.05.2020, 21:28

Dein Programm wird ca. alle 3 min getriggert sofern es einmal geregnet hat.
Das enthaltende Script schreibt dann den Wert aus der einen versteckten Systemvariable svHmIPRainCounter_34801_00185A499D0BD3:1 in eine 2. Systemvariable Niederschlag auch alle ca. 3min.
Die Zeitstempel der Systemvariablen Niederschlag sollten also immer max ~3min alt sein :?: (gesetzt den Fall der Regen war mal >0 und das Ding aktualisiert alle 3min)
Das heißt 1. :
Du müsstest Minimum verhindern, das derselbe Wert wiederholt in die Variable Niederschlag geschrieben wird, erst dann sollte der Zeitstempel der Variable Niederschlag für dich so nutzbar sein, wie du es gerne hättest.

Aber

Sollte das nicht einfacher zu lösen sein ?
Programm
Wenn Wetterdaten Regenwert für Heute > 3mm
dann
Systemzustand Bewässerung Auto verzögert um 24h = wahr
sonst
Systemzustand Bewässerung Auto sofort unwahr


Alchy

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

mhowie1
Beiträge: 13
Registriert: 25.05.2020, 19:32
System: CCU

Re: Skripterstellung zur Erfassung der Regenmenge

Beitrag von mhowie1 » 27.05.2020, 16:25

Danke für den Hinweis mit der Aktualisierung, tatsächlich hatte ich das gestern Abend zu später Stunde auch noch gesehen dass es wirklich ständig den Wert in die Variable schreibt. Problem ist glaube ich hier das Kriterium Regenmenge - ich vermute dass sich Regenmenge auf die gesamt vom Gerät gemessene Regenmenge bezieht?

In das Programm habe ich jetzt noch zusätzlich die Regenerkennung des Sensors eingebaut:
Programm_geändert.JPG
Damit wird die Systemvariable Regenmenge nur noch aktualisiert wenn tatsächlich Regen erkannt wird. Und das funktioniert damit dann auch, seit der Änderung gestern ist der Zeitstempel unverändert:
Variable.JPG
Variable.JPG (20.21 KiB) 5654 mal betrachtet
Wenn es anders als von mir angedacht zu lösen ist würde ich das natürlich auch nicht ablehnen, ich habe schon das Gefühl dass ich den Wald vor lauter Bäumen nicht mehr sehe.

Das Programm für die Beregnung wird über eine Zeitsteuerung angestoßen - deshalb brauche ich die Variable für die Regenmenge nur als Entscheidungskriterium:
Start.JPG
Zur Erklärung:
Systemzustand Gartenbewässerung wird per Datum gesteuert (aktiv also nur von-bis)
Systemzustand Regenerkennung wird von einem separaten Sensor HM-Sen-RD-O getriggert der verlässlich Regenbeginn und Regenende erkennt
Systemzustand Windgeschwindigkeit wird von 2 eingebauten Windschwellen im HmIP-SWO-PR gesteuert
Systemzustand Luftfeuchtigkeit wird von 2 eingebauten Feuchtigkeitsschwellen im HmIP-SWO-PR gesteuert
Systemzustand Niederschlag ist die Variable Niederschlag, um die es aktuell grad geht

Wenn ich die Regenmenge heute verwende muss ich die mit einem Skript auslesen, anders komme ich da nicht dran. Im Systemprotokoll ist zu sehen dass als einzige Regenmenge nur der Gesamtwert seit Montage der Wetterstation übermittelt wird, einen Regenwert für heute gibt es in der Auswahl auch nicht:
Auswahl.jpg
Deine Alternative hätte folgenden Ablauf (automatisch gegossen wird 2x am Tag - 8Uhr morgens und 8Uhr abends):
Wenn es heute z.B. bis 7Uhr unter 3mm regnet wird um 8 Uhr gegossen (dazu müsste ich unwahr als Prüfoption einbauen). Wenn es später weiterregnet und dann im Laufe des Tages über 3mm zusammenkommen würde heute Abend trotzdem gegossen werden weil die Änderung der Variable erst 24 Stunden nach dem Überschreiten der 3mm geändert wird. Eben dieses möchte ich verhindern - sobald die aktuelle Regenmenge die 3mm übersteigt soll das Gießen verhindert werden.


Es sollte in der Tat aber noch anders gehen.
Sobald der Regenzähler einen Wert schreibt der über 3mm liegt müsste die Variable auf nicht gießen umschalten und 24h später wieder zurück auf gießen. Dafür könnte ich dann den Regenwert für heute verwenden. Das probier ich gleich mal aus und gebe Rückmeldung.

Danke für den Denkanstoß!

alchy
Beiträge: 10754
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 673 Mal

Re: Skripterstellung zur Erfassung der Regenmenge

Beitrag von alchy » 27.05.2020, 21:52

mhowie1 hat geschrieben:
27.05.2020, 16:25
Problem ist glaube ich hier das Kriterium Regenmenge
Nein nur Verständnis der Logik der CCU und ihre Programme. Es wird das getan was du programmiert hast.
mhowie1 hat geschrieben:
27.05.2020, 16:25
Es sollte in der Tat aber noch anders gehen.
Und den Weg würde ich vorschlagen zu testen.

Der Vollständigkeit halber:

Den Zeitstempel deiner Variable bekommst du mittels der Methode .Timestamp()
Heißt also :

Code: Alles auswählen

object  oSysvar = dom.GetObject(ID_SYSTEM_VARIABLES).Get("Name deiner Speichervariable");
WriteLine(oSysvar.Timestamp());
Eine weitere Möglichkeit ist die Ausführungszeit des Programmes zur Berechnung zu nehmen.

Code: Alles auswählen

object oThisPrg = dom.GetObject("Name deines Programms"); ! im Script eines Programms kann natürlich statt des Namens gleich "$this$" verwendet werden 
WriteLine(oThisPrg.ProgramLastExecuteTime());
WriteLine(oThisPrg.ProgramLastExecuteTimeSeconds());
Führst du Berechnungen mit der aktuellen Zeit durch, ist deine Zeitspanne leicht zu prüfen.
>> H I E R << hatte ich auch mal ein Script mit Zeitberechnungen gepostet was weiter helfen sollte. Falls nicht musst du halt noch mal schreiben.


Alchy

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

mhowie1
Beiträge: 13
Registriert: 25.05.2020, 19:32
System: CCU

Re: Skripterstellung zur Erfassung der Regenmenge

Beitrag von mhowie1 » 28.05.2020, 16:00

Danke für die Rückmeldung.

Ich habe es jetzt in der Tat anders eingebaut als zu Beginn angedacht. Wenn es jetzt mal etwas mehr regnet kann ich überprüfen ob es so auch funktioniert. Umgesetzt habe ich es jetzt so:
Regenmenge schreiben.jpg
Hier wird bei Regenerkennung am HmIP-SWO-PR bei jeder Aktualisierung die Regenmenge aus "Regenmenge Heute" geholt und in die Systemvariable "Niederschlag" geschrieben - das Skript, das angesteuert wird, schaut so aus:

Code: Alles auswählen

!Variablen setzen
var actRain = dom.GetObject('svHmIPRainCounterToday_34801').Value();
var sumRain = dom.GetObject("Niederschlag").Value();
!Wert schreiben
dom.GetObject("Niederschlag").State(actRain);
Im nächsten Schritt wird diese Systemvariable ausgewertet ob der Wert über 3mm liegt und demenstprechend wir eine weitere Systemvariable gesetzt:
Regenschwelle überschritten.jpg
Das Programm zum Gießen schaut jetzt so aus:
Programm gießen.jpg
Und das Zurücksetzen nach (knapp) 24h wird so gemacht:
Regenschwelle unterschritten.jpg
Da nach jeder Aktualisierung, wenn die Variable Niederschlag einen Wert über 3mm gesetzt bekommt, auch die Variable Regenmenge wieder frisch auf überschritten gesetzt wird, sollte auch die Zeit bis zum Zurücksetzen der Variable Regenmenge immer wieder neu starten - zumindest denke ich dass es so sein müsste?


Mit meiner Bemerkung "Problem ist glaube ich hier das Kriterium Regenmenge" hatte ich gemeint, dass ich hier nicht einfach 3mm eingeben kann sich weil hinter "Regenmenge" sehr wahrscheinlich die Gesamtregenmenge seit der Installation der Wetterstation verbirgt. Zumindest hatte ich vor meinem ersten Post ursprünglich mal diese "Regenmenge" in Verbindung mit dem Wert 3mm eingebaut aber das hatte nie funktioniert. Im Sytemprotokoll wird bei Regenmenge auch dieser Gesamtwert (der sonst nirgends zu sehen ist) gelistet und der wird auch bei einem Reset nicht zurückgesetzt:
Systemprotokoll.jpg

Ich beobachte jetzt mal die nächsten Tage (es soll bei uns immer wieder mal regen) und schau ob es so funktioniert wie ich mir das vorstelle.

mhowie1
Beiträge: 13
Registriert: 25.05.2020, 19:32
System: CCU

Re: Skripterstellung zur Erfassung der Regenmenge

Beitrag von mhowie1 » 29.05.2020, 14:15

Jetzt melde ich mich nochmals da ich noch einen Denkfehler im Ablauf hatte. Bei diesen "Denksportaufgaben" gehe ich ungewollte die Programmabläufe gedanklich immer wieder durch wenn ich ins Bett gehe und auch wenn ich morgens aufwache - grad so als ob mir mein Unterbewusstsein sagen würde dass etwas noch nicht stimmt :roll: .

Heute früh ist dann endlich der Knoten geplatzt und ich habe meinen Gedanken von vor ein paar Tagen wieder aufgreifen können. Der Wert für Regenmenge Heute funktioniert nämlich leider doch nicht weil es mir einen Strich durch die Rechnung machen würde wenn es bis kurz vor Mitternacht etwas unter 3mm regen würde, es dann kurz aufhört zu regnen und es dann nach Mitternacht wieder etwas weniger als 3mm regnen würde. In Summe wären es dann knapp unter 6mm was locker ausreicht damit nicht gegossen werden soll. Tatsächlich würde das Programm aber die Beregnung freigeben weil vor Mitternacht die Grenze von 3mm noch nicht erreicht war und ab Mitternacht der Wert wieder bei 0mm anfängt und dann abermals der Wert von 3mm nicht erreicht wird. Problem ist also hier, dass die tägliche Regenmenge zu einem festen Zeitpunkt auf Null gesetzt wird.

Deshalb habe ich es nun nochmals abgeändert (mittlerweile die dritte oder vierte Iteration :? ) - damit sollte es jetzt aber hoffentlich funktionieren:
Regenmenge schreiben_neu.jpg
Wie gehabt wird hier mit dem ersten Skript der Wert der Regenmenge - wenn es regnet - bei jeder Aktualisierung ausgelesen und sofort in die Variable Niederschlag geschrieben - diesmal wird allerdings nicht der Wert für Regen Heute sondern der Wert für die Regenmenge unabhängig von bestimmten Tagen verwendet. Das ist der Wert der direkt bei Regenmenge steht (da wird bei Regen immer wieder automatisch aufaddiert):
Wetterstation.jpg
Hier das Skript dazu (brauche ich da die zweite var-Zeile überhaupt?):

Code: Alles auswählen

!Variablen setzen
var actRain = dom.GetObject('svHmIPRainCounter_34801_00185A499D0BD3:1').Value();
var sumRain = dom.GetObject("Niederschlag").Value();
!Wert schreiben
dom.GetObject("Niederschlag").State(actRain);
Bei jeder Aktualisierung sollten (hoffentlich) die beiden zeitverzögerten Aktionen neu gestartet werden. Die erste Aktion ist das Umstellen der Systemvariable "Regenmenge" auf nicht überschritten - damit wird die Beregnung programmmäßig freigegeben. Sollte es also 24h lang nicht geregnet haben wird automatisch die Freigabe erteilt.
Mit der zweiten Aktion wird die aufsummierte Regenmenge - wenn es 24h nicht geregnet hat - wieder auf Null gesetzt (ansonsten würde der Wert ja immer weiter steigen), hier das Skript dazu:

Code: Alles auswählen

!Wert auf Null setzen
dom.GetObject('svHmIPRainCounter_34801_00185A499D0BD3:1').State(0.0);
Zum Schluss kommt nun nur noch die programmmäßige Verhinderung der Freigabe zur Bewässerung:
Regenschwelle überschritten_neu.jpg
Sobald der ausgelesene Wert über 3mm liegt wird die Variable "Regenmenge" auf überschritten gestellt und damit wird der Start der Beregnung verhindert.


Ich hoffe dass es jetzt dann endlich passt. Was meint ihr - könnte das funktionieren? :?:

mhowie1
Beiträge: 13
Registriert: 25.05.2020, 19:32
System: CCU

Re: Skripterstellung zur Erfassung der Regenmenge

Beitrag von mhowie1 » 10.06.2020, 20:08

Nachdem es jetzt ein paar Tage in Folge geregnet hat konnte ich alles genau überprüfen und es funktioniert einwandfrei. Allerdings habe ich den Ablauf nochmals leicht angepasst weil auch in der letzten Version noch ein kleiner Denkfehler drin war.

Aber jetzt passt es!

Automat1248
Beiträge: 4
Registriert: 05.04.2020, 11:24
System: CCU
Hat sich bedankt: 1 Mal

Re: Skripterstellung zur Erfassung der Regenmenge

Beitrag von Automat1248 » 05.06.2021, 17:30

Moin.

habe das alles mit großem Interesse gelesen und plane, deine heroische Bewässerungsprogrammatik nachzubauen.
Welcher Denkfehler war denn am Ende noch drin? :shock: :shock: :shock:

Antworten

Zurück zu „HomeMatic Zentrale (CCU / CCU2 / CCU3 / Charly)“