Seite 1 von 1

Mit Rule ein Number Item ändern

Verfasst: 21. Mai 2022 11:32
von Maggi
Hi zusammen,

ich habe eine Rule gebastelt, welche mir einen Wert im Number Item verändert. Im log sieht es auch richtig aus und der Wert ändert sich.
Aber in der Sitemap ändert sich der Wert nur beim Browser refresh. Wie kann ich das ändern, damit sich der Wert live im Browser ändert?
Weder postUpdate noch sendCommand macht da einen unterschied.

Code: Alles auswählen

var test = 0

rule "Gesamtwert + Last"

when
	Item GESWatt changed
	
then
	var Number Lastwert = if(Lastwert.state instanceof Number) (Lastwert.state as Number) else 0
	var Number GESWatt = if(GESWatt.state instanceof Number) (GESWatt.state as Number) else 0
	if(Last1.state == ON) {
	  (test = GESWatt + Lastwert)
	  }
	else {
	  (test = GESWatt)
	  }
	GesLastwert.postUpdate(test)
	GesLastwert.sendCommand(test)

end

Re: Mit Rule ein Number Item ändern

Verfasst: 21. Mai 2022 12:39
von udo1toni
An welcher Stelle schaust Du? Welche Version von openHAB läuft?

Grundsätzlich ist die Rule prima, allerdings etwas umständlich :)

Code: Alles auswählen

rule "Gesamtwert + Last"
when
    Item GESWatt changed
then
    val Number nLast = if(Lastwert.state instanceof Number) (Lastwert.state as Number) else 0
    var Number  nErg = if( GESWatt.state instanceof Number) ( GESWatt.state as Number) else 0
    if(Last1.state == ON)
        nErg = nErg + nLast
    GesLastwert.postUpdate(test)
end
Natürlich vorausgesetzt, Du willst nicht zusätzlich noch andere Dinge mit den Werten anstellen :) Der Punkt ist aber, dass nErg der Anteil ist, der ohnehin eingetragen werden soll. Also kann man den Wert auch ebenso gut direkt in der Variablen speichern.
Der Anteil nLast muss nur hinzugezählt werden, falls der Schalter auf ON steht.
Beachte auch, dass nLast als val definiert ist, während nErg als var definiert ist. val ist eine Konstante, var ist eine Variable. Da nLast nach der Definition nicht mehr verändert wird, reicht es, eine Konstante zu erzeugen (das spart Rechenzeit).

sendCommand() sendet einen Befehl. Du möchtest aber den Status des Items beeinflussen, das geschieht mit postUpdate().
openHAB versucht allerdings, den wahrscheinlichen Status eines Items anhand des gesendeten Befehls zu "erraten", was letztlich bedeutet, dass ein sendCommand() als Normalverhalten ein postUpdate() mit passendem Wert nach sich zieht. Bei Number Items ist das gewöhnlich exakt der gleiche Wert, z.B. ein Dimmer Item kennt aber die Befehle ON und OFF, welche jedoch nicht zum Status ON oder OFF führen, sondern zum Status 100 bzw. 0. Wenn Du versuchst, per postUpdate(ON) in einen Dimmer zu schreiben, sollte es eine Fehlermeldung geben (kann aber sein, dass sie abgefangen wird...), weil der Dimmer diesen Status nicht annehmen kann. Bei vielen modernen Dimmern kann man auch ein Einschaltlevel < 100 definieren, so dass ein sendCommand(ON) nicht zum Status 100 führt. Mindestens in diesen Fällen ist es dann besser, die Funktion autoupdate zu deaktivieren, da man sonst ständig falsche Statusmeldungen bekommt - und wenn es doof läuft, hat der Dimmer schon vorher seinen neuen Status gesendet, so dass openHAB anschließend den richtigen mit dem falschen Wert überschreibt.
Die Formatierung ist nur meine Macke ;)

Gewöhnlich sollte ein postUpdate() unmittelbar eine Änderung der Anzeige zur Folge haben, aber es gibt verschiedene Situationen, in denen das nicht der Fall ist, z.B. wenn etwas an der Sitemap geändert wurde, muss openHAB neu gestartet werden, damit der Refresh der Sitemap wieder funktioniert.

Re: Mit Rule ein Number Item ändern

Verfasst: 23. Mai 2022 17:16
von Maggi
Hat geklappt,

die vereinfachte Rule gefällt mir gut. Wahrscheinlich könnten einige von meinen Rules einfacher gemacht werden. Aber da habe ich leider nicht genug Praxiserfahrung.
Nach Neustart von Openhab, wurde der Wert auch im Browser live geändert.