Das mit der "eigenen Sysvariante befüllen" in dem Systemeigenen Script klappt bei mir leider nicht. Die Werte bleiben immer "0".Germa hat geschrieben: ↑16.02.2021, 21:10Hallo zusammen,
Der große Wettersensor von Homematic IP fristet in den Foren irgendwie ein geringfügiges Dasein. Seit Tagen beschäftige ich mich mit dem Gerät auf der CCU3 und dem Auslesen der Werte. Einige Hilfe dazu hat mir dieses Forum bereits geliefert, an anderen Stellen komme ich einfach nicht weiter. Ich tue mich schwer mit der Script-Programmierung, habe mir aber mit Hilfe von Alchy, Black und einigen anderen ambitionierten Profis ein bisschen Verständnis angeeignet. Also fasse ich mal zusammen, was ich bisher weiß:
Ausgangslage:
Ich möchte bei Aktualisierung des Sensors (schickt ja alle drei Minuten die Werte)* (siehe unten) selbst definierte Systemvariablen füllen, sie heißen bei mir
Sonnenschein_heute
Sonnenschein_gestern
Regenmenge_heute
Regenmenge_gestern
Regenbeginn
TempAussen
Dazu kommen etliche Min- und Max- Angaben und Aktualisierungszeiten, dazu mehr weiter unten und im nächsten post.
Nach dem Anlernen liefert der Sensor folgende Datenpunkte:
56755 HmIP-RF.xxxxxxxxxxxx:1
56756 HmIP-RF.xxxxxxxxxxxx:1.ACTUAL_TEMPERATURE
56758 HmIP-RF.xxxxxxxxxxxx:1.HUMIDITY
56760 HmIP-RF.xxxxxxxxxxxx:1.ILLUMINATION
56762 HmIP-RF.xxxxxxxxxxxx:1.RAINING --> Regenbeginn
56763 HmIP-RF.xxxxxxxxxxxx:1.RAIN_COUNTER --> Gesamtregenmenge
56766 HmIP-RF.xxxxxxxxxxxx:1.SUNSHINEDURATION --> Gesamtsonnenscheindauer
56769 HmIP-RF.xxxxxxxxxxxx:1.WIND_DIR
56770 HmIP-RF.xxxxxxxxxxxx:1.WIND_DIR_RANGE
56773 HmIP-RF.xxxxxxxxxxxx:1.WIND_SPEED
Die Ise-IDs sind dann natürlich bei jedem anders.
Versteckt dazu werden folgende interne Systemvariablen erzeugt, die man mit einem Script hier im Forum von Alchy auslesen kann:
svHmIPRainCounter_56755_xxxxxxxxxxxx:1
svHmIPRainCounterOldVal_56755
svHmIPRainCounterToday_56755
svHmIPRainCounterYesterday_56755
svHmIPSunshineCounter_56755_xxxxxxxxxxxx:1
svHmIPSunshineCounterOldVal_56755
svHmIPSunshineCounterToday_56755
svHmIPSunshineCounterYesterday_56755
Dazu werden drei versteckte Programme angelegt, die in der CCU unter > Programme - systeminterne Programme einblenden < zum Vorschein kommen.
Sie heißen
- prgDailySunshineRainCounter_56755 (wird von eq-3 vorgegeben 7 Uhr morgens täglich ausgeführt, habe ich auf 00:01 Uhr geändert)
- prgRainCounter_56755_56755_xxxxxxxxxxxx:1 (Ausführung jedes Mal, wenn Werte geschickt werden)
- prgSunshineCounter_56755_xxxxxxxxxxxx:1 (Ausführung jedes Mal, wenn Werte geschickt werden)
In prgRainCounter.... kann man mit ein paar ergänzten Zeilen von Alchy die aktuelle Regenmenge in die eigene Variable schreiben viewtopic.php?t=43666. Das sieht dann bei mir so aus und funktioniert auch:Analog dazu funktioniert das auch genauso mit dem Sonnenscheinscript prgSunshineCounter....Code: Alles auswählen
object chn = dom.GetObject('56755'); object oOverflow = chn.DPByControl('WEATHER_TRANSMIT.RAIN_COUNTER_OVERFLOW'); object oRainCounter = chn.DPByControl('WEATHER_TRANSMIT.RAIN_COUNTER'); object oSysVarRain = dom.GetObject('svHmIPRainCounter_56755_xxxxxxxxxxxx:1'); object oSysVarRainOldVal = dom.GetObject('svHmIPRainCounterOldVal_56755'); object oSysVarCounterToday = dom.GetObject('svHmIPRainCounterToday_56755'); object oSysVarCounterYesterday = dom.GetObject('svHmIPRainCounterYesterday_56755'); ! !eigene sysVar deklarieren und dem Objekt zuweisen object oSysVarMyCounterToday = dom.GetObject('Regenmenge_heute'); ! boolean overFlowFlag = oOverflow.Value(); real devVal = oRainCounter.Value(); real devValMax = oRainCounter.ValueMax(); real oldDevVal = oSysVarRainOldVal.Value(); real diffVal = 0.0; real sysVarVal = oSysVarRain.Value(); real sysVarTodayVal = oSysVarCounterToday.Value(); real todayTotal = 0.0; integer tmp_devVal = (devVal.ToString().ToFloat() * 1000).ToInteger(); integer tmp_oldDevVal = (oldDevVal.ToString().ToFloat() * 1000).ToInteger(); if (overFlowFlag == false) { ! Normal conditions if (tmp_oldDevVal <= tmp_devVal) { diffVal = devVal - oldDevVal; } ! Device has rebooted if (tmp_oldDevVal > tmp_devVal) { diffVal = devVal; } } else { !overFlow is true if (tmp_oldDevVal > tmp_devVal) { ! An device overflow has occured diffVal = (devVal + devValMax) - oldDevVal; } else { ! Once the overflow flag has been set it will only be false when the device reboots ! Therefore this is the normal condition after an device overflow diffVal = devVal - oldDevVal; } } if (tmp_devVal != 0) { oSysVarRainOldVal.State(devVal); oSysVarRain.State(sysVarVal + diffVal); } todayTotal = sysVarTodayVal + diffVal; if (todayTotal >= 1440.0) {todayTotal = 0.0;} oSysVarCounterToday.State(todayTotal); ! !Werte in die eigenen sysvar schreiben oSysVarMyCounterToday.State(todayTotal);
In das dritte Script "prgDailySunshineRainCounter_56755" habe ich das Auslesen der Regenmenge_gestern und Sonnenschein_gestern eingebaut, denn das muss ja nur einmal täglich in die Variable geschrieben werden. Sieht dann so aus:Auch schaffe ich es, den Datenpunkt für Regenbeginn bei einsetzendem Regen auszulesen:Code: Alles auswählen
object chn = dom.GetObject('56755'); object oSysVarSunshineCounterToday = dom.GetObject('svHmIPSunshineCounterToday_56755'); object oSysVarSunshineCounterYesterday = dom.GetObject('svHmIPSunshineCounterYesterday_56755'); object oSysVarRainCounterToday = dom.GetObject('svHmIPRainCounterToday_56755'); object oSysVarRainCounterYesterday = dom.GetObject('svHmIPRainCounterYesterday_56755'); if (oSysVarSunshineCounterYesterday && oSysVarSunshineCounterToday) {oSysVarSunshineCounterYesterday.State(oSysVarSunshineCounterToday.Value());}if (oSysVarSunshineCounterToday) {oSysVarSunshineCounterToday.State(0);}if (oSysVarRainCounterYesterday && oSysVarRainCounterToday) {oSysVarRainCounterYesterday.State(oSysVarRainCounterToday.Value());}if (oSysVarRainCounterToday) {oSysVarRainCounterToday.State(0);} !eigene Systemvariable für Regenmenge_gestern beschreiben object oSysVarMyRainCounterYesterday = dom.GetObject('Regenmenge_gestern'); oSysVarMyRainCounterYesterday.State(oSysVarRainCounterYesterday.Value()); !eigene Systemvariable für Sonnenschein_gestern beschreiben object oSysVarMySunshineCounterYesterday = dom.GetObject('Sonnenschein_gestern'); oSysVarMySunshineCounterYesterday.State(oSysVarSunshineCounterYesterday.Value());
Ob das mit der Detektion des beginnenden Regens klappt, habe ich noch nicht herausgefunden ... ich werde berichten.Code: Alles auswählen
!Regenbeginn aus Wettersensor abfragen und in Variable "Regenbeginn" schreiben var RegBeg = dom.GetObject("HmIP-RF.*******:1.RAINING").Value(); dom.GetObject("Regenbeginn").State(RegBeg);
Das Auslesen der Werte für die Temperatur erfolgt auf gleiche Weise.
Für folgende Variablen möchte ich die Werte ermitteln:
Regenbeginn.Zeit
TempAussenMin
TempAussenMax
TempAussenMin.Zeit
TempAussenMax.Zeit
WindMax
Da habe ich schon einige Anregungen hier im Forum gefunden und werde nochmal weiter probieren ... ich werde scheitern und Euch dann im nächsten post mit meinen Problemen dazu befeuern.
Helligkeit
Wie aus mehreren Foren erfahren geht es auch mir so, dass bei strahlendem Sonnenschein der Helligkeitssensor morgens einfach auf Vollausschlag Wert 100000 springt und dort auch für mehrere Stunden bleibt. Links dazu:
https://de.elv.com/forum/merkwuerdige-w ... nsor-16535
oder auch
viewtopic.php?t=52103
Bekleben will ich meinen Sensor aber nicht. Ich bin auf Firmware 1.0.18 und hoffe, dass eq-3 in Kürze nachbessert. Unverständlich eigentlich, denn ich habe auch den Helligkeitssensor HmIP-SLO und bei dem funktioniert das seit langer Zeit tadellos und vor allem mit gemittelten Werten klasse.
* wie ich festgestellt habe, liefert der Sensor seine Werte im Abstand zwischen 2-3 Minuten und zwar nach einem mehr oder weniger festen Zickzackmuster-Zeitabstand (siehe Dateianhang)
Jetzt Habe ich das "MY" weg gemacht, jetzt schreibt er Werte aber nur in die eigene Systemvariable.
Kannst Du mir hierbei weiterhelfen?
Dankeschön!Germa hat geschrieben: ↑22.02.2021, 09:57hab noch einen Fehler gefunden:
Das Programm für das Schieben der alten Werte auf gestern muss vor 00:00 Uhr erfolgen, sonst werden, wenn z.B. genau um 0 Uhr neue Werte vom Sensor geliefert werden, die ein TempAussenMin kleiner als TempAussen haben, diese Werte um 00:02 Uhr in TempAussenMin_gestern geschoben.
Also besser 23:59 Uhr das Programm starten, dann klappt es