Hop til indhold
  • 0

Hjælp til rules


Jakob Hauerslev
 Share

Spørgsmål

Hej

Efter at have fået rigtig god starthjælp af flere herinde, har jeg fået gang i Velux-bindingen, der også er blevet opdateret en del på for nyligt (så den er mere stabil efter genstart). Jeg har læst lidt kode hist og her, og på den måde sat følgende regel sammen (fik god kodehjælp af EjvindHald til at komme i gang)

Nu har jeg så fået lagt hysterese ind, da det var en smule irriterende at motorerne kørte ved ændring på +/- 0,1 grad ^_^

Det virker ganske fint, men jeg kan ikke finde ud af at få lagt samme hysterese ind ved overgang fra setpunkt_high til setpunkt_low (den ændrer fra fuldt åben (0) til halvt åben (50) når temperaturen ændrer sig 0,1 (24,8 til 24,7) - pga. at temperaturen så netop er > setpoint_low+hysterese (når jeg prøver at lægge det ind, så arbejder delelementerne i min kode mod hinanden).

rule "Gang temperatur hysterese over 23.5"
when
// reglen aktiveres ved ændring i temperatur eller alarm status
    Item entre_temp changed or 
    Item alarm_io changed
then
// Hvis alarm er tilkoblet, så skal vinduerne være lukket
    if (alarm_io.state == OFF){
	// Alarm er frakoblet    
        var Number cur_temp = entre_temp.state as Number
        var Number setpoint_high = 24.5
        var Number setpoint_low = 23.5
        val  Number hysteresis = 0.2

        // Der er varmere end højeste setpunkt - vinduet åbnes helt
        if (cur_temp > (setpoint_high + hysteresis)) {
            Veluxentre_Position.sendCommand(0)}
    
            else {
                // Vinduet åbnes 50% hvis temperatur er højere end laveste setpunkt 
                if (cur_temp > (setpoint_low + hysteresis)) 
                    Veluxentre_Position.sendCommand(50)    
                else if
                 // Temperatur er lavere end laveste setpunkt, og vinduet lukkes
                    (cur_temp < (setpoint_low - hysteresis))
                    Veluxentre_Position.sendCommand(100)}
    }
    else {
        // Luk vinduet hvis alarm ikke er frakoblet
        Veluxentre_Position.sendCommand(100)
    }
end

Det ser sådan ud i loggen:

2021-05-18 21:20:53.663 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'IHCELKOController_Entregangveddorvaerelse2TemperatursensorRumtemperatur' changed from 24.7 °C to 24.8 °C

2021-05-18 21:20:53.668 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'Veluxentre_Position' received command 0

2021-05-18 21:20:53.671 [INFO ] [penhab.event.ItemStatePredictedEvent] - Item 'Veluxentre_Position' predicted to become 0

2021-05-18 21:20:53.676 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Veluxentre_Position' changed from 50 to 0

2021-05-18 21:21:10.064 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'bryggers_temp' changed from 24.00 to 23.90

2021-05-18 21:22:19.024 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'entre_temp' changed from 24.80 to 24.70

2021-05-18 21:22:19.066 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'IHCELKOController_Entregangveddorvaerelse2TemperatursensorRumtemperatur' changed from 24.8 °C to 24.7 °C

2021-05-18 21:22:19.076 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'Veluxentre_Position' received command 50

2021-05-18 21:22:19.079 [INFO ] [penhab.event.ItemStatePredictedEvent] - Item 'Veluxentre_Position' predicted to become 50

2021-05-18 21:22:19.087 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Veluxentre_Position' changed from 0 to 50

Hvad skal jeg lave om for at det kører som jeg ønsker (og jeg får ro fra vinduesmotoren)? <_<

Link til kommentar
Del på andre sites

5 svar på dette spørgsmål

Recommended Posts

  • 0

Hej Jakob

Det er var en lidt udfordrende sag, du kom med. Men efter at have tænkt lidt over det, tror jeg, at det nemmeste er at indføre en træghed, så den kun skifter status højst hvert xx minut. Der er også en del andre produkter, - bl.a. markisestyringer - som har samme logik for at undgå det, som du oplever. Næste skridt er så, hvordan man nemmest laver det i openHAB.

Jeg foreslår nedenstående, som i sagens natur ikke er testet.

Først én ny variabel i din item fil:

Switch  VeluxLockWindow 

Dernæst denne nye regel, hvor tallet 5 for minutter ændres efter behov.

rule "Velux træg skift"                              
when Veluxentre_Position changed
then
    VeluxLockWindow.sendCommand(ON)
    createTimer(now.plusMinutes(5),  [ |
        VeluxLockWindow.sendCommand(OFF)
    ])
end

Til sidst én enkelt ny kodelinie med Exit i dit eksisterende kode

rule "Gang temperatur hysterese over 23.5"
when
// reglen aktiveres ved ændring i temperatur eller alarm status
    Item entre_temp changed or 
    Item alarm_io changed
then
// Hvis alarm er tilkoblet, så skal vinduerne være lukket
    if (alarm_io.state == OFF){
    // Alarm er frakoblet
        if (VeluxLockWindow.state == ONreturn;  // Exit
        var Number cur_temp = entre_temp.state as Number
        var Number setpoint_high = 24.5
        var Number setpoint_low = 23.5
        val  Number hysteresis = 0.2
 
        // Der er varmere end højeste setpunkt - vinduet åbnes helt
        if (cur_temp > (setpoint_high + hysteresis)) {
            Veluxentre_Position.sendCommand(0)}
    
            else {
                // Vinduet åbnes 50% hvis temperatur er højere end laveste setpunkt 
                if (cur_temp > (setpoint_low + hysteresis)) 
                    Veluxentre_Position.sendCommand(50)    
                else if
                 // Temperatur er lavere end laveste setpunkt, og vinduet lukkes
                    (cur_temp < (setpoint_low - hysteresis))
                    Veluxentre_Position.sendCommand(100)}
    }
    else {
        // Luk vinduet hvis alarm ikke er frakoblet
        Veluxentre_Position.sendCommand(100)
    }
end

Prøv om det fungerer...

Link til kommentar
Del på andre sites

  • 0
På 22.5.2021 at 14:52 , EjvindHald skrev:

Hej Jakob

Det er var en lidt udfordrende sag, du kom med. Men efter at have tænkt lidt over det, tror jeg, at det nemmeste er at indføre en træghed, så den kun skifter status højst hvert xx minut. Der er også en del andre produkter, - bl.a. markisestyringer - som har samme logik for at undgå det, som du oplever. Næste skridt er så, hvordan man nemmest laver det i openHAB.

Jeg foreslår nedenstående, som i sagens natur ikke er testet.

Først én ny variabel i din item fil:

Switch  VeluxLockWindow 

Dernæst denne nye regel, hvor tallet 5 for minutter ændres efter behov.

rule "Velux træg skift"                              
when Veluxentre_Position changed
then
    VeluxLockWindow.sendCommand(ON)
    createTimer(now.plusMinutes(5),  [ |
        VeluxLockWindow.sendCommand(OFF)
    ])
end

Til sidst én enkelt ny kodelinie med Exit i dit eksisterende kode

rule "Gang temperatur hysterese over 23.5"
when
// reglen aktiveres ved ændring i temperatur eller alarm status
    Item entre_temp changed or 
    Item alarm_io changed
then
// Hvis alarm er tilkoblet, så skal vinduerne være lukket
    if (alarm_io.state == OFF){
    // Alarm er frakoblet
        if (VeluxLockWindow.state == ONreturn;  // Exit
        var Number cur_temp = entre_temp.state as Number
        var Number setpoint_high = 24.5
        var Number setpoint_low = 23.5
        val  Number hysteresis = 0.2
 
        // Der er varmere end højeste setpunkt - vinduet åbnes helt
        if (cur_temp > (setpoint_high + hysteresis)) {
            Veluxentre_Position.sendCommand(0)}
    
            else {
                // Vinduet åbnes 50% hvis temperatur er højere end laveste setpunkt 
                if (cur_temp > (setpoint_low + hysteresis)) 
                    Veluxentre_Position.sendCommand(50)    
                else if
                 // Temperatur er lavere end laveste setpunkt, og vinduet lukkes
                    (cur_temp < (setpoint_low - hysteresis))
                    Veluxentre_Position.sendCommand(100)}
    }
    else {
        // Luk vinduet hvis alarm ikke er frakoblet
        Veluxentre_Position.sendCommand(100)
    }
end

Prøv om det fungerer...

Det var en god ide med en dummy switch. 

Jeh tror at jeg vil prøve med en dummy switch for intervallet for lav temperatur, og en for høj, og så bygge det op på den måde. 

Tak for hjælpen !

Link til kommentar
Del på andre sites

  • 0
4 timer siden, Jakob Hauerslev skrev:

Det var en god ide med en dummy switch. 

Jeh tror at jeg vil prøve med en dummy switch for intervallet for lav temperatur, og en for høj, og så bygge det op på den måde. 

Tak for hjælpen !

Min løsning virker allerede for alle intervaller. Keep it simple...

Jeg vil ikke kalde det en dummy switch - det er minimumstid mellem skift af status, som mange kommercielle produkter også har.

Link til kommentar
Del på andre sites

  • 0
2 timer siden, EjvindHald skrev:

Min løsning virker allerede for alle intervaller. Keep it simple...

Jeg vil ikke kalde det en dummy switch - det er minimumstid mellem skift af status, som mange kommercielle produkter også har.

Det kan selvfølgelig godt være at din løsning er mere simpel - og det er nok meget godt en varm sommerdag hvor det ellers risikerer at stå og åbne og lukke konstant!

Tak for hjælpen igen :-)

Link til kommentar
Del på andre sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gæst
Svar på dette spørgsmål

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loader...
 Share

×
×
  • Tilføj...

Important Information

Privatlivspolitik og We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.

1200x630bb.png

ok