Seite 1 von 1

Kann Fehler in Rule nicht finden

Verfasst: 26. Nov 2018 12:37
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

Re: Kann Fehler in Rule nicht finden

Verfasst: 26. Nov 2018 18:15
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!)

Re: Kann Fehler in Rule nicht finden

Verfasst: 27. Nov 2018 00:12
von Stefan Otten
Vielen lieben Dank für die Umfangreiche Erklärung.
Hast mir sehr weitergeholfen.

Grüße

Re: Kann Fehler in Rule nicht finden

Verfasst: 27. Nov 2018 14:30
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!!

Re: Kann Fehler in Rule nicht finden

Verfasst: 27. Nov 2018 19:11
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.

Re: Kann Fehler in Rule nicht finden

Verfasst: 28. Nov 2018 00:09
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

Re: Kann Fehler in Rule nicht finden

Verfasst: 29. Nov 2018 13:53
von Lasagne
Danke Danke!
Habe mit euren Infos auch direkt schon eine Anleitung für meinen Raspi mit OH gefunden...
VG