Probleme mit OH2.5 Dimmer Rule in OH4.3

Für welche Projekte verwendet Ihr OpenHAB? Was habt Ihr automatisiert? Stellt eure Projekte hier vor.

Moderatoren: Cyrelian, seppy

Antworten
michi7744
Beiträge: 6
Registriert: 30. Nov 2021 00:44
Answers: 0

Probleme mit OH2.5 Dimmer Rule in OH4.3

Beitrag von michi7744 »

Hallo liebe Forenmitglieder,

ich hoffe auf Hilfe von Euch, da is über die Suche leider nichts passendes gefunden habe. Ich habe nach umstellung von OH2.5 auf OH4.3
mit der folgenden Rule, welche ich erfolgreich unter OH2.5 genutzt habe.

Es scheint mir, dass die Timer in OH4.3 anders konfiguriert werden müssen.

Code: Alles auswählen

var Number dimLevelMILD = 2
var Number Huelevel = 1 
val int timeoutMills = 100 
var Timer timerMILD = null
var Timer timerHue = null 

rule MIA_LEDLicht_Remote

when

Channel "deconz:switch:00212E0764E9:847127fffe593232011000:buttonevent" triggered

then

dimLevelMILD = Shellyrgbw_mia_Color_VerstRkung.state as Number
switch(receivedEvent)

{
	
case "1002": 		// ON OFF
    if  (Shellyrgbw_mia_Control_Betrieb.state == OFF)
	    { Shellyrgbw_mia_Control_Betrieb.sendCommand(ON)}
	else
	    { Shellyrgbw_mia_Control_Betrieb.sendCommand(OFF)}


case "2001": 		// dim brighter
    if (timerMILD === null) 
    {
        timerMILD = createTimer(now.plusSeconds(0), [ |   
            Shellyrgbw_mia_Color_VerstRkung.sendCommand(dimLevelMILD)
            if (dimLevelMILD > 100) dimLevelMILD = 100 
            if (dimLevelMILD == 100) {
                timerMILD = null
            } else {
                dimLevelMILD = dimLevelMILD + 2
                timerMILD.reschedule(now.plusMillis(timeoutMills)) 
            }
        ])
	}


case "2003": 		// dim stop
    {
	timerMILD?.cancel
    timerMILD = null
    }


case "3001": 		// dim darker
    if (timerMILD === null) {
        timerMILD = createTimer(now.plusSeconds(0), [ |   
            Shellyrgbw_mia_Color_VerstRkung.sendCommand(dimLevelMILD)
            if (dimLevelMILD < 2) dimLevelMILD = 2
            if (dimLevelMILD == 2) { 
                timerMILD = null 
            } else {
                dimLevelMILD = dimLevelMILD - 2
                timerMILD.reschedule(now.plusMillis(timeoutMills)) 
            }
        ])
	}


case "3003": 		// dim stop
    {
	timerMILD?.cancel
    timerMILD = null
    }

case "5001": 		// color right
    if (timerHue === null) 
    {
        timerHue = createTimer(now.plusSeconds(0), [ |   
            Shellyrgbw_mia_Color_Farbe.sendCommand(Huelevel+",100,100")
            if (Huelevel > 360) Huelevel = 360 
            if (Huelevel == 360) {
                timerHue = null
            } else {
                Huelevel = Huelevel + 2
                timerHue.reschedule(now.plusMillis(timeoutMills)) 
            }
        ])
	}


case "5003": 		// color stop
    {
	timerHue?.cancel
    timerHue = null
    }


case "4001": 		// color left
    if (timerHue === null) {
        timerHue = createTimer(now.plusSeconds(0), [ |   
            Shellyrgbw_mia_Color_Farbe.sendCommand(Huelevel+",100,100")
            if (Huelevel < 0) Huelevel = 0
            if (Huelevel == 0) { 
                timerHue = null 
            } else {
                Huelevel = Huelevel - 2
                timerHue.reschedule(now.plusMillis(timeoutMills)) 
            }
        ])
	}


case "4003": 		// color stop
    {
	timerHue?.cancel
    timerHue = null
    }

}
end


Habt Ihr eine Idee ?

Danke im Voraus.
von udo1toni » 29. Dez 2024 21:49
Ja, openHAB4 verwendet JavaTime statt Joda Time (diese Umstellung geschah schon von OH2 auf OH3).
JavaTime kennt kein plusMillis.
Möglichkeit 1: Du verwendest stattdessen .plusNanos() (natürlich mit Faktor 10^6)
Möglichkeit 2: Du verwendest .plus(timeoutMillis,java.time.temporal.ChronoUnit.MILLIS)
Du kannst auch java.time.temporal.ChronoUnit als Import vorne in die Datei schreiben und direkt ChronoUnit.MILLIS angeben, allerdings habe ich das auch schon mal angemeckert bekommen, warum auch immer...

Es wäre übrigens besser, timeoutMillis so zu definieren:

Code: Alles auswählen

val Integer timeoutMills = 100 
Der Unterschied: int erzeugt ein Primitive, Integer erzeugt ein Objekt. Das Primitive braucht extrem viel mehr Zeit zum initialisieren (etwa Faktor 50...) und es gibt nur wenige Situationen, wo Du tatsächlich auf das Primitive angewiesen bist.
Bei Variante 1 (.plusNanos()) wäre noch zu beachten, dass Du für timeoutNanos besser auf Long als Datentyp umschwenken solltest (oder alternativ als Primitive long), weil dies der erwartete Datentyp ist.

Da Du ohnehin immer nur einen der beiden Timer aktiv haben wirst, kannst Du auf den 2. vermutlich auch verzichten :)
Außerdem kann die Rule noch etwas optimiert werden:

Code: Alles auswählen

var Integer dimLevelMILD = 2
var Integer Huelevel = 1 
val Long lTimeout = 100000000
var Timer tHue = null 

rule "MIA LEDLicht Remote"
when
    Channel "deconz:switch:00212E0764E9:847127fffe593232011000:buttonevent" triggered
then
    dimLevelMILD = Shellyrgbw_mia_Color_VerstRkung.state as Number
    Huelevel     = (Shellyrgbw_mia_Color_Farbe.state as HSBType).getHue
    switch(receivedEvent) {
        case "1002":                                                            // ON OFF
            Shellyrgbw_mia_Control_Betrieb.sendCommand(
                if(Shellyrgbw_mia_Control_Betrieb.state == OFF) ON else OFF)
        case "2001":                                                            // dim brighter
            if(tHue === null) {
                tHue = createTimer(now, [ |
                    Shellyrgbw_mia_Color_VerstRkung.sendCommand(dimLevelMILD)
                    if(dimLevelMILD > 100) dimLevelMILD = 100 
                    if(dimLevelMILD == 100) {
                        tHue = null
                    } else {
                        dimLevelMILD += 2
                        tHue.reschedule(now.plusNanos(lTimeout))
                    }
                ])
            }
        case "3001":                                                            // dim darker
            if(tHue === null) {
                tHue = createTimer(now, [ |
                    Shellyrgbw_mia_Color_VerstRkung.sendCommand(dimLevelMILD)
                    if(dimLevelMILD < 2) dimLevelMILD = 2
                    if(dimLevelMILD == 2) { 
                        tHue = null 
                    } else {
                        dimLevelMILD -= 2
                        tHue.reschedule(now.plusNanos(lTimeout))
                    }
                ])
            }
        case "4001":                                                            // color left
            if(tHue === null) {
                tHue = createTimer(now, [ |
                    Shellyrgbw_mia_Color_Farbe.sendCommand(Huelevel+",100,100")
                    if(Huelevel < 0) Huelevel = 0
                    if(Huelevel == 0) { 
                        tHue = null 
                    } else {
                        Huelevel -= 2
                        tHue.reschedule(now.plusNanos(lTimeout))
                    }
                ])
            }
        case "5001":                                                            // color right
            if(tHue === null) {
                tHue = createTimer(now, [ |
                    Shellyrgbw_mia_Color_Farbe.sendCommand(Huelevel+",100,100")
                    if(Huelevel > 360) Huelevel = 360 
                    if(Huelevel == 360) {
                        tHue = null
                    } else {
                        Huelevel += 2
                        tHue.reschedule(now.plusNanos(lTimeout))
                    }
                ])
            }
        case "2003",                                                            // dim stop
        case "3003",                                                            // dim stop
        case "4003",                                                            // color stop
        case "5003": {                                                          // color stop
                tHue?.cancel
                tHue = null
            }
    }
end
Hier ist natürlich vor allem die Umstellung der Cases und das Zusammenfassen aller Stop-Events auffällig, aber ein paar weitere Punkte sind auch noch drin (z.B. die Farbe zu Beginn der Rule aus dem Color Item auszulesen)
Gehe zur vollständigen Antwort

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

Re: Probleme mit OH2.5 Dimmer Rule in OH4.3

Beitrag von udo1toni »

Ja, openHAB4 verwendet JavaTime statt Joda Time (diese Umstellung geschah schon von OH2 auf OH3).
JavaTime kennt kein plusMillis.
Möglichkeit 1: Du verwendest stattdessen .plusNanos() (natürlich mit Faktor 10^6)
Möglichkeit 2: Du verwendest .plus(timeoutMillis,java.time.temporal.ChronoUnit.MILLIS)
Du kannst auch java.time.temporal.ChronoUnit als Import vorne in die Datei schreiben und direkt ChronoUnit.MILLIS angeben, allerdings habe ich das auch schon mal angemeckert bekommen, warum auch immer...

Es wäre übrigens besser, timeoutMillis so zu definieren:

Code: Alles auswählen

val Integer timeoutMills = 100 
Der Unterschied: int erzeugt ein Primitive, Integer erzeugt ein Objekt. Das Primitive braucht extrem viel mehr Zeit zum initialisieren (etwa Faktor 50...) und es gibt nur wenige Situationen, wo Du tatsächlich auf das Primitive angewiesen bist.
Bei Variante 1 (.plusNanos()) wäre noch zu beachten, dass Du für timeoutNanos besser auf Long als Datentyp umschwenken solltest (oder alternativ als Primitive long), weil dies der erwartete Datentyp ist.

Da Du ohnehin immer nur einen der beiden Timer aktiv haben wirst, kannst Du auf den 2. vermutlich auch verzichten :)
Außerdem kann die Rule noch etwas optimiert werden:

Code: Alles auswählen

var Integer dimLevelMILD = 2
var Integer Huelevel = 1 
val Long lTimeout = 100000000
var Timer tHue = null 

rule "MIA LEDLicht Remote"
when
    Channel "deconz:switch:00212E0764E9:847127fffe593232011000:buttonevent" triggered
then
    dimLevelMILD = Shellyrgbw_mia_Color_VerstRkung.state as Number
    Huelevel     = (Shellyrgbw_mia_Color_Farbe.state as HSBType).getHue
    switch(receivedEvent) {
        case "1002":                                                            // ON OFF
            Shellyrgbw_mia_Control_Betrieb.sendCommand(
                if(Shellyrgbw_mia_Control_Betrieb.state == OFF) ON else OFF)
        case "2001":                                                            // dim brighter
            if(tHue === null) {
                tHue = createTimer(now, [ |
                    Shellyrgbw_mia_Color_VerstRkung.sendCommand(dimLevelMILD)
                    if(dimLevelMILD > 100) dimLevelMILD = 100 
                    if(dimLevelMILD == 100) {
                        tHue = null
                    } else {
                        dimLevelMILD += 2
                        tHue.reschedule(now.plusNanos(lTimeout))
                    }
                ])
            }
        case "3001":                                                            // dim darker
            if(tHue === null) {
                tHue = createTimer(now, [ |
                    Shellyrgbw_mia_Color_VerstRkung.sendCommand(dimLevelMILD)
                    if(dimLevelMILD < 2) dimLevelMILD = 2
                    if(dimLevelMILD == 2) { 
                        tHue = null 
                    } else {
                        dimLevelMILD -= 2
                        tHue.reschedule(now.plusNanos(lTimeout))
                    }
                ])
            }
        case "4001":                                                            // color left
            if(tHue === null) {
                tHue = createTimer(now, [ |
                    Shellyrgbw_mia_Color_Farbe.sendCommand(Huelevel+",100,100")
                    if(Huelevel < 0) Huelevel = 0
                    if(Huelevel == 0) { 
                        tHue = null 
                    } else {
                        Huelevel -= 2
                        tHue.reschedule(now.plusNanos(lTimeout))
                    }
                ])
            }
        case "5001":                                                            // color right
            if(tHue === null) {
                tHue = createTimer(now, [ |
                    Shellyrgbw_mia_Color_Farbe.sendCommand(Huelevel+",100,100")
                    if(Huelevel > 360) Huelevel = 360 
                    if(Huelevel == 360) {
                        tHue = null
                    } else {
                        Huelevel += 2
                        tHue.reschedule(now.plusNanos(lTimeout))
                    }
                ])
            }
        case "2003",                                                            // dim stop
        case "3003",                                                            // dim stop
        case "4003",                                                            // color stop
        case "5003": {                                                          // color stop
                tHue?.cancel
                tHue = null
            }
    }
end
Hier ist natürlich vor allem die Umstellung der Cases und das Zusammenfassen aller Stop-Events auffällig, aber ein paar weitere Punkte sind auch noch drin (z.B. die Farbe zu Beginn der Rule aus dem Color Item auszulesen)
openHAB4.3.0 stable in einem Debian-Container (bookworm) (Proxmox 8.3.2, LXC), mit openHABian eingerichtet

michi7744
Beiträge: 6
Registriert: 30. Nov 2021 00:44
Answers: 0

Re: Probleme mit OH2.5 Dimmer Rule in OH4.3

Beitrag von michi7744 »

Hallo udo1toni,

Danke für dein schnelle Antwort. Ich habe Variante 2 gewählt, auf den Integer umgestellt und den zweiten Timer gelöscht.
Ich drücke ja nie 2 Tasten gleichzeitig ;-)

Jetzt funktioniert es wieder wie gewollt :-)

Gibt es irgendgwo eine gute Aufstellung der Unterschiede zwischen Java und Joda zum nachlesen ?

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

Re: Probleme mit OH2.5 Dimmer Rule in OH4.3

Beitrag von udo1toni »

michi7744 hat geschrieben: 29. Dez 2024 22:37 Gibt es irgendgwo eine gute Aufstellung der Unterschiede zwischen Java und Joda zum nachlesen ?
Nein, leider nicht(jedenfalls ist mir keine direkte Gegenüberstellung bekannt).
openHAB4.3.0 stable in einem Debian-Container (bookworm) (Proxmox 8.3.2, LXC), mit openHABian eingerichtet

michi7744
Beiträge: 6
Registriert: 30. Nov 2021 00:44
Answers: 0

Re: Probleme mit OH2.5 Dimmer Rule in OH4.3

Beitrag von michi7744 »

udo1toni hat geschrieben: 29. Dez 2024 22:47 Nein, leider nicht(jedenfalls ist mir keine direkte Gegenüberstellung bekannt).
Danke trotzdem für die Unterstützung !

Antworten