Optimierung OWM-Rule - Berechnung Tagesgesamtwerte

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Benutzeravatar
peter-pan
Beiträge: 2758
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

Optimierung OWM-Rule - Berechnung Tagesgesamtwerte

Beitrag von peter-pan »

Hallo Zusammen,

ich bastele immer wieder an der nachstehenden Regel, die bis auf zwei "kleine" Fehler auch ganz gut läuft (mal davon abgesehen, ob die Werte alle korrekt sind ;) ). Innerhalb der Regel ist ein Teil für die tägliche Berechnung, der fast immer gleich ist, bis auf die Variablen der einzelnen Tage. Der Teil sieht so aus:

Code: Alles auswählen

     //logInfo ("owm.rules", "DebugPoint 5: " + tmp_timestamp + " /: " + itemindex)
     //------------------------------------------------------------------------------------------------------------------------------------------------------------------------
     //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
     //++++++++++++++++++++++++++++                 Day 0               ++++++++++++++++++++++++++++++++++++++++++++++++++
     //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
     if (day0 == tmp_timestamp)
     {
       itemindex = itemindex + itemincrement
       count_day0 = count_day0 + 1
       sum_temp_day0 = sum_temp_day0 + tempItemTemperature.getStateAs(DecimalType)
       //++++++++++++++++ Temperature Minimum of the day +++++++++++++++++++++++++++++++++++++++++++++++++
        var Number min = 0
        min = min + tempItemTemperature.getStateAs(DecimalType)
        if (min_temp_day0 > min) {
         min_temp_day0 = min
        }
        //+++++++++++++++ Temperature Maximum of the day +++++++++++++++++++++++++++++++++++++++++++++++++
        var Number max = 0
        max = max + tempItemTemperature.getStateAs(DecimalType)
        if (max_temp_day0 < max) {
         max_temp_day0 = max
        }
        //+++++++++++++++ Rain Sum of the day +++++++++++++++++++++++++++++++++++++++++++++++++
        sum_rain_day0 = sum_rain_day0 + tempItemRainVolume.getStateAs(DecimalType)
//        logInfo("owm.rules","DebugPoint 5a Rain Day 0: " + sum_rain_day0)
         //+++++++++++++++ Snow Sum of the day +++++++++++++++++++++++++++++++++++++++++++++++++
        sum_snow_day0 = sum_snow_day0 + tempItemSnowVolume.getStateAs(DecimalType)
//        logInfo("owm.rules","DebugPoint 5a Snow Day 0: " + sum_snow_day0)
    }
     //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
     //++++++++++++++++++++++++++++                 Day 1               ++++++++++++++++++++++++++++++++++++++++++++++++++
     //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
     if (day1 == tmp_timestamp) {
 
Diese Schleife wiederholt sich im Prinzip insgesamt 6-mal (Tag 0 bis Tag 5).

Hat jemand eine Idee, wie man das ganze in eine Abfrage packen kann, bei der sich nur die Tage ändern (day0 ..day5) ?

Die ganze Regel hab ich als Anhang beigefügt. Über Anregungen und Tipps würde ich mich freuen.

Gruss - Peter
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

Benutzeravatar
udo1toni
Beiträge: 15247
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Optimierung OWM-Rule - Berechnung Tagesgesamtwerte

Beitrag von udo1toni »

Was bedeutete denn owm? was sind die Gesamtwerte, die Du da berechnen willst? Warum nutzt Du dafür nicht einfach die Persistence?
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
peter-pan
Beiträge: 2758
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

Re: Optimierung OWM-Rule - Berechnung Tagesgesamtwerte

Beitrag von peter-pan »

Hallo Udo,

sorry, mit OWM meinte ich OpenWeatherMap. Ich habe bis auf MapDB keine Persistence auf meinem RasPi. Das Ermitteln der täglichen Werte ist aber auch nicht ganz so einfach, da sich die Tageswerte alle drei Stunden verschieben können (und auch tun).
Es gibt zwar auch einige Ansätze im internationalen Forum, aber ich wollte halt einfach mit meinem Ansatz weiter machen. Ich hab auch schon am Anfang mit den Generic Groups experimentiert, aber das hat nicht so richtig geklappt (bei mir). Ich war deshalb schon zufrieden, dass ich mit den Generic Items zurande komme.

Der Ansatz von Scott ist für mich als Amateur zu schwierig, da er das mit seiner Rule-Engine macht und alle items und Groups dynamisch aufbaut und wieder löscht. (Vielleicht irgendwann mal, mal sehen was OH3 bringt :?: :!: )

Also die Gesamtwerte (Gesamt/Durchschnitt/Min/Max) habe ich momentan für Temperatur, Regen und Schnee. Das Ganze sieht so aus.
owm.jpg
Ausserdem berechne ich noch die aktuelle, gefühlte Kälte (windchill). Die Rule hierzu kennst du ja sicherlich ;)

Code: Alles auswählen

var chillCount = 4
rule "Windchill_Calculate"   //  thx to @Udo_Hartmann for the Rule-Body  and @dmaillie for the math-stuff - 2019-01-13
when 
    //Item Dummy3x received command ON or
    Item localCurrentTemperature received update
 
then 
    if(!(localCurrentWindSpeed.state instanceof Number)|| !(localHourlyForecast3WindSpeed.state instanceof Number))
    {
        logWarn("windchill","Windspeed not of Type Number!")
        return;
    }
    if(!(localCurrentTemperature.state instanceof Number)|| !(localHourlyForecast3Temperature.state instanceof Number)) 
    {
        logWarn("windchill","Temperature not of Type Number!")
        return;
    }
     var speedCurrent = Math.pow((((localCurrentWindSpeed.state as Number).floatValue) * 1.0), 0.16)
          //logInfo("windchill","Speed: " + speedCurrent)
     var speedForecast3 = Math.pow((((localHourlyForecast3WindSpeed.state as Number).floatValue) * 1.0), 0.16)
          //logInfo("windchill","Speed: " + speedForecast3)

     var tempCurrent = (localCurrentTemperature.state as Number).floatValue
        //logInfo("windchill","Temp: " + tempCurrent)
     var tempForecast3 = (localHourlyForecast3Temperature.state as Number).floatValue
        //logInfo("windchill","Temp: " + tempForecast3)

    owm_localCurrentWindchill.postUpdate(13.12 + 0.6215 * tempCurrent - 11.37 * speedCurrent + 0.3965 * tempCurrent * speedCurrent )
    owm_localHourlyForecast3Windchill.postUpdate(13.12 + 0.6215 * tempForecast3 - 11.37 * speedForecast3 + 0.3965 * tempForecast3 * speedForecast3 )
    chillCount ++
    if (chillCount >= 4)  // logInfo every 2 hours (or every 4th time) - Temperature is updated every 30 Minutes by another Rule/Binding
    {
        logInfo("windchill"," I'm alive - Temp: {} Speed: {}",tempCurrent,speedCurrent)
        //logInfo("windchill"," I'm still alive")
        chillCount = 0
    }
end
In den IF-Schleifen werden die jeweiligen Werte für die Tage gesammelt und anschliessend für die Ausgabe aufbereitet.

Die Variablen die ich in den Schleifen benutze haben immer den Teilstring "dayX".

Gibt es hier vielleicht die Möglichkeit den Namen der Variablen auch generisch zusammen zu setzen und so die 6 If-Abfragen in eine zu reduzieren ?

Das muss ja nicht unbedingt If sein. Kann auch while oder case sein. Ich habe aber im Augenblick keine Idee, wie ich das machen soll.

Gruss - Peter
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

Benutzeravatar
udo1toni
Beiträge: 15247
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Optimierung OWM-Rule - Berechnung Tagesgesamtwerte

Beitrag von udo1toni »

Ehrlich gesagt verstehe ich nicht, wie die Rule funktioniert. Es ist recht einfach, Gruppen zu bilden und die Namen der Items so zu filtern, dass die zueinander passenden Items übrig bleiben, aber für mich sieht es eher so aus, dass die Herangehensweise schon unglücklich ist.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
peter-pan
Beiträge: 2758
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

Re: Optimierung OWM-Rule - Berechnung Tagesgesamtwerte

Beitrag von peter-pan »

Hallo Udo,
macht nichts. Es ist auch nicht ganz so einfach, das System der 3-Stunden-Werte aus den OpenweatherMap-Daten in eine Tagesgruppierung zu bringen, da diese ja nicht fix sind.
Aber wie du sagst, werde ich weiter daran arbeiten und vielleicht finde ich dann auch den richtigen Weg um eine entsprechende Gruppierung auf eine andere, einfachere Weise zu realisieren. Ich bleibe auf jeden Fall dran. Der momentane Stand bleibt mir ja auf jeden Fall erhalten und gibt mir auch entsprechende zusammenfassende Werte aus, so dass ich in aller Ruhe nach einem neuen Konzept suchen kann.

Gruss - Peter
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

Benutzeravatar
udo1toni
Beiträge: 15247
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Optimierung OWM-Rule - Berechnung Tagesgesamtwerte

Beitrag von udo1toni »

Was sind das denn für 3-Stunden-Werte? Sind das sie Summen über drei Stunden? Und was meinst Du mit "nicht fix"?
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
peter-pan
Beiträge: 2758
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

Re: Optimierung OWM-Rule - Berechnung Tagesgesamtwerte

Beitrag von peter-pan »

Hallo Udo,
ich hoffe ich habe dich nicht um deinen Schlaf gebracht, dass du mir um diese Uhrzeit noch (schon) antwortest :o .

Also, es geht um das OpenWeatherMap-Binding (die freie Version) von C.Weitkamp. Dieses Binding liefert Wetterdaten. Allerdings stellt die freie Version keine kumuliertenTagesdaten zur Verfügung.
Man bekommt hier für einen Zeitraum von max. 5 Tage die Vorhersagewerte für jeweils 3 Stunden. Es gibt also Werte für "Jetzt", in 3 Stunden, in 6 Stunden, in... bis in 120 Stunden. Der Prinzip-Aufbau ist an die Binding-Doku angelehnt.
Diese Werte
a) verschieben sich natürlich immer wieder. Alle 3 Stunden fällt der letzte Wert weg und vorne kommt ein neuer hinzu und die dazwischen verschieben sich um einen Zeitraum.
b) die Werte als solche passen sich natürlich auch wieder an die aktuelle Wettersituation bzw. Vorschau an.

Hier ein kleiner Auszug aus meinem Items-File:

Code: Alles auswählen

DateTime             localLastMeasurement                    "Timestamp of last measurement [%1$ta, %1$ty-%1$tm-%1$td %1$tH:%1$tM]"<time> (gOWM,gOWMOutlook)  { channel="openweathermap:weather-and-forecast:api:local:current#time-stamp" }
DateTime             lastRuleRefresh                         "Rule triggered at [%1$tH:%1$tM:%1$tS]"                       <time>         (gOWM,gOWMOutlook)  // Value calculated via Rule "owm Aggregation daily Measures"
Switch               owmTriggerSwitch                        "manually Trigger Switch [%s]"                                               (gOWM,gOWMOutlook)  // using mapdb.persist to save last State
Image                localCurrentConditionIcon               "Icon"                                                                       (gOWM,gOWMOutlook)  { channel="openweathermap:weather-and-forecast:api:local:current#icon" }
String               localCurrentConditionIconId             "Icon Id [%s]"                                                <icon>         (gOWM,gOWMOutlook)  { channel="openweathermap:weather-and-forecast:api:local:current#icon-id" }
Number:Temperature   localCurrentTemperature                 "Current temperature [%.1f %unit%]"                           <temperature>  (gOWM,gOWMOutlook)  { channel="openweathermap:weather-and-forecast:api:local:current#temperature" }
String               localCurrentCondition                   "Current condition/Wetterlage[%s]"                            <sun_clouds>   (gOWM,gOWMOutlook)  { channel="openweathermap:weather-and-forecast:api:local:current#condition" }
Number:Pressure      localCurrentPressure                    "Current barometric pressure/Luftdruck [%.1f %unit%]"         <pressure>     (gOWM,gOWMOutlook)  { channel="openweathermap:weather-and-forecast:api:local:current#pressure" }
Number:Dimensionless localCurrentHumidity                    "Current atmospheric humidity/Luftfeuchtigkeit [%d %unit%]"   <humidity>     (gOWM,gOWMOutlook)  { channel="openweathermap:weather-and-forecast:api:local:current#humidity" }
Number:Speed         localCurrentWindSpeed                   "Current wind speed/Windgeschwindigkeit [%.1f km/h]"          <wind>         (gOWM,gOWMOutlook)  { channel="openweathermap:weather-and-forecast:api:local:current#wind-speed" }
Number:Angle         localCurrentWindDirection               "Current wind direction/Windrichtung [%d %unit%]"             <wind>         (gOWM,gOWMOutlook)  { channel="openweathermap:weather-and-forecast:api:local:current#wind-direction" }
Number:Angle         localCurrentWindDirectionNamed          "Current wind direction Named [SCALE(wind.scale):%s]"         <compass>      (gOWM,gOWMOutlook)  { channel="openweathermap:weather-and-forecast:api:local:current#wind-direction" }
Number:Length        localCurrentRainVolume                  "Current rain volume/Regen [%.1f %unit%]"                     <rain>         (gOWM,gOWMOutlook)  { channel="openweathermap:weather-and-forecast:api:local:current#rain" }
Number:Length        localCurrentSnowVolume                  "Current snow volume/Schnee [%.1f %unit%]"                    <snow>         (gOWM,gOWMOutlook)  { channel="openweathermap:weather-and-forecast:api:local:current#snow" }
Number:Speed         localCurrentGustSpeed                   "Current Gust Speed/Windböen[%.1f %unit%]"                    <wind>         (gOWM,gOWMOutlook)  { channel="openweathermap:weather-and-forecast:api:local:current#gust-speed" }
Number:Dimensionless localCurrentCloudiness                  "Current cloudiness/Bewölkung [%d %unit%]"                    <cloudiness>   (gOWM,gOWMOutlook)  { channel="openweathermap:weather-and-forecast:api:local:current#cloudiness" }
String               localCurrentConditionID                 "Current condition ID[%s]"                                    <pic803>       (gOWM,gOWMOutlook)  { channel="openweathermap:weather-and-forecast:api:local:current#condition-id" }
DateTime             localCurrentUVIndexTimestamp            "Timestamp current UV [%1$ta, %1$ty-%1$tm-%1$td %1$tH:%1$tM]" <time>         (gOWM,gOWMOutlook)  { channel="openweathermap:uvindex:api:local:current#time-stamp" }
//DateTime             owm_localCurrentUVIndexTimestamp        "Timestamp UV Index [%1$ta, %1$ty-%1$tm-%1$td %1$tH:%1$tM]"   <time>         (gOWM,gOWMOutlook)  {http="<[owm_test:120000:JSONPATH($.date_iso)]"}
Number               localCurrentUVIndex                     "Current UV Index [%d]"                                       <uv_index>     (gOWM,gOWMOutlook)  { channel="openweathermap:uvindex:api:local:current#uvindex" }
//Number               owm_localCurrentUVIndex                 "Current UV Index [%d]"                                       <uv_index>     (gOWM,gOWMOutlook)  {http="<[owm_test:120000:JSONPATH($.value)]"}
Number               owm_localCurrentWindchill               "Current Windchill [%.1f °C]"                                 <windchill1>   (gOWM,gOWMOutlook)  // Value calculated via Rule "Windchill_Calculate"
//String               localCurrentDummy                       "---------------------------------------"                     <clouds>       (gOWM)

DateTime             localHourlyForecast3Timestamp           "Timestamp in 03 hours [%1$ta, %1$ty-%1$tm-%1$td %1$tH:%1$tM]" <time>        (gOWM,gOWMOutlook)  { channel="openweathermap:weather-and-forecast:api:local:forecastHours03#time-stamp" }
Image                localHourlyForecast3ConditionIcon       "Icon"                                                                       (gOWM,gOWMOutlook)  { channel="openweathermap:weather-and-forecast:api:local:forecastHours03#icon" }
Number:Temperature   localHourlyForecast3Temperature         "Temperature in 03 hours [%.1f %unit%]"                        <temperature> (gOWM,gOWMOutlook)  { channel="openweathermap:weather-and-forecast:api:local:forecastHours03#temperature" }
String               localHourlyForecast3Condition           "Condition in 03 hours [%s]"                                   <pic600>      (gOWM,gOWMOutlook)  { channel="openweathermap:weather-and-forecast:api:local:forecastHours03#condition" }
Number:Pressure      localHourlyForecast3Pressure            "in 03 hours barometric pressure [%.1f %unit%]"                <pressure>    (gOWM,gOWMOutlook)  { channel="openweathermap:weather-and-forecast:api:local:forecastHours03#pressure" }
Number:Dimensionless localHourlyForecast3Humidity            "in 03 hours atmospheric humidity [%d %unit%]"                 <humidity>    (gOWM,gOWMOutlook)  { channel="openweathermap:weather-and-forecast:api:local:forecastHours03#humidity" }
Number:Speed         localHourlyForecast3WindSpeed           "in 03 hours wind speed [%.1f km/h]"                           <wind>        (gOWM,gOWMOutlook)  { channel="openweathermap:weather-and-forecast:api:local:forecastHours03#wind-speed" }
Number:Angle         localHourlyForecast3WindDirection       "in 03 hours wind direction [%d %unit%]"                       <wind>        (gOWM,gOWMOutlook)  { channel="openweathermap:weather-and-forecast:api:local:forecastHours03#wind-direction" }
Number:Length        localHourlyForecast3RainVolume          "in 03 hours rain volume [%.1f %unit%]"                        <rain>        (gOWM,gOWMOutlook)  { channel="openweathermap:weather-and-forecast:api:local:forecastHours03#rain" }
Number:Length        localHourlyForecast3SnowVolume          "in 03 hours snow volume [%.1f %unit%]"                        <snow>        (gOWM,gOWMOutlook)  { channel="openweathermap:weather-and-forecast:api:local:forecastHours03#snow" }
//Number:Length        localHourlyForecast3GustSpeed           "in 03 hours Gust Speed Windböen[%.1f %unit%]"                 <wind>        (gOWM,gOWMOutlook)  { channel="openweathermap:weather-and-forecast:api:local:forecastHours03#wind-gust" }
Number:Dimensionless localHourlyForecast3Cloudiness          "in 03 hours cloudiness [%d %unit%]"                           <cloudiness>  (gOWM,gOWMOutlook)  { channel="openweathermap:weather-and-forecast:api:local:forecastHours03#cloudiness" }
String               localHourlyForecast3ConditionId         "Condition ID [%s]"                                            <pic600>      (gOWM,gOWMOutlook)  { channel="openweathermap:weather-and-forecast:api:local:forecastHours03#condition-id" }
Number               owm_localHourlyForecast3Windchill       "in 03 hours Windchill [%.1f °C]"                              <windchill1>  (gOWM,gOWMOutlook)  // Value calculated via Rule "Windchill_Calculate"
String               localHourlyForecast3Dummy               "---------------------------------------"                      <clouds>      (gOWM)


DateTime             localHourlyForecast6Timestamp           "Timestamp in 06 hours [%1$ta, %1$ty-%1$tm-%1$td %1$tH:%1$tM]" <time>        (gOWM)              { channel="openweathermap:weather-and-forecast:api:local:forecastHours06#time-stamp" }
Image                localHourlyForecast6ConditionIcon       "Icon"                                                                       (gOWM)              { channel="openweathermap:weather-and-forecast:api:local:forecastHours06#icon" }
Number:Temperature   localHourlyForecast6Temperature         "Temperature in 06 hours [%.1f %unit%]"                        <temperature> (gOWM)              { channel="openweathermap:weather-and-forecast:api:local:forecastHours06#temperature" }
String               localHourlyForecast6Condition           "Condition in 06 hours [%s]"                                   <pic600>      (gOWM)              { channel="openweathermap:weather-and-forecast:api:local:forecastHours06#condition" }
Number:Pressure      localHourlyForecast6Pressure            "in 06 hours barometric pressure [%.1f %unit%]"                <pressure>    (gOWM)              { channel="openweathermap:weather-and-forecast:api:local:forecastHours06#pressure" }
Number:Dimensionless localHourlyForecast6Humidity            "in 06 hours atmospheric humidity [%d %unit%]"                 <humidity>    (gOWM)              { channel="openweathermap:weather-and-forecast:api:local:forecastHours06#humidity" }
Number:Speed         localHourlyForecast6WindSpeed           "in 06 hours wind speed [%.1f km/h]"                           <wind>        (gOWM)              { channel="openweathermap:weather-and-forecast:api:local:forecastHours06#wind-speed" }
Number:Angle         localHourlyForecast6WindDirection       "in 06 hours wind direction [%d %unit%]"                       <wind>        (gOWM)              { channel="openweathermap:weather-and-forecast:api:local:forecastHours06#wind-direction" }
Number:Length        localHourlyForecast6RainVolume          "in 06 hours rain volume [%.1f %unit%]"                        <rain>        (gOWM)              { channel="openweathermap:weather-and-forecast:api:local:forecastHours06#rain" }
Number:Length        localHourlyForecast6SnowVolume          "in 06 hours snow volume [%.1f %unit%]"                        <snow>        (gOWM)              { channel="openweathermap:weather-and-forecast:api:local:forecastHours06#snow" }
//Number:Length        localHourlyForecast6GustSpeed           "in 06 hours Gust Speed Windböen[%.1f %unit%]"                 <wind>        (gOWM)              { channel="openweathermap:weather-and-forecast:api:local:forecastHours06#wind-gust" }
Number:Dimensionless localHourlyForecast6Cloudiness          "in 06 hours cloudiness [%d %unit%]"                           <cloudiness>  (gOWM)              { channel="openweathermap:weather-and-forecast:api:local:forecastHours06#cloudiness" }
String               localHourlyForecast6ConditionId         "Condition ID [%s]"                                            <pic600>      (gOWM)              { channel="openweathermap:weather-and-forecast:api:local:forecastHours06#condition-id" }
//String               localHourlyForecast6Dummy               "---------------------------------------"                      <clouds>      (gOWM)

DateTime.....     
Den kompletten Items-File hänge ich mal als Anhang dran.

Ausgehend von der aktuellen Messung (localLastMeasurement), ermittle ich zunächst das Datum für aktuell bis Tag 5 als Vergleichswert mit dem Zeitstempel der jeweiligen Messgruppe ( z.B. localHourlyForecast3Timestamp bzw. GenericItem tempItemTimestamp) um die zugehörigen Items bzw. deren Werte zuordnen zu können. Das sieht dann so aus:

Code: Alles auswählen

   var day0 = new DateTime(localLastMeasurement.state.toString).toString("yyMMdd")
   var day1 = new DateTime(localLastMeasurement.state.toString).plusDays(1).toString("yyMMdd")
   var day2 = new DateTime(localLastMeasurement.state.toString).plusDays(2).toString("yyMMdd")
   var day3 = new DateTime(localLastMeasurement.state.toString).plusDays(3).toString("yyMMdd")
   var day4 = new DateTime(localLastMeasurement.state.toString).plusDays(4).toString("yyMMdd")
   var day5 = new DateTime(localLastMeasurement.state.toString).plusDays(5).toString("yyMMdd")
Das ist die Basis für die Zuordnung in den sechs "If-Bedingungen", die ich oben ansatzweise skizziert habe. Diese laufen innerhalb einer "while-Schleife", mit der ich die jeweiligen Items dynamisch/generisch ermittle. Das sieht dann so aus:

Code: Alles auswählen

  val imin = 0
  val imax =120
  
  while ((itemindex >=imin) && (itemindex <=imax))     //  ++++ Reduce itemindex for testing, when working it is 120 (imax) or less as in Thing-Parameter --> forecastHours=xxx <-- ++++
  {
   //++++ Pointer-adresses for the dynamically generated items to get corresponding/generic item                           ***thx to @5iver and @rlkoshak for help***
   var GenericItem tempItemTimestamp = ScriptServiceUtil.getItemRegistry.getItem("localHourlyForecast"+itemindex+"Timestamp") as  GenericItem  // ***thx to @5iver ***
   var GenericItem tempItemTemperature = ScriptServiceUtil.getItemRegistry.getItem("localHourlyForecast"+itemindex+"Temperature") as  GenericItem  // ***thx to @5iver ***
   var GenericItem tempItemRainVolume = ScriptServiceUtil.getItemRegistry.getItem("localHourlyForecast"+itemindex+"RainVolume") as  GenericItem  // ***thx to @5iver ***
   var GenericItem tempItemSnowVolume = ScriptServiceUtil.getItemRegistry.getItem("localHourlyForecast"+itemindex+"SnowVolume") as  GenericItem  // ***thx to @5iver ***
   if (tempItemTimestamp.state != NULL && itemindex <=imax) {
   
     tmp_timestamp = new DateTime(tempItemTimestamp.state.toString).toString("yyMMdd") // create temporarily timestamp as needed -yyMMdd-
     //------------------------------------------------------------------------------------------------------------------------------------------------------------------------
     //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
     //++++++++++++++++++++++++++++                 Day 0               ++++++++++++++++++++++++++++++++++++++++++++++++++
     //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
     if (day0 == tmp_timestamp)
     { ........
Wenn die While-Schleife (und in ihr die If-Bedingungen) beendet ist, werden die ermittelten Werte noch ein bisschen weiterbearbeitet und für die Ausgabe aufbereitet.

Nun habe ich gedacht, ob man die in der While-Schleife laufenden If-Bedingungen optimieren kann, da der Ablauf immer der gleiche ist. Der Unterschied sind die verwendeten Variablen (day0 - day6).

In der While-Schleife ermittle ich den tatsächlichen Item-Namen über "GenericItem ". Gibt es so etwas auch für Variablen, oder geht das vielleicht über eine Lambda-Funktion (hört sich gut an, hab aber überhaupt keinen Plan wie das gehen könnte :?: ).

So jetzt hab ich aber genug erzählt. Vielleicht fällt dir ja doch was ein. Wenn nicht, auch kein Problem.

Danke und Gruss - Peter
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

Benutzeravatar
udo1toni
Beiträge: 15247
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Optimierung OWM-Rule - Berechnung Tagesgesamtwerte

Beitrag von udo1toni »

peter-pan hat geschrieben: 8. Mär 2019 12:37 ich hoffe ich habe dich nicht um deinen Schlaf gebracht, dass du mir um diese Uhrzeit noch (schon) antwortest :o .
Nein, ich bin Schichtdienstler :) und um die Uhrzeit bewache ich vor allem diverse Monitore, da kann man sich nebenher auch noch mit anderen Dingen beschäftigen...

Nun wird mir das Problem etwas klarer. Die Daten sind Vorhersagen und dementsprechend nicht fix. Die berechneten Werte sollen aber immer im Zeitfenster 0 bis 24 Uhr betrachtet werden, weshalb man jeweils andere Gruppen der Items betrachten muss, soweit korrekt?
Ich könnte mir vorstellen, dass man die Items alle gruppiert (also z.B. alle NiederschlagsvorhersageItems) und den Namen der Items geschickt wählt. Aus der Uhrzeit kann man bestimmen, wie die Items heißen müssen. z.B. um 23 Uhr wären die relevanten Daten für den nächsten Tag in 000, 003, 006, 009, 012, 015, 018 und 021. Um 20 Uhr wären sie in 003, 006, 009, 012, 015, 018, 021 und 024. und so weiter.
Man müsste also eine map aufbauen, in der diese Werte drin stehen. Dann könnte man mittels groupItem.members.filter[i|i.name.contains(map[])] alle zusammen gehörenden items in eine Liste legen, die man wiederum durchlaufen kann, um Summen und Durchschnitt zu bilden.

Geistesblitz:
(now.getHourOfDay / 3).intValue sollte alle drei Stunden um eins wachsen (von 0 bis 7)
Dann ziehen wir von 7 diesen Wert ab.
Jetzt können wir mit einem einfachen Index arbeiten, also einfach die drei-Stunden-Abschnitte von 0 bis 39 durchnummerieren.
Die Itemnamen müssten dann etwas angepasst werden, z.B.:
localRainVolume_00 bis localRainVolume_39
Der Filter sähe dann so aus:

Code: Alles auswählen

val tag0 = 7 - (now.getHourOfDay / 3).intValue 
myItemList = rainGroup.members.filter[ i|Integer.parseInt(i.name.split("_").get(1)) >= tag0 && Integer.parseInt(i.name.split("_").get(1)) < tag0 + 8 ]
Diese Gruppe beinhaltet also alle Vorhersagen für morgen. Nun kann man mit

Code: Alles auswählen

sum = 0
myItemList.forEach[g|sum = sum + (g.state as Number)]
avg = sum / myItemList.size
Summe und Durchschnitt bilden.

Von dort aus sollte es auch relativ "einfach" sein, drum herum den Wertebereich iterativ zu verschieben (jeweils + 8) und die Ergebnisse auf Grundlage der Verschiebung in die einzelnen Tage zu packen.
Die Codeschnipsel sind allerdings erst mal nur eine grobe Idee.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
udo1toni
Beiträge: 15247
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Optimierung OWM-Rule - Berechnung Tagesgesamtwerte

Beitrag von udo1toni »

Genau genommen müsste man nicht mal die Indexnummern ändern, wichtig ist nur, dass der Bereich korrekt bestimmt wird
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
peter-pan
Beiträge: 2758
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

Re: Optimierung OWM-Rule - Berechnung Tagesgesamtwerte

Beitrag von peter-pan »

Hallo Udo,
Danke für deine Tipps, aber die muss ich erst mal etwas verinnerlichen ( bin ja Amateuer). So ähnlich wie du es beschrieben hast gehe ich auch schon vor (in der while-Schleife), wobei ich allerdings nicht ganz so genau die Tageszeit, sondern nur den Tag (bin schon froh, dass ich überhaupt so weit gekommen bin) als solches vergleiche und dann das zugehörige indizierte(var itemindex) Item (Temp, Schnee, Regen) in das entsprechende Summenfeld (If-Clause 0 -5) für diesen Tag.

Muss aber jetzt mit meiner "bessere Hälfte" einkaufen gehen, deshalb "darf" ich nicht mehr mit meinem RasPi spielen. Ich melde mich wieder.

Gruss - Peter

P.S.: ich bin ja als Schwabe grundsätzlich nicht neugierig :lol: , aber arbeitest du in einem Rechenzentrum, oder womöglich bei der ESA ? (Musst du natürlich nicht beantworten)
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

Antworten