hilfe bei openHAB 3 astro

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
SIDE22
Beiträge: 153
Registriert: 4. Mai 2020 01:31
Answers: 0
Wohnort: Hagen a.T.W.

hilfe bei openHAB 3 astro

Beitrag 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
von LCN-User » 7. Jan 2021 15:16
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
Gehe zur vollständigen Antwort
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
openHAB 3.1.0M5 als Debian-Container in Proxmox
Bindings (HomeMatic, Shelly, Phillips Hue, HTTP, MQTT, Spotify, Telegram)
rund 90 HomeMatic komponenten dazu 21 Shelly und ca. 126 Phillips Hue Leuchten im einsatz.
MQTT bindung für openWB (WallBox) abfrage, HTTP für DoorPi (IP Türsprechstelle)

SIDE22
Beiträge: 153
Registriert: 4. Mai 2020 01:31
Answers: 0
Wohnort: Hagen a.T.W.

Re: hilfe bei openHAB 3 astro

Beitrag von SIDE22 »

Hey,
kennt sich damit den einer aus ? ..
und könnte ggf helfen ?

LG
Florian
openHAB 3.1.0M5 als Debian-Container in Proxmox
Bindings (HomeMatic, Shelly, Phillips Hue, HTTP, MQTT, Spotify, Telegram)
rund 90 HomeMatic komponenten dazu 21 Shelly und ca. 126 Phillips Hue Leuchten im einsatz.
MQTT bindung für openWB (WallBox) abfrage, HTTP für DoorPi (IP Türsprechstelle)

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

Re: hilfe bei openHAB 3 astro

Beitrag 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

openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Benutzeravatar
Cyrelian
Beiträge: 601
Registriert: 24. Sep 2015 17:55
Answers: 4

Re: hilfe bei openHAB 3 astro

Beitrag 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
. ;)

LCN-User
Beiträge: 17
Registriert: 29. Dez 2020 10:36
Answers: 1

Re: hilfe bei openHAB 3 astro

Beitrag 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

SIDE22
Beiträge: 153
Registriert: 4. Mai 2020 01:31
Answers: 0
Wohnort: Hagen a.T.W.

Re: hilfe bei openHAB 3 astro

Beitrag 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
openHAB 3.1.0M5 als Debian-Container in Proxmox
Bindings (HomeMatic, Shelly, Phillips Hue, HTTP, MQTT, Spotify, Telegram)
rund 90 HomeMatic komponenten dazu 21 Shelly und ca. 126 Phillips Hue Leuchten im einsatz.
MQTT bindung für openWB (WallBox) abfrage, HTTP für DoorPi (IP Türsprechstelle)

Antworten