OH3 Soll und Istwert vergleich liefert falsches Ergebnis

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
JensR
Beiträge: 3
Registriert: 13. Dez 2021 15:44
Answers: 0

OH3 Soll und Istwert vergleich liefert falsches Ergebnis

Beitrag von JensR »

Hallo, ich beschäftige mich nach längerer Pause wieder mit OH jetzt in Version 3.1.0 und wollte zum üben eine einfache Regel, zum einschalten eines Ventilators, beim überschreiten eines Sollwertes schreiben.
Nach recherchen im Internet habe ich dann angefangen diese zu schreiben und zu testen, leider komme ich aber nie zu dem erhofften Ergebnis. Ich vergleiche die Ist Temperatur eines Wandthermostaten mit einem von mir angelegten Sollwert, wird dieser überschritten, soll ein Ventilator angehen. Allerding liefert der Vergleich immer das falsche Ergebnis. Ich habe daraufhin diverse Möglichkeiten getestet, immer mit dem selben Ergebnis das der If-Zweig mit Temperatur grösser als Sollwert ausgelöst wird, obwohl die Ist Temperaur niedriger ist.
Mittlerweile sehe ich den Wald vor lauter Bäumen nicht mehr und hoffe jemand im Forum kann mir die Augen öffnen was ich falsch mache.

x.items

Code: Alles auswählen

Number itemVar_SetP_Ventilator 
x.rules

Code: Alles auswählen

rule "Test Ventilator"
when
	Time cron "0 0/1 * * * ?" // jede min. prüfen
then
	var Number SetP_Ventilator = 30 // initialisieren
	if (itemVar_SetP_Ventilator.state == NULL){ // Nur zuweisen wenn kein gültiger Wert vorliegt
		itemVar_SetP_Ventilator.postUpdate(23.0) 
		logInfo("Rule Info","Setpoint Variable Ventilator zugewiesen")
	}
	if(HMIP_WT_01_Actual_Temperatur.state instanceof Number && itemVar_SetP_Ventilator.state instanceof Number){ 
		temp_Thermostat = HMIP_WT_01_Actual_Temperatur.state as Number
		SetP_Ventilator = itemVar_SetP_Ventilator.state as Number			
		logInfo("Rule Info","Temperatur: " + temp_Thermostat + "")
		
		if(temp_Thermostat > SetP_Ventilator){    //Funktioniert nicht
			logInfo("Rule Info","Ventilator Automatik Ein, Temperatur > "+ SetP_Ventilator + "°C")
		}
		else{	
			logInfo("Rule Info","Ventilator Automatik Aus, Temperatur < "+ SetP_Ventilator + "°C")	
		}
	}
end
Ebenso habe ich folgende IF-Anweisungen getestet, immer mit dem selben Resultat wie oben beschrieben.

Code: Alles auswählen

	
	if((HMIP_WT_01_Actual_Temperatur.state as Number) > (itemVar_SetP_Ventilator.state as Number)){
        if(temp_Thermostat > (itemVar_SetP_Ventilator.state as Number)){        
        if(temp_Thermostat > 25.0){
        if((HMIP_WT_01_Actual_Temperatur.state as Number) > 25.0){
Auszug aus OH Log
OH Log.JPG
Viele Grüße
Jens
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

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

Re: OH3 Soll und Istwert vergleich liefert falsches Ergebnis

Beitrag von udo1toni »

Willkommen im Forum!

Erst mal ist der Trigger Deiner Rule suboptimal. Warum willst Du die Rule zyklisch ausführen, wo es doch reicht, bei Wertänderung zu triggern?
Dann hast Du die Variable temp_Thermostat nicht korrekt initialisiert. Oder hast Du die global definiert?

Dein eigentliches Problem ist, dass das Item HMIP_WT_01_Actual_Temperatur nicht vom Typ Number, sondern vom Typ Number:Temperature ist. Man kann das im Log erkennen, dort steht hinten °C als Einheit dran, obwohl dies in Deinem Log-Befehl nicht auftaucht. die Einheit ist tatsächlich Bestandteil des Status, und 5 ist eben nicht gleich 5 °C, genauso ist 6 nicht kleiner 7 °C. Der Vergleich wird also entweder immer als wahr ausgelegt, oder immer als falsch.

Hier mal mein Vorschlag einer Rule:

Code: Alles auswählen

rule "Test Ventilator"
when
    Item itemVar_SetP_Ventilator changed or
    Item HMIP_WT_01_Actual_Temperatur changed
then
    var Number nTempSet = 23                                                // Initialwert setzen
    if(itemVar_SetP_Ventilator.state instanceof Number)                     // Falls Set Zahl liefert
        nTempSet = itemVar_SetP_Ventilator.state as Number                  // Wert übernehmen

    var Number nTempIs  = nTempSet - 1                                      // Initialwert setzen
    if(HMIP_WT_01_Actual_Temperatur.state instanceof Number)                // Falls Is Zahl liefert
        nTempIs = (HMIP_WT_01_Actual_Temperatur.state as Number).floatValue // Wert übernehmen

    var sSoll = OFF                                                         // Schaltstellung default OFF
    if(nTempIs > nTempSet)                                                  // Falls Temperatur überschritten
        sSoll = ON                                                          // Schaltstellung ON

    if(Ventilator.state != sSoll)                                           // Falls Zustand abweicht
        Ventilator.sendCommand(sSoll.toString)                              // Ventilator schalten

    logInfo("Rule Info","Ventilator Automatik {}, Temperatur {} {} °C",sSoll,if(sSoll == ON)">" else "<" , SetP_Ventilator)
end
Das Wichtigste dabei ist eine Struktur.
Die Rule wird bei Wertänderung getriggert (sowohl, wenn sich der Grenzwert ändert als auch, wenn sich die Raumtemperatur ändert).
Die Rule initialisiert die erste Variable mit dem Default Wert. Falls das Set-Item eine gültige Zahl enthält, wird der Default überschrieben.
Für die Ist-Temperatur geschieht das gleiche, hier wird als Default ein Wert angenommen, der unter dem Grenzwert liegt. Falls ein gültiger Messwert vorliegt, wird der Wert überschrieben, wobei durch die explizite Wandlung nach Float die Einheit abgeschnitten wird.
Nun wird die Schaltstellung in eine Variable geschrieben, gleiches Prinzip. Ist der Vergleich wahr (Ist-Temperatur über dem Grenzwert) wird die Sollstellung getauscht.
Danach wird die aktuelle Schaltstellung mit dem Soll verglichen und bei Bedarf angepasst. Du willst ja nicht ständig den ON-Befehl sehen, obwohl der Ventilator schon läuft.
Zuletzt wird noch die log-Meldung ausgegeben, wobei die Anzeige dynamisch angepasst wird, so braucht es nur einen Log-Befehl.
Hättest Du in Deiner Rule die Status beider Items einfach gemeinsam geloggt, und zwar in exakt gleicher Form, wäre Dir der Unterschied (einmal mit Einheit, einmal ohne Einheit) eventuell selbst aufgefallen...
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

JensR
Beiträge: 3
Registriert: 13. Dez 2021 15:44
Answers: 0

Re: OH3 Soll und Istwert vergleich liefert falsches Ergebnis

Beitrag von JensR »

Danke für die schnelle Antwort, das hat mir tatsächlich die Augen geöffnet, das die Einheit °C Bestandteil des Status ist und das Item HMIP_WT_01_Actual_Temperatur somit vom Typ Number:Temperature ist, hatte ich überhaupt nicht in betracht gezogen.
Erst mal ist der Trigger Deiner Rule suboptimal. Warum willst Du die Rule zyklisch ausführen, wo es doch reicht, bei Wertänderung zu triggern?
Den Trigger habe ich nur zu Testzwecken zyklisch gewählt, dies wird auf jeden Fall so geändert so wie Du es vorschlägst, hier ging es mir nur um die generelle Funktion.
Dann hast Du die Variable temp_Thermostat nicht korrekt initialisiert. Oder hast Du die global definiert?
Die Variable ist tatsächlich Global im Header definiert und initialisiert, auch die Variable SetP_Ventilator hatte ich ursprüglich Global definiert, diese aber in die Rule genommen, damit diese erkennbar ist für die Analyse.
Ich werde mir deinen Vorschlag zur Rule morgen mal genauer anschauen und bei mir testen und dann ein Feedback dazu geben.

Vielen Dank und Gruß
Jens

JensR
Beiträge: 3
Registriert: 13. Dez 2021 15:44
Answers: 0

Re: OH3 Soll und Istwert vergleich liefert falsches Ergebnis

Beitrag von JensR »

Ich habe heute den Vorschlag in meine Rule übernommen, jetzt klappt es tadelos, ebenso finde ich den Aufbau auch besser als in meiner ursprünlichen Version. Heute habe ich auch noch einen Beitrag gefunden, in dem es genau um diese Problematik geht (Item Werte in Rules auslesen). Hätte ich diesen schon vorher gefunden, wäre es mir sicherlich klar gewesen.
Danke nochmals für die Hilfe.

Gruß
Jens

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

Re: OH3 Soll und Istwert vergleich liefert falsches Ergebnis

Beitrag von udo1toni »

Gerne :)
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Antworten