While to wait auf Status

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

Moderatoren: Cyrelian, seppy

Antworten
int5749
Beiträge: 1173
Registriert: 4. Nov 2019 22:08
Answers: 9

While to wait auf Status

Beitrag von int5749 »

Hallo zusammen,

ich habe einige Musiccast Geräte und spiele dort Morgens automatisch nach dem aufstehen Musik. Jedoch benötigt das Gerät einige Zeit, zumindest länger als openHAB die Befehler senden würde, daher muss ich auf den Statuswechsel warten, bevor ich weitere Befehle sende.
Die mache ich derzeit mit einem While und Threat-Sleep, was noch historisch vorhanden ist. Dies macht es natürlich nicht besser und ich suche eine andere, intelligentere Lösung. Bisher jedoch ohne Erfolg :cry:

Die Rule lautet

Code: Alles auswählen

rule StartTheDayWithMusic
when
    Item Lampe_OG_Bad_Spiegel changed or
    Item Bad_Rollo received command
then
    if ((Lampe_OG_Bad_Spiegel.state == ON || receivedCommand == UP) && Comfort_Music2start.state == ON && Ephemeris.isWeekend != true && now.toLocalTime.toSecondOfDay >= 21480 && now.toLocalTime.toSecondOfDay <= 23100) {
    	logInfo("Musiccast", "WX010 in der Kueche wird eingeschaltet.")
        if (WX010_Kueche_Power.state != ON) {
            WX010_Kueche_Power.sendCommand(ON)
            while (WX010_Kueche_Power.state != ON) {
                Thread::sleep(1000)
            }
            if (WX010_Kueche_Volume.state != 30) WX010_Kueche_Volume.sendCommand(30)
            WX010_Kueche_Preset.sendCommand(1)
        }
    }
end
Wie würdest ihr dies lösen?

VG und einen Dank im voraus.
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

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

Re: While to wait auf Status

Beitrag von udo1toni »

So:

Code: Alles auswählen

// Globale Variablen immer zu Beginn der Datei definieren!
var Timer tMusic = null                                          // Timer für Musiccast

rule StartTheDayWithMusic
when
    Item Lampe_OG_Bad_Spiegel changed or
    Item Bad_Rollo received command
then
    if(Comfort_Music2start.state != ON)                          // statt einer länglichen Prüfung, jede Bedingung als Abbruchbedingung nutzen
        return;
    if(Ephemeris.isWeekend)
        return;
    if(Lampe_OG_Bad_Spiegel.state != ON && receivedCommand != UP)
        return;
    val Integer iSecOfDay = now.toLocalTime.toSecondOfDay        // lokale Konstante wegen zwei Vergleichen
    if(iSecOfDay < 21480)
        return;
    if(iSecOfDay > 23100)
        return;
    if(WX010_Kueche_Power.state == ON)
        return;

    // Alle Bedingungen sind erfüllt
    logInfo("Musiccast", "WX010 in der Kueche wird eingeschaltet.")
    WX010_Kueche_Power.sendCommand(ON)
                                                                 // Statt sleep(1000) lieber einen scheduled Timer nutzen
    tMusic?.cancel
    tMusic = createTimer(now.plusNanos(1000000),[|               // 1 Millisekunde
        if(WX010_Kueche_Power.state == ON) {                     // schon ON?
            if (WX010_Kueche_Volume.state != 30)
                WX010_Kueche_Volume.sendCommand(30)
            WX010_Kueche_Preset.sendCommand(1)
        } else {                                                 // falls nicht
            tMusic.reschedule(now.plusSeconds(1))                // starte den Code in einer Sekunde
        }
    ])
end
:)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

int5749
Beiträge: 1173
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: While to wait auf Status

Beitrag von int5749 »

udo1toni hat geschrieben: 20. Apr 2022 22:14 So:

:)
:o

OK, musste erst einmal dort durch lesen und habe dies dann noch schnell gestern Abend eingebaut um dies zu testen.
Scheint im Grundsatz funktioniert zu haben, aber da ich seit 1:33 einen Internet Outage hatte,funktionierten natürlich nicht die Presets und Internet Radio :evil:

Daher habe ich mal schnell meine 2. Rule (AddMoreMusic @ 6:20) eingearbeitet und eine leichte Änderung vorgenommen, damit die Rule nicht abbricht, wenn das Musiccast in der Küche schon an ist. Denn wenn dies wider Erwarten so wäre, wird eben knallhart Lautstärke und Preset Radio angepasst ;-)

Ich hoffe, ich habe keine Fehler eingebaut und die Logik funktioniert so

Code: Alles auswählen

var Timer tMusicWX010Kueche = null          // Timer für Musiccast
var Timer tMusicWX030Schlaf = null          // Timer für Musiccast
var Timer tMusicWX030Bad = null             // Timer für Musiccast


rule StartTheDayWithMusic
when
    Item Lampe_OG_Bad_Spiegel changed or
    Item Bad_Rollo received command
then
    if(Comfort_Music2start.state != ON)                          // statt einer länglichen Prüfung, jede Bedingung als Abbruchbedingung nutzen
        return;
    if(Ephemeris.isWeekend)
        return;
    if(Lampe_OG_Bad_Spiegel.state != ON && receivedCommand != UP)
        return;
    val Integer iSecOfDay = now.toLocalTime.toSecondOfDay        // lokale Konstante wegen zwei Vergleichen
    if(iSecOfDay < 21480)
        return;
    if(iSecOfDay > 23100)
        return;

    // Alle Bedingungen sind erfüllt
    logInfo("Musiccast", "WX010 in der Kueche wird eingeschaltet.")
    if(WX010_Kueche_Power.state != ON)
        WX010_Kueche_Power.sendCommand(ON)

    tMusicWX010Kueche?.cancel
    tMusicWX010Kueche = createTimer(now.plusNanos(1000000),[|               // 1 Millisekunde
        if(WX010_Kueche_Power.state == ON) {                     // schon ON?
            if (WX010_Kueche_Volume.state != 30)
                WX010_Kueche_Volume.sendCommand(30)
            WX010_Kueche_Preset.sendCommand(1)
        } else {                                                 // falls nicht
            tMusicWX010Kueche.reschedule(now.plusSeconds(1))                // starte den Code in einer Sekunde
        }
    ])

    createTimer(ZonedDateTime.now().withHour(6).withMinute(20).withSecond(0),[|               // starte Timer für zusätzliche Musiccast Devices

        if(WX010_Kueche_Power.state != ON)
            return;

        logInfo("Musiccast", "WX030 im Schlafzimmer wird eingeschaltet.")
        if(WX030_Schlaf_Power.state != ON)
            WX030_Schlaf_Power.sendCommand(ON)
        tMusicWX030Schlaf?.cancel
        tMusicWX030Schlaf = createTimer(now.plusNanos(1000000),[|       // 1 Millisekunde
            if(WX030_Schlaf_Power.state == ON) {                            // schon ON?
                if (WX030_Schlaf_Volume.state != 25)
                    WX030_Schlaf_Volume.sendCommand(25)
                WX030_Schlaf_Preset.sendCommand(1)
            } else {                                                        // falls nicht
                tMusicWX030Schlaf.reschedule(now.plusSeconds(1))            // starte den Code in einer Sekunde
            }
        ])

        logInfo("Musiccast", "WX030 im Badezimmer wird eingeschaltet.")
        if(WX030_Bad_Power.state != ON)
            WX030_Bad_Power.sendCommand(ON)
        tMusicWX030Schlaf?.cancel
        tMusicWX030Bad = createTimer(now.plusNanos(1000000),[|       // 1 Millisekunde
            if(WX030_Bad_Power.state == ON) {                            // schon ON?
                if (WX030_Bad_Volume.state != 25)
                    WX030_Bad_Volume.sendCommand(25)
                WX030_Bad_Preset.sendCommand(1)
            } else {                                                        // falls nicht
                tMusicWX030Bad.reschedule(now.plusSeconds(1))            // starte den Code in einer Sekunde
            }
        ])
    ])
end
Mal sehen, wie dies morgen Früh läuft.

VG und wie immer einen Dank bis hierher.
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

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

Re: While to wait auf Status

Beitrag von udo1toni »

Hmm... ich bin mir nicht sicher, ob das tatsächlich so passt.

Die Rule kann über einen Schalter deaktiviert werden (Comfort_Music2start).
Die Rule läuft nur Werktags (isWeekend Überprüfung)
Die Rule ist aufgrund der Einschränkungen nur zwischen 05:58:00 und 06:25:00 aktiv. (wird später abgeprüft, aber die Reihenfolge ist hier egal)

Wird im Bad das Licht eingeschaltet, oder der Rollladen geöffnet, wird Musiccast in der Küche eingeschaltet und die Lautstärke angepasst, sowie Preset 1 aufgerufen.
Anschließend wird ein Timer gestartet, der um 06:20:00 auslöst. Hier ergibt sich die Frage, was passiert, wenn die Rule erst nach 6:20 gestartet wurde (es gibt ein Fünf-Minuten-Fenster). Der Timer wird keiner Variablen zugeordnet, So dass hier keine Kontrolle mehr besteht. Potenziell könnten auch mehrere Timer angelegt werden, wenn man z.B. zunächst das Licht einschaltet und anschließend den Rollladen öffnet.

Der Timer wird abgebrochen, wenn Musiccast in der Küche nicht aktiv ist. Sollte man also durch einen blöden Zufall um 06:19:59 die Rule auslösen, so schaltet die Rule Musiccast ein, unmittelbar danach wird der Timer gestartet und auch ausgeführt, aber leider ist Musiccast noch nicht aktiv (wohl aber eine oder zwei Sekunden später...)

Nun wird also um 06:20:00 Musiccast im Schlafzimmer gestartet und gleich auch noch im Bad. (ACHTUNG! Da hast Du einen Copy&Paste Fehler drin. Es wird an der zweiten Stelle fälschlich tMusicWX030Schlaf gecancelt, statt tMusicWX030Bad)

Grundsätzlich würde ich erwarten, dass die Rule Musiccast im Bad startet und dann - zeitversetzt - noch in anderen Bereichen des Hauses, also im Zweifel in Küche und Schlafzimmer. Zeitversetzt hieße aber für mich, dass die Musik z.B. nach 12 Minuten startet, weil meine Morgenroutine im Bad 12 Minuten in Anspruch nimmt, nicht zu einer festgelegten Zeit, die auch noch eventuell schon überschritten ist.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

int5749
Beiträge: 1173
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: While to wait auf Status

Beitrag von int5749 »

udo1toni hat geschrieben: 21. Apr 2022 14:18 Hmm... ich bin mir nicht sicher, ob das tatsächlich so passt.
Bisher läuft die Ganze über 2 Rules und hat gepasst :)
udo1toni hat geschrieben: 21. Apr 2022 14:18 Die Rule kann über einen Schalter deaktiviert werden (Comfort_Music2start).
Die Rule läuft nur Werktags (isWeekend Überprüfung)
Die Rule ist aufgrund der Einschränkungen nur zwischen 05:58:00 und 06:25:00 aktiv. (wird später abgeprüft, aber die Reihenfolge ist hier egal)
Genau
udo1toni hat geschrieben: 21. Apr 2022 14:18 (ACHTUNG! Da hast Du einen Copy&Paste Fehler drin. Es wird an der zweiten Stelle fälschlich tMusicWX030Schlaf gecancelt, statt tMusicWX030Bad)
Oupps, Danke. Ist korrigiert
udo1toni hat geschrieben: 21. Apr 2022 14:18 Grundsätzlich würde ich erwarten, dass die Rule Musiccast im Bad startet und dann - zeitversetzt - noch in anderen Bereichen des Hauses, also im Zweifel in Küche und Schlafzimmer. Zeitversetzt hieße aber für mich, dass die Musik z.B. nach 12 Minuten startet, weil meine Morgenroutine im Bad 12 Minuten in Anspruch nimmt, nicht zu einer festgelegten Zeit, die auch noch eventuell schon überschritten ist.
Da würden Deine und unsere Gewohnheiten nicht passen :lol:

Mal im Detail some insights:

1) Ich stehe um 6:00 Uhr auf und mein Weg führt mich ins Bad => daher die Abfrage auf 5:58 (Puffer) <= 6:25 ist dort sicher zu spät und noch historisch und könnte bereits um 6:19 enden; im Sommer ist es manchmal bereits um 6:00 hell und dann öffnen wir das Rollo im Bad, anstatt Licht einzuschalten
2) Ich wecke "nochmals" meine Frau und gehe runter in die Küche => dort läuft dann hoffentlich bereits das Internet Radio von Preset 1 (auch wenn ich diese ohne meine Hörhilfen in der Lautstärke eh nicht höre, aber eben meine Frau :lol: )
3) Es wird kurz Brot geschmiert, 1 Kaffee getrunken und dann geht es wieder hoch zur weiteren Routine
4) In der Regel sind wir dann um 6:20 wieder oben => dort geht dann im Schlafzimmer und Bad (dort pendeln wir dann) die weitere Musik an, ebenfalls Internet Radio Preset 1

Das Ganze natürlich nur in der Woche => Arbeitstage, denn am WE unterscheidet sich die Routine zu unregelmäßig

Da es aber auch passieren kann, das wir mal frei haben aber unsere Töchter aufstehen (manchmal auch gegen 6:00) wird dann die Musik abgeschaltet, damit das Radio auch im Schlafzimmer nicht startet und am besten eben gar nicht.

PS: Wenn wir dann das Haus verlassen wird über die Präsenzsteuerung Musiccast wieder beendet, oder wir beauftragen kurz Alexa 8-)

Jetzt schaue ich mal, was morgen Früh passiert.

VG
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

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

Re: While to wait auf Status

Beitrag von udo1toni »

Ah, das erklärt es :) Dann sollte die Rule so passen...
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

int5749
Beiträge: 1173
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: While to wait auf Status

Beitrag von int5749 »

udo1toni hat geschrieben: 21. Apr 2022 20:22 Ah, das erklärt es :) Dann sollte die Rule so passen...
Hat heute Morgen prächtig funktioniert => wieder etwas smarter geworden und was dazu gelernt => Merci

Gerade beim Review ist mir ein- und aufgefallen, dass ich ja eh nur auf "Licht einschalten" oder "Jalousie auffahren" triggere.
Um unnötiges triggern der Rule (z.B. beim ausschalten des Lichts) zu vermeiden habe ich die Eintrittsvoraussetzung geändert und somit noch eine Prüfung auf den Trigger gespart.

Code: Alles auswählen

rule StartTheDayWithMusic
when
    Item Lampe_OG_Bad_Spiegel changed to ON or
    Item Bad_Rollo received command UP
then
    if(Comfort_Music2start.state != ON)                          // statt einer länglichen Prüfung, jede Bedingung als Abbruchbedingung nutzen
        return;
    if(Ephemeris.isWeekend)
        return;
//    if(Lampe_OG_Bad_Spiegel.state != ON && receivedCommand != UP)
//        return;
    val Integer iSecOfDay = now.toLocalTime.toSecondOfDay        // lokale Konstante wegen zwei Vergleichen

.........
VG
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

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

Re: While to wait auf Status

Beitrag von udo1toni »

Stimmt auffallend...
Manchmal sieht man den Wald vor lauter Bäumen nicht :)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten