Kann Fehler in Rule nicht finden

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Stefan Otten
Beiträge: 73
Registriert: 11. Nov 2018 06:51
Answers: 0

Kann Fehler in Rule nicht finden

Beitrag von Stefan Otten »

Hallo zusammen,

ich kann den Fehler in meiner Regel irgendwie nicht identifizieren.
Vielleicht weiß jemand Rat....

Code: Alles auswählen

var boolean TempReached = false
var timer = null
var StateTemp = null
var StateSoll = null

rule "Sauna Temp erreicht"
    when
    	Item Sauna_Temp changed
    then
        var StateTemp = Sauna_Temp.state as DecimalType
        var StateSoll = Sauna_Soll_Setpoint.state as DecimalType
    	if((StateTemp >= StateSoll) && (TempReached == false)){ 
            logInfo("Rule Sauna Temperatur erreicht", "gestartet")
    		sendTelegram("bot1", "Sauna: Soll Temperatur erreicht. Sauna Temp: %s °C", StateTemp)
            sendNotification("xxxx@xxxx.de", "Sauna: Soll Temperatur erreicht.")
            sendNotification("xxx@xxx.net", "Sauna: Soll Temperatur erreicht.")              
            TempReached = true
            timer = createTimer(now.plusMinutes(5)) [|
    				TempReached = false
                    timer = null
    			]
            
        }
    end
Fehler:
Ambiguous binary operation.
The operator declarations
operator_greaterEqualsThan(Type, Number) in NumberExtensions and
operator_greaterEqualsThan(Number, Number) in NumberExtensions
both match.

Der Fehler wird in der if Abfrage lokalisiert.

Danke und Grüße

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

Re: Kann Fehler in Rule nicht finden

Beitrag von udo1toni »

Du definierst vier Variablen global.
Bei der ersten Variable wäre es vermutlich geschickter, Boolean statt boolean zu nehmen (sollte auch funktionieren, erbt dann aber auch die zugehörigen Methoden)
Bei der zweiten Variablen musst Du zwingend den Typ mit angeben, nämlich Timer. Hier ist wichtig, die groß geschriebene Variante zu nehmen.
Bei der dritten und vierten Variablen böte es sich an, ebenfalls den Typ (Number) mit anzugeben. Allerdings musst Du dann bei der Zuweisung prüfen, ob der Typ auch tatsächlich vom Typ Number ist.

Innerhalb der Rule definierst Du die Variablen nochmals (Schlüsselwort var), das dürfte allein schon für eine Fehlermeldung sorgen (vielleicht ignoriert openHAB das gnädigerweise).
Wenn Du die Variablen sauber definierst, dürfte openHAB auch keine Probleme mehr haben, zu erraten, welchen Typ Du nun verwendest.

Dein boolean brauchst Du übrigens nicht, da Du ohnehin einen Timer verwendest:

Code: Alles auswählen

var Timer tSauna = null

rule "Sauna Temp erreicht"
when
    Item Sauna_Temp changed
then
    var Number StateTemp = -300
    var Number StateSoll = -300

    if(Sauna_Temp.state instanceof Number)
        StateTemp = Sauna_Temp.state as Number
    else
        logWarn("sauna","Temperaturfühler liefert keinen Wert!")

    if(Sauna_Soll_Setpoint.state instanceof Number)
        StateSoll = Sauna_Soll_Setpoint.state as Number
    else
        logWarn("sauna","Kein Sollwert gesetzt!")

    if(tSauna === null && StateTemp >0 && StateSoll > 0 && StateTemp >= StateSoll) {
        logInfo("sauna", "Sauna: Soll Temperatur erreicht. ")
        sendTelegram("bot1", "Sauna: Soll Temperatur erreicht. Sauna Temp: %s °C", StateTemp)
        sendNotification("xxxx@xxxx.de", "Sauna: Soll Temperatur erreicht.")
        sendNotification("xxx@xxx.net", "Sauna: Soll Temperatur erreicht.")
        tSauna = createTimer(now.plusMinutes(5)) [|
            tSauna = null
        ]
    }
end
Die beiden Variablen werden vermutlich nur innerhalb der Rule benötigt, es reicht also, sie innerhalb der Rule zu definieren.
tSauna ist als Name für den Timer besser als timer ;) zu groß ist die Gefahr, diesen Namen an anderer Stelle einzubauen.
Falls eines der beiden Items keine gültige Zahl enthält, wird nun eine Warnung ausgegeben, anstatt eines Errors.
Wenn beide Items Zahlen enthalten, werden sie in die Variablen übernommen. Die letzte if-Anweisung kann einfach alle Vergleiche ausführen, da beide Variablen sicher eine Zahl enthalten und tSauna nur auf null geprüft wird (die drei = sind in diesem Fall korrekt!)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Stefan Otten
Beiträge: 73
Registriert: 11. Nov 2018 06:51
Answers: 0

Re: Kann Fehler in Rule nicht finden

Beitrag von Stefan Otten »

Vielen lieben Dank für die Umfangreiche Erklärung.
Hast mir sehr weitergeholfen.

Grüße

Lasagne
Beiträge: 2
Registriert: 27. Nov 2018 14:03
Answers: 0

Re: Kann Fehler in Rule nicht finden

Beitrag von Lasagne »

Hallo Stefan,
kannst du mir kurz Infos zu dem Temperaturfühler geben, den du einsetzt (Hersteller, Anbindung)?
Suche seit längerem einen für meine Sauna.
Danke!!
(Bisher) im Einsatz:
Raspi | OH2 | KNX | HUE-Bridge | Alexa

elbombo
Beiträge: 39
Registriert: 21. Okt 2018 19:14
Answers: 0

Re: Kann Fehler in Rule nicht finden

Beitrag von elbombo »

@ Lasagne
Als Wärmefühler kannst du einen Sonoff nehmen und einen DS18B20 anbinden. Das Teil kann man problemlos über MQTT in OH2 einbinden.

Stefan Otten
Beiträge: 73
Registriert: 11. Nov 2018 06:51
Answers: 0

Re: Kann Fehler in Rule nicht finden

Beitrag von Stefan Otten »

Ich habe einen eigene Saunasteuerung über einen alten Raspi realisiert, da die schon sehr betagte original Steuerung den Geist aufgeben hat.

Der Fühler ist ein DS18B20.
Die Werte werden über MQTT an mein openHab System weitergeleitet verarbeitet und wieder zurück geschickt.
Die Lasten werden über ein Relais geschaltet.
18B20 und Relais werden über GPIO gesteuert.

Grüße

Lasagne
Beiträge: 2
Registriert: 27. Nov 2018 14:03
Answers: 0

Re: Kann Fehler in Rule nicht finden

Beitrag von Lasagne »

Danke Danke!
Habe mit euren Infos auch direkt schon eine Anleitung für meinen Raspi mit OH gefunden...
VG
(Bisher) im Einsatz:
Raspi | OH2 | KNX | HUE-Bridge | Alexa

Antworten