Klar doch.
Script von thkl (hier nutze ich Part 2)
Script von jmaus
Gruß Xel66
Moderator: Co-Administratoren
Können wir da nochmal drüber reden?
Code: Alles auswählen
!Differenz der beiden letzten Regenmengen auslesen und berechnen
var deltaRain = dom.GetObject("Regenmenge_heute").Value() - dom.GetObject("Regenmenge_heute").LastValue();
WriteLine (deltaRain);
!Zeitdifferenz zwischen den beiden letzten Werten auslesen (in Sekunden)
var deltaTime = (dom.GetObject("Regenmenge_heute").Timestamp() - dom.GetObject("Regenmenge_heute").LastTimestamp()).ToInteger();
var delta = (deltaRain / deltaTime) *60; !Wert der Regenmenge pro Minute berechnen
WriteLine(deltaTime);
WriteLine (delta);
dom.GetObject("Regen_Aktuell").State(delta);
if (delta <= 0.2) {
dom.GetObject("Regenwarnung").State ("Stufe 0");
}
Das beißt sich etwas mit dem von Dir oben Geschriebene.
Soll heißen, Du bist abhängig vom Sendeintervall des Sensors. Für mich wäre dieses zu ungenau. Da wären wir dann wieder bei der Normung auf mm/min oder so. Da Du diese Regenmengen direkt aus den übermittelten Werten errechnen kannst. Für Deinen Wunsch "x mal hintereinander" musst Du das sowieso zwangsweise auf einen festen Zeittakt bringen.
wieso? Habe ich doch gemacht. Im Script rechne ich doch die Werte schon aus auf mm/Minute
Das ist die eine Seite, die andere ist eben "x mal Wert". Wenn der Wert nur unregelmäßig kommt (allerdings normiert auf mm/Min), dann wird die Zählung für x eben auch nur in dem unregelmäßigen Übertragungsintervall getriggert. Das verfälscht Dir Dein Ergebnis massiv.
Hier im ersten Post hatte ich das schonmal beschrieben, das ist einfach der Senderythmus des HMIP_SWO für alle Werte:
bei 30 mm Regen pro Minute brauche ich kein Script sondern die Feuerwehr
Code: Alles auswählen
var deltaRain = dom.GetObject("Regenmenge_heute").Value() - dom.GetObject("Regenmenge_heute").LastValue();
Code: Alles auswählen
! setzt bei Regenbeginn den Zähler hoch für Starkregenerkennung
! Starkregenbereiche:
! Regenwarnung Wert >4 Warnung, Wert >6 Alarm, Wert >8 urgent Alarm
!Differenz der beiden letzten Regenmengen auslesen und berechnen
var deltaRain = dom.GetObject("Regenmenge_heute").Value() - dom.GetObject("Regenmenge_heute").LastValue();
!Fehlerquelle eliminieren bei Tageswechsel
if (deltaRain <0) {
quit;
}
!Zeitdifferenz zwischen den beiden letzten Werten auslesen (in Sekunden)
var deltaTime = (dom.GetObject("Regenmenge_heute").Timestamp() - dom.GetObject("Regenmenge_heute").LastTimestamp()).ToInteger();
var delta = (deltaRain / deltaTime) *60; !Wert der Regenmenge pro Minute berechnen
dom.GetObject("Regen_Aktuell").State(delta);
var Status = dom.GetObject("Regenwarnung").Value();
if (delta >=3) {
Status = Status +3;
dom.GetObject("Regenwarnung").State (Status);
}
elseif (delta >= 2) {
Status = Status +2;
dom.GetObject("Regenwarnung").State (Status);
}
elseif (delta >= 1) {
Status = Status +1;
dom.GetObject("Regenwarnung").State (Status);
}
elseif ((delta > 0.2) && (Status > 1)) {
Status = Status - 1;
dom.GetObject("Regenwarnung").State (Status);
}
elseif (delta <= 0.2) {
dom.GetObject("Regenwarnung").State (0);
}
Germa hat geschrieben: ↑19.02.2021, 11:27sooo, hat dann doch besser geklappt als gedacht
Angelehnt an Jürgens Script viewtopic.php?p=581409#p581409 habe ich das auf meine Bedürfnisse angepasst und erweitert:Dieses Script habe ich in ein Programm eingefügt, welches bei jeder Aktualisierung des Wettersensors gestartet wird, also so alle 2-3 Minuten.Code: Alles auswählen
!--- Wetterwerte aus Wettersensor HMIP-SWO-PR auslesen und in var schreiben --- var curTemp = datapoints.Get("HmIP-RF.********:1.ACTUAL_TEMPERATURE").Value(); ! aktuelle Temperatur var curWind = datapoints.Get("HmIP-RF.********:1.WIND_SPEED").Value(); !aktuelle Windgeschwindigkeit var maxTemp = dom.GetObject("TempAussenMax").Value(); ! Heutige Maximale Temperatur var minTemp = dom.GetObject("TempAussenMin").Value(); ! Heutige Minimale Temperatur var tMit = (dom.GetObject("TempAussenMittelwert").Value())*1.00; ! *1.00 um Kommastellen zu erhalten object zMaH = dom.GetObject("TempAussenMax.Zeit").Value(); ! Zeitpunkt der MaxTempHeute object zMiH = dom.GetObject("TempAussenMin.Zeit").Value(); ! Zeitpunkt der MinTempHeute var tDif = 0.1; ! Bereich in dem "Tendenz = konstant =" angezeigt wird (Bei 0.05 = zwischen +0,05°C und -0,05°C Abweichung) var n = 5.00; ! Wie schnell der Mittelwert sich dem Istwert annähert. >der Wert muss mind 02.00 sein, sinnvoll 5.00 - 10.00 ! Bei 02.00= wird die Diff. pro Durchgang halbiert /Bei 10.00= wird die Diff. pro Durchgang um ein 1/10 kleiner) var maxWind = dom.GetObject("WindMax").Value(); ! -- aktuelle Temperatur in Variable schreiben dom.GetObject("TempAussen").State(curTemp); ! -- Min/Max ,--------------Minimale/Maximale Temperatur wird ermittelt if (maxTemp < curTemp) { dom.GetObject("TempAussenMax").State(curTemp); dom.GetObject("TempAussenMax.Zeit").State(system.Date("%H:%M Uhr")); } if ((minTemp) > (curTemp)) { dom.GetObject("TempAussenMin").State(curTemp); dom.GetObject("TempAussenMin.Zeit").State(system.Date("%H:%M Uhr")); } ! -- Tendenz --------------Schwankungen werden gedämpft und dann die Richtung ermittelt tMit = ((((n - 1) * (tMit)) + (curTemp)) / n); dom.GetObject("TempAussenMittelwert").State(tMit); if ((tMit - curTemp) > tDif) {dom.GetObject("TempAussenTendenz").State("__ fällt __");} elseif ((curTemp - tMit) > tDif) {dom.GetObject("TempAussenTendenz").State("++ steigt ++");} else {dom.GetObject("TempAussenTendenz").State("= konstant =");} ! -- maximalen Wind in Variable schreiben if (maxWind < curWind) { dom.GetObject("WindMax").State(curWind); dom.GetObject("WindMax.Zeit").State(system.Date("%H:%M Uhr")); } !Regenbeginn in Variable schreiben var RegBeg = dom.GetObject("HmIP-RF.********:1.RAINING").Value(); dom.GetObject("Regenbeginn").State(RegBeg); if (RegBeg == true) { var RegBegTime = dom.GetObject("Regenbeginn").Timestamp().Format("%d.%m. %H:%M"); dom.GetObject("Regenbeginn.Zeit").State(RegBegTime); }
Alle Namen in " " müsst Ihr dafür durch Eure Namen ersetzen. Meine Systemvariablen dafür heißen entsprechend:
Regenbeginn
Regenbeginn.Zeit
TempAussen
TempAussenMax
TempAussenMax.Zeit
TempAussenMin
TempAussenMin.Zeit
TempAussenMittelwert
TempAussenTendenz
WindMax
WindMax.Zeit
Einige dieser Variablen habe ich dem Sensorkanal zugeordnet und so erscheinen die Werte dann in der WebUI auch in der Ansicht des Sensors (siehe Bild unten).
WebUI Ansicht.JPG
Variablen.JPG
Und natürlich müssen die beiden Kanäle Eures Wettersensors entsprechend eingetragen werden:
HmIP-RF.********:1.ACTUAL_TEMPERATURE
HmIP-RF.********:1.WIND_SPEED
HmIP-RF.********:1.RAINING
In einem zweiten Script werden dann kurz VOR Mitternacht die Werte von heute auf Werte_gestern geschoben und aktuelle Startwerte für den neuen Tag gesetzt:Die zusätzlichen Systemvariablen dafür lauten bei mir entsprechend:Code: Alles auswählen
!--- Wetterwerte von heute auf gestern schieben und var mit aktuellen Werten neu starten --- var curTemp = datapoints.Get("HmIP-RF.********:1.ACTUAL_TEMPERATURE").Value(); var curWind = datapoints.Get("HmIP-RF.********:1.WIND_SPEED").Value(); dom.GetObject("TempAussenMax_gestern").State(dom.GetObject("TempAussenMax").Value()); dom.GetObject("TempAussenMax.Zeit_gestern").State(dom.GetObject("TempAussenMax.Zeit").Value()); dom.GetObject("TempAussenMin_gestern").State(dom.GetObject("TempAussenMin").Value()); dom.GetObject("TempAussenMin.Zeit_gestern").State(dom.GetObject("TempAussenMin.Zeit").Value()); dom.GetObject("WindMax_gestern").State(dom.GetObject("WindMax").Value()); dom.GetObject("WindMax.Zeit_gestern").State(dom.GetObject("WindMax.Zeit").Value()); dom.GetObject("WindMax").State(curWind); dom.GetObject("TempAussenMax").State(curTemp-1); dom.GetObject("TempAussenMin").State(curTemp+1); dom.GetObject("TempAussenMittelwert").State(curTemp); dom.GetObject("TempAussenMax.Zeit").State(system.Date("%H:%M Uhr")); dom.GetObject("TempAussenMin.Zeit").State(system.Date("%H:%M Uhr"));
TempAussenMax_gestern
TempAussenMax.Zeit_gestern
TempAussenMin_gestern
TempAussenMin.Zeit_gestern
WindMax_gestern
WindMax.Zeit_gestern
Anmerkungen:
Der Temperaturbereich der Variablen liegt zwischen -40°C und +55°C.
Damit die Min-Max-Berechnung funktioniert, muss vor dem Start der Scripte die Minimaltemperatur auf jeden Fall über der aktuellen Temperatur liegen und die Maximaltemperatur unter der aktuellen Temperatur. In einigen Foreneinträgen wird deswegen bei jedem Scriptaufruf des zweiten Scripts TempAussenMax = -40°C gesetzt und TempAussenMin = +55°C, denn dann ist diese Bedingung ja auf jeden Fall gegeben. Das wollte ich aber nicht, da ich dann bei der grafischen Auswertung jedes Mal die Maximalausschläge drin habe. Ich setze also Max und Min auf die aktuelle Temperatur -1 bzw. +1, dann klappt es auch.
Nach einigen Testtagen scheint alles sauber zu laufen. Falls jemand Fehler findet, immer her damit.
Falls einer von Euch Programmierprofis sich bei meinem Anfänger-Code die Haare rauft , bitte gerne Korrektur.