Seite 1 von 1

Schwellenwert definieren - previousState bringt nur aktuellen Wert

Verfasst: 7. Apr 2021 20:32
von canstar
Hi,

ich möchte gerne das überschreiten eines bestimmten Sonnenwinkels (Azimut) als Auslöser nutzen, allerdings hapert es noch an irgendetwas.
Und zwar möchte ich generell die Rollladen (smart über shelly) beim Überschreiten eines gewissen Sonnenstandes fahren lassen. Sprich es soll nicht bei jeder Winkeländerung auslösen, um eventuell manuelle Eingriffe nicht wieder zu "überschreiben".
Das ganze soll mit DSL Rules gelöst werden, da ich mich damit bisher am sichersten fühle.
Deshalb wollte ich es wie folgt machen:

Code: Alles auswählen

if( Sonnendaten_Azimut.previousState.state < 262 |° && Sonnendaten_Azimut.getState() >= 262 |°   
  )  {  rollo_Steuerung0offen100geschlossen.sendCommand(100)   }
Das Problem scheint mir nun aber darin zu liegen, dass previousState.state nur den aktuellen Wert liefert. Überprüft hab ich das mit

Code: Alles auswählen

logInfo("TEST ", "previous state was  " + Sonnendaten_Azimut.previousState.state)
was mir im Log folgendes liefert:

Code: Alles auswählen

[INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Sonnendaten_Azimut' changed from 261.9764096540953 ° to 262.96264910274374 °
[INFO ] [org.openhab.core.model.script.TEST  ] - previous state was  262.96264910274374 °
Auch ein vorgeschaltener Timer von 1 Minute bringt nichts. Sinn des Timers sollte sein, eine etwaige Verzögerung zwischen Änderung des Wertes und der Verfügbarkeit des alten Wertes in der Persistance zu umgehen.

Also mein derzeitiger Code sieht so aus:

Code: Alles auswählen

createTimer(now.plusMinutes(1),[|

logInfo("TEST ", "previous state was  " + Sonnendaten_Azimut.previousState.state)

if( 
    Sonnendaten_Azimut.previousState.state < 262 |° && Sonnendaten_Azimut.getState() >= 262 |°   //das überschreiten der schwelle klappt noch nicht
  )  {
      rollo_Steuerung0offen100geschlossen.sendCommand(100)
     }
                                ])
Bezüglich der persitence habe ich nichts geändert oder erstellt, ich gehe davon aus, dass diese by default als rrd4j bewerkstelligt werden sollte, zumal eine Sonnendaten_Azimut.rrd vorhanden ist und Graphen für den Wert verfügbar sind.

Kann mir bitte jemand einen entscheidenden Hinweis geben?

Danke vorab.

P.S.: Wenn ich den Teil mit previouseState weglasse, dann klappt es, allerdings fährt das Rollo dann bei jeder Änderung in die Position, was ich ja gerne vermeiden möchte.

Re: Schwellenwert definieren - previousState bringt nur aktuellen Wert

Verfasst: 7. Apr 2021 22:20
von canstar
HA...ich glaub ich habs!
Ich hab previousState durch historicState(now.minusMinutes(2)).state ausgetauscht. Fraglich gerade, ob es der Unterschied von 1 zu 2 Minuten macht, oder es wirklich ein Problem mit previousState gab, aber das ist mir gerade recht Wurscht, da es funktioniert! :)

Re: Schwellenwert definieren - previousState bringt nur aktuellen Wert

Verfasst: 8. Apr 2021 00:31
von udo1toni
Für die Funktion brauchst Du gar keine Persistence, Du musst lediglich das "richtige" previousState verwenden. Du musst lediglich dafür sorgen, dass die Rule durch das richtige Item (mit changed) getriggert wird, in Deinem Fall Sonnendaten_Azimut. dann schreibst Du statt

Code: Alles auswählen

Sonnendaten_Azimut.previousState.state
einfach

Code: Alles auswählen

previousState
, das liefert den ersten Wert, der vom changed Event geloggt wird, also bei der Zeile

Code: Alles auswählen

[INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Sonnendaten_Azimut' changed from 261.9764096540953 ° to 262.96264910274374 °
wird als Wert

Code: Alles auswählen

261.9764096540953 °
geliefert.

Re: Schwellenwert definieren - previousState bringt nur aktuellen Wert

Verfasst: 8. Apr 2021 13:28
von canstar
Danke, udo1toni, das klappt auch und macht die Zeile noch etwas kürzer. Und gibt mir auf alle Fälle an die Hand, wie ich die Abfrage korrekt nutze.