Seite 1 von 1

OH2 to OH3, previousState und newState

Verfasst: 17. Mär 2021 17:55
von nojo
Hallo,

ich hab nun auch den Schritt gewagt und mein Haussteuerung von OH2 auf OH3 geändert. Soweit läuft das neue System ausser die Aktivierung der Klimaanlage funktioniert nicht. hab auch gelesen dass es den OH2 Trigger im OH3 nicht mehr gibt, triggeringItem.name soll statt previousState und newState genommen werden. stimmt das oder hab ich hier was falsches gelesen?
wenn es stimmt, wie kann ich diesen neuen Trigger in den unterm Code einbauen, irgendwie versteh ich es nicht.

Danke

Code: Alles auswählen

val telegramAction = getActions("telegram","telegram:telegramBot:2da85xxxxxx")
var Timer fronius_power_low_stiege = null
var Timer fronius_power_high_stiege = null
var Timer fronius_power_high_3000_stiege = null
var Timer setfan_stiegenhaus = null
var Timer settemp_stiegenhaus = null
var Timer klimaanlage_stiegenhaus_timer = null
var Timer fronius_power_grid_stiege = null
var Timer fronius_power_grid_stiege_vorwarnung = null


rule "Regelung_Klimaanlage_Stiegenhaus"
when
    Item FroniusSymoInverter_ACPower changed
then
    if(!(previousState instanceof Number)) {
        logWarn("stromverkauf_stiege","previousState keine gültige Zahl! ({})",previousState)
        return;
    }
    if(!(newState instanceof Number)) {
        logWarn("stromverkauf_stiege","newState keine gültige Zahl! ({})",newState)
        return;
    }
    if(previousState <= 2500 && newState > 2500) {
        fronius_power_high_stiege?.cancel
        fronius_power_high_stiege = createTimer(now.plusMinutes(5), [|
            if(DaikinACUnit19216817859_Power.state == OFF && Winterbetriebautomatik.state == ON && Winterbetriebstiegenhaus.state == ON){
                telegramAction.sendTelegram("%.6s W wird seit 5min produziert, Klima Stiegenhaus wird eingeschaltet", FroniusSymoInverter_ACPower.state.toString)
                fronius_power_high_stiege = null
                DaikinACUnit19216817859_Power.sendCommand("ON")
                DaikinACUnit19216817859_Mode.sendCommand("HEAT")
                DaikinACUnit19216817859_HomekitMode.sendCommand("HEAT")
                DaikinACUnit19216817859_SetPoint.sendCommand("22")
                DaikinACUnit19216817859_Fan.sendCommand("SILENCE")
            }
        ])
    }
    if(previousState >= 2200 && newState < 2200) {
        fronius_power_high_stiege?.cancel
    }
    if(previousState >= 1000 && newState < 1000) {
        fronius_power_low_stiege?.cancel
        fronius_power_low_stiege = createTimer(now.plusMinutes(10), [|
            if(DaikinACUnit19216817859_Power.state == ON && Winterbetriebautomatik.state == ON && Winterbetriebstiegenhaus.state == ON){
                telegramAction.sendTelegram("PV Leistung ist seit 10 Minuten unter 1000W, Stiegenhaus wird ausgeschaltet")
                DaikinACUnit19216817859_Power.sendCommand("OFF")
				fronius_power_low_stiege = null
            }
        ])
    }
    if(previousState <= 1100 && newState > 1100) {
        fronius_power_low_stiege?.cancel
    }

end

Re: OH2 to OH3, previousState und newState

Verfasst: 17. Mär 2021 23:37
von udo1toni
nojo hat geschrieben: 17. Mär 2021 17:55ich hab nun auch den Schritt gewagt und mein Haussteuerung von OH2 auf OH3 geändert. Soweit läuft das neue System ausser die Aktivierung der Klimaanlage funktioniert nicht. hab auch gelesen dass es den OH2 Trigger im OH3 nicht mehr gibt, triggeringItem.name soll statt previousState und newState genommen werden. stimmt das oder hab ich hier was falsches gelesen?
wenn es stimmt, wie kann ich diesen neuen Trigger in den unterm Code einbauen, irgendwie versteh ich es nicht.
Da hast Du ein paar Dinge durcheinander geworfen.

Erst mal sind keine Trigger entfernt worden. Wenn man allerdings innerhalb einer Rule feststellen möchte, welches Item die Rule getriggert hat, so kann man nicht mehr einfach die implizite Variable triggeringItem verwenden. Diese Variable wird nur noch dann verwendet, wenn der Trigger der Rule Member of ... lautet, also z.B. Member of myGroupItem changed. Nur dann ist triggeringItem innerhalb der Rule der Stellvertreter des Items, welches die Rule getriggert hat. Nutzt man hingegen ein Item bzw. mehrere einzelne Items als Trigger, so kann man lediglich über die neue implizite Variable triggeringItemName den Namen abrufen, aber nicht indirekt auf das Item zugreifen.

Die anderen beiden impliziten Variablen previousState und newState stehen nur in Rules zur Verfügung, die mit einem Item oder Member of ... changed getriggert haben. (Darüber kann man auch innerhalb einer Rule unterschiedliche Trigger unterscheiden, wenn z.B. ein Trigger auf reveiced command lautet, ein anderer auf changed und noch einer auf Time cron) Dies hat sich überhaupt nicht gegenüber OH2.5 geändert. newState ist in der späteren Phase von OH2.5 hinzugekommen, keine Ahnung wann genau...

Es wäre jetzt die Frage, wie (exakt!) das Item FroniusSymoInverter_ACPower definiert ist. Kann es sein, dass es ein Item vom Typ Number:Power ist? dann müssten beide Variablen jeweils anders verglichen werden, es muss dann UoM berücksichtigt werden.

Da Du openHAB3 einsetzt, musst Du für die Timer statt now.plusMinutes() jeweils ZonedDateTime.now.plusMinutes() verwenden.

Das Item DaikinACUnit19216817859_Power ist vermutlich ein Switch Item. Dann könntest Du die Anführungszeichen beim sendCommand() weg lassen (sie sollten aber auch nicht weiter stören).

Ansonsten erscheint mir die Rule unverdächtig.

Re: OH2 to OH3, previousState und newState

Verfasst: 18. Mär 2021 08:20
von nojo
Hi Udo,

zuerst vielen Dank für die schnelle Antwort.
udo1toni hat geschrieben: 17. Mär 2021 23:37 Es wäre jetzt die Frage, wie (exakt!) das Item FroniusSymoInverter_ACPower definiert ist. Kann es sein, dass es ein Item vom Typ Number:Power ist? dann müssten beide Variablen jeweils anders verglichen werden, es muss dann UoM berücksichtigt werden.
hier das Item FroniusSymoInverter_ACPower.
FroniusPower.jpg
https://prnt.sc/10otvk1
udo1toni hat geschrieben: 17. Mär 2021 23:37 Da Du openHAB3 einsetzt, musst Du für die Timer statt now.plusMinutes() jeweils ZonedDateTime.now.plusMinutes() verwenden.
okay, dann werde ich die Zeile

Code: Alles auswählen

fronius_power_high_stiege = createTimer(now.plusMinutes(5),
auf

Code: Alles auswählen

fronius_power_high_stiege = createTimer(ZonedDateTime.now.plusMinutes(5), [|
ändern.

udo1toni hat geschrieben: 17. Mär 2021 23:37 Das Item DaikinACUnit19216817859_Power ist vermutlich ein Switch Item. Dann könntest Du die Anführungszeichen beim sendCommand() weg lassen (sie sollten aber auch nicht weiter stören).
ja, DaikinACUnit19216817859_Power ist ein Switch.

danke

Re: OH2 to OH3, previousState und newState

Verfasst: 18. Mär 2021 14:56
von udo1toni
Da Du previousState und newState ja mehrfach verwendest, diese aber im Zweifel vermutlich einheitenbehaftet sind, wäre es das Einfachste, stattdessen zwei lokale Konstanten zu verwenden. Also im Anschluss an die Prüfung auf instanceof Number (vor dem ersten Vergleich der beiden Werte) die zwei Zeilen

Code: Alles auswählen

val nOld = (previousState as Number).floatValue
nNew = (newState as Number).floatValue
und danach innnerhalb der Rule jedes Vorkommen der beiden impliziten Variablen durch die neuen lokalen Konstanten ersetzen, also z.B.

Code: Alles auswählen

if(nOld <= 2500 && nNew > 2500) {

Re: OH2 to OH3, previousState und newState

Verfasst: 18. Mär 2021 17:26
von nojo
danke Udo, ich hab den Code nun geändert und werde morgen die Software testen.
danke

Code: Alles auswählen

val telegramAction = getActions("telegram","telegram:telegramBot:2da85be48e")
var Timer fronius_power_low_stiege = null
var Timer fronius_power_high_stiege = null
var Timer fronius_power_high_3000_stiege = null
var Timer setfan_stiegenhaus = null
var Timer settemp_stiegenhaus = null
var Timer klimaanlage_stiegenhaus_timer = null
var Timer fronius_power_grid_stiege = null
var Timer fronius_power_grid_stiege_vorwarnung = null


rule "Regelung_Klimaanlage_Stiegenhaus"
when
    Item FroniusSymoInverter_ACPower changed
then
    if(!(previousState instanceof Number)) {
        logWarn("stromverkauf_stiege","previousState keine gültige Zahl! ({})",previousState)
        return;
    }
    if(!(newState instanceof Number)) {
        logWarn("stromverkauf_stiege","newState keine gültige Zahl! ({})",newState)
        return;
    }
    val ACPowerOld = (previousState as Number).floatValue
    val ACPowerNew = (newState as Number).floatValue
    if(ACPowerOld <= 2500 && ACPowerNew > 2500) {
        fronius_power_high_stiege?.cancel
        fronius_power_high_stiege = createTimer(ZonedDateTime.now.plusMinutes(5), [|
            if(DaikinACUnit19216817859_Power.state == OFF && Winterbetriebautomatik.state == ON && Winterbetriebstiegenhaus.state == ON){
                telegramAction.sendTelegram("%.6s W wird seit 5min produziert, Klima Stiegenhaus wird einschaltet", FroniusSymoInverter_ACPower.state.toString)
                fronius_power_high_stiege = null
                DaikinACUnit19216817859_Power.sendCommand("ON")
                DaikinACUnit19216817859_Mode.sendCommand("HEAT")
                DaikinACUnit19216817859_HomekitMode.sendCommand("HEAT")
                DaikinACUnit19216817859_SetPoint.sendCommand("22")
                DaikinACUnit19216817859_Fan.sendCommand("SILENCE")
            }
        ])
    }
    if(ACPowerOld >= 2200 && ACPowerNew < 2200) {
        fronius_power_high_stiege?.cancel
    }
    if(ACPowerOld >= 1000 && ACPowerNew < 1000) {
        fronius_power_low_stiege?.cancel
        fronius_power_low_stiege = createTimer(ZonedDateTime.plusMinutes(10), [|
            if(DaikinACUnit19216817859_Power.state == ON && Winterbetriebautomatik.state == ON && Winterbetriebstiegenhaus.state == ON){
                telegramAction.sendTelegram("PV Leistung ist seit 10 Minuten unter 1000W, Stiegenhaus wird ausgeschaltet")
                DaikinACUnit19216817859_Power.sendCommand("OFF")
				fronius_power_low_stiege = null
            }
        ])
    }
    if(ACPowerOld <= 1100 && ACPowerNew > 1100) {
        fronius_power_low_stiege?.cancel
    }

end

Re: OH2 to OH3, previousState und newState

Verfasst: 19. Mär 2021 08:31
von nojo
Danke Udo, die Regeln funktionieren wieder.

telegram1.jpg
PS. kaufe einpaar "ge" ;-)

Re: OH2 to OH3, previousState und newState

Verfasst: 19. Mär 2021 10:46
von udo1toni
Prima :)