Seite 1 von 1

hilfe bei openHAB 3 astro

Verfasst: 2. Jan 2021 23:01
von SIDE22
Nabend,
bin aktuell dabei rules auf OH3 anzupassen

es geht um diese .rule

Code: Alles auswählen

val String filename = "astro.rules"

rule "OpenHAB system started - astro"
when
    System started
then
    createTimer(now.plusSeconds(180)) [|
        logInfo(filename, "--> astro init")
        if (now.isAfter((Sunset_Time.state as DateTimeType).zonedDateTime.toInstant.toEpochMilli) ||
            now.isBefore((Sunrise_Time.state as DateTimeType).zonedDateTime.toInstant.toEpochMilli)
        ) {
            Night_State.postUpdate(ON)
        } else {
            Night_State.postUpdate(OFF)
        }
    ]
end

rule "Update Night_State"
when
    Item Sun_Elevation changed
then
    if (Sun_Elevation.state > 0) {
        if (Night_State.state != OFF) Night_State.postUpdate(OFF)
    } else {
        if (Night_State.state != ON) Night_State.postUpdate(ON)
    }
end

rule "Calculate time of day state"
when
    System started or
    Channel 'astro:sun:home:rise#event' triggered START or
    Channel 'astro:sun:home:set#event' triggered START or
    Channel 'astro:sun:minus90:set#event' triggered START or
    Time cron "0 0 6,23,0 * * ? *"
then
    //Thread::sleep(1000) // make sure we are a tad past midnight to give Astro a chance to recalculate DateTimes for today

    val long morning_start = now.withTimeAtStartOfDay.plusHours(6).millis
    val long day_start = (Sunrise_Time.state as DateTimeType).zonedDateTime.toInstant.toEpochMilli
    val long afternoon_start = (Evening_Time.state as DateTimeType).zonedDateTime.toInstant.toEpochMilli
    val long evening_start = (Sunset_Time.state as DateTimeType).zonedDateTime.toInstant.toEpochMilli
    val long night_start = now.withTimeAtStartOfDay.plusHours(23).millis
    val long bed_start = now.withTimeAtStartOfDay.millis

    var curr = switch now {
        case now.isAfter(morning_start) && now.isBefore(day_start):       "MORNING"
        case now.isAfter(day_start) && now.isBefore(afternoon_start):     "DAY"
        case now.isAfter(afternoon_start) && now.isBefore(evening_start): "AFTERNOON"
        case now.isAfter(evening_start) && now.isBefore(night_start):     "EVENING"
        case now.isAfter(night_start):                                    "NIGHT"
        case now.isAfter(bed_start) && now.isBefore(morning_start):       "BED"
    }

    if (Time_Of_Day.state.toString != curr) {
        logInfo(filename, "Current time of day is now " + curr)
        Time_Of_Day.postUpdate(curr)
    }
end
habe den zweiten teil der rule schonmal probiert und diese geht auch soweit
Unbenannt.PNG
Unbenannt1.PNG
weiß aber nicht genau wie ich die anderen beiden machen könnte.


wenn ich die astro.rule so 1 zu 1 auf OH3 ziehe funktioniert diese nicht
deswegen ist der plan es neu zumachen


LG
Florian

Re: hilfe bei openHAB 3 astro

Verfasst: 6. Jan 2021 12:38
von SIDE22
Hey,
kennt sich damit den einer aus ? ..
und könnte ggf helfen ?

LG
Florian

Re: hilfe bei openHAB 3 astro

Verfasst: 6. Jan 2021 16:14
von udo1toni
Also, die System started Rule ist sinnlos. Der Status vom Item wird gesetzt, sobald sich elevation ändert, das ist der Fall, wenn Astro initialisiert wird.

Gesendet von meinem SM-G973F mit Tapatalk


Re: hilfe bei openHAB 3 astro

Verfasst: 6. Jan 2021 22:46
von Cyrelian
Hi SIDE,

also die Rule 1 und 3 könnte man so ablösen.

Code: Alles auswählen

rule "IsDay"
when
    Channel 'astro:sun:home:daylight#event' triggered START 
then
    IsDay.sendCommand(ON)
    IsTwilight.sendCommand(OFF)
    IsNight.sendCommand(OFF)
end

rule "IsTwilight"
when
    Channel 'astro:sun:home:set#event' triggered END
then
    IsDay.sendCommand(OFF)
    IsTwilight.sendCommand(ON)
    IsNight.sendCommand(OFF)
end

rule "IsNight"
when
    Channel 'astro:sun:home:civilDusk#event' triggered END
then
    IsDay.sendCommand(OFF)
    IsTwilight.sendCommand(OFF)
    IsNight.sendCommand(ON)
end
Nur mal so als Idee. Man kann die Rules auch zusammenfassen mit den verschiedenen Triggern. Das mit dem System Started macht da wirklich keinen Sinn. Das Astro Binding hat über den Tag viele Trigger die deine Rule 3 ersetzen können. Z.b.

Code: Alles auswählen

SUN_RISE, ASTRO_DAWN, NAUTIC_DAWN, CIVIL_DAWN, CIVIL_DUSK, NAUTIC_DUSK, ASTRO_DUSK, SUN_SET, DAYLIGHT, NIGHT
. ;)

Re: hilfe bei openHAB 3 astro

Verfasst: 7. Jan 2021 15:16
von LCN-User
Hallo @SIDE22,
ich habe deine Rules unabhängig von Struktur und Logik (dazu hatten udo1toni und Cyrelian ja schon geschrieben) einfach mal so verändert, dass sie unter OH3 wieder laufen müssten. Ich hatte da in den letzten Tagen auch so einiges bei mir ändern müssen. Vielleicht hilft es dir ja...
Man sieht daran vielleicht auch, was bezüglich DateTime so zu ändern ist, manches vereinfacht sich. Viel Erfolg.

Code: Alles auswählen

val String filename = "astro.rules"

rule "OpenHAB system started - astro"
when
    System started              //Rule ist eigentlich überflüssig, siehe vorherige Kommentare/Antworten
then
    createTimer(now.plusSeconds(180)) [|
        logInfo(filename, "--> astro init")
        if (now.isAfter((Sunset_Time.state as DateTimeType).zonedDateTime) ||
            now.isBefore((Sunrise_Time.state as DateTimeType).zonedDateTime))
        {
            Night_State.postUpdate(ON)
        } else {
            Night_State.postUpdate(OFF)
        }
    ]
end

rule "Update Night_State"
when
    Item Sun_Elevation changed
then
    if (Sun_Elevation.state > 0) {
        if (Night_State.state != OFF) Night_State.postUpdate(OFF)
    } else {
        if (Night_State.state != ON) Night_State.postUpdate(ON)
    }
end

rule "Calculate time of day state"
when
    System started or
    Channel 'astro:sun:home:rise#event' triggered START or
    Channel 'astro:sun:home:set#event' triggered START or
    Channel 'astro:sun:minus90:set#event' triggered START or
    Time cron "0 0 6,23,0 * * ? *"
then
    //Thread::sleep(1000) // make sure we are a tad past midnight to give Astro a chance to recalculate DateTimes for today

    val morning_start = now.with(LocalTime.MIDNIGHT).plusHours(6)
    val day_start = (Sunrise_Time.state as DateTimeType).zonedDateTime
    val afternoon_start = (Evening_Time.state as DateTimeType).zonedDateTime
    val evening_start = (Sunset_Time.state as DateTimeType).zonedDateTime
    val night_start = now.with(LocalTime.MIDNIGHT).plusHours(23)
    val bed_start = now.with(LocalTime.MIDNIGHT)

    var curr = switch now {
        case now.isAfter(morning_start) && now.isBefore(day_start):       "MORNING"
        case now.isAfter(day_start) && now.isBefore(afternoon_start):     "DAY"
        case now.isAfter(afternoon_start) && now.isBefore(evening_start): "AFTERNOON"
        case now.isAfter(evening_start) && now.isBefore(night_start):     "EVENING"
        case now.isAfter(night_start):                                    "NIGHT"
        case now.isAfter(bed_start) && now.isBefore(morning_start):       "BED"
    }

    if (Time_Of_Day.state.toString != curr) {
        logInfo(filename, "Current time of day is now " + curr)
        Time_Of_Day.postUpdate(curr)
    }
end

Re: hilfe bei openHAB 3 astro

Verfasst: 7. Jan 2021 20:32
von SIDE22
Hallo,
danke euch aufjedenfall ja der erste Rule mit dem start da gebe ich euch wohl recht ^^
und danke dir LCN-User habe die rule mal übernommen und es scheint zu gehen :)

habe die mit dem systemstart auch weggelassen

danke für eure hilfe :)


aber dann ist man langsam mit den rules vertraut und hat das smarthome soweit fertig und dann kommt OH3 und man fängt nebenbei wieder von vorne an :D


LG
Florian