Seite 1 von 1

Alarm, Timer on alexa soll eine Aktion auslösen

Verfasst: 12. Dez 2019 06:13
von rexxxx
Hallo,
ich nutze OpenHab 2 jetzt schon seit ein paar Jahren und habe einiges an Erfahrungen gesammelt.
Jetzt habe ich wieder etwas meine Hausautomation erweitert und habe in diesem Zuge von OpenHab 2.1 auf 2.5 hochgerüstet.

------------------------------------------------------------------------
Hintergrund und Problembeschreibung:
Ich steuere viele Sachen mit einem Echo Dot über Sprachbefehle. Jetzt habe ich mir eine Neue 5.1 Souround Anlage von Yamaha gekauft. Die alte von CIA Tronik war mit dem Dot Verbunden und war immer aktiv. Die Neue von Yamaha geht nach ca. 2 Minuten in StandBy und schaltet ab sobald kein Ton auf dem ausgewählten Kanal erkannt wird.

Die Bindings zu dem Yamaha Reciver sind installiert und Konfiguriert. Es gibt auch schon verschiedenen Regeln und Verbindungen, die ich erstellt habe, um mit dem Echo den Reciver zu steuern. Alles kein Problem.

Wenn jetzt aber ein Timer oder Wecker (Alarm) im Echo gesetzt wird und der Reciver in Standby geht, hört man das Signal natürlich nicht. Also hatte ich mir gedacht, kein Problem. Über das Amazon Binding erhalte ich die Informationen "Nächster Timer" und "Nächster Alarm" im DateTime Format. Also habe ich mit noch über das NTP Binding ein Item gemacht wo die aktuelle Uhrzeit auch im DateTime Format drinnen steht.

--------------------------------------------------------------------------
Das Script bzw. die Regel hatte ich mir so gedacht:
Wenn (Nächster Timer == Aktuelle Zeit) ODER (Nächster Alarm == Aktuelle Zeit)
Dann Schalte Item Boxen auf Ein und Schalte Kanal Auf Echo

Alle Items existieren und Funktionieren, da diese in verschiedenen Anderen Regeln verwendet werden. Das Hauptproblem liegt im Syntax der If Anweisung. Ich habe jetzt schon sehr viel versucht, komme aber einfach nicht weiter.

--------------------------------------------------------------------------
Probleme die mir die Lösungsfindung erschweren:
Ich bin SPS Programmierer, heißt ich bin es gewohnt beim Debuggen jedes Bit sehen zu können und das Programm mit der Laufzeit zu beobachten.
Bei den Regeln bin ich aber Blind und sehe nicht welche Werte sich aktuell wo befinden. Die Hinweise die ich habe sind die anzeigen im Paper UI und die Items die ich mir im Basic UI Anzeigen lassen kann. Aber ich weiß nicht ob meine Regel zu lauf zeit abgefragt wird oder nicht. Ich bin da aktuell ziemlich blind.

Re: Alarm, Timer on alexa soll eine Aktion auslösen

Verfasst: 12. Dez 2019 12:34
von peter-pan
Ich kann dir zwar bei Lösung deines Problems mit dem Receiver nicht weiterhelfen, aber was das Triggern deiner Regel(n) anbelangt, könntest du ja ein "logInfo"-Befehl an bestimmten Stellen in deiner Regel " einbauen, die dir anzeigt, ob die Regel abgearbeitet wird und welche Werte gesetzt werden.

Re: Alarm, Timer on alexa soll eine Aktion auslösen

Verfasst: 12. Dez 2019 12:59
von sihui
rexxxx hat geschrieben: 12. Dez 2019 06:13 Bei den Regeln bin ich aber Blind und sehe nicht welche Werte sich aktuell wo befinden.
Eine schöne Erweiterung des Visual Studio Code Plugins:

Seit Version 0.6.0 wird dir der aktuelle Status jedes Items als Hover angezeigt:
vsc.JPG

Re: Alarm, Timer on alexa soll eine Aktion auslösen

Verfasst: 12. Dez 2019 23:31
von udo1toni
Ja, das ist natürlich nicht während der Laufzeit einer Rule ;)

Die Syntax ist relativ einfach, aber es kommt schon drauf an, wie Deine Items definiert sind. Ich hatte gerade von ein paar Tagen ein ähnliches Problem im englischen Forum gesehen, wo ein DateTime Item direkt ausgewertet wird, um einen passenden Timer zu setzen. Schau mal hier: https://community.openhab.org/t/whats-w ... imer/87347
Du müsstest natürlich nur einen Timer anlegen, der kurz vor dem Wecker Deinen Verstärker einschaltet und den passenden Kanal wählt, die Formeln stehen aber in der verlinkten Rule drin.

Re: Alarm, Timer on alexa soll eine Aktion auslösen

Verfasst: 13. Dez 2019 07:50
von sihui
udo1toni hat geschrieben: 12. Dez 2019 23:31 Ja, das ist natürlich nicht während der Laufzeit einer Rule ;)
Aber davor und danach :D

Re: Alarm, Timer on alexa soll eine Aktion auslösen

Verfasst: 13. Dez 2019 08:33
von rexxxx
Hi und guten Morgen.
Nach dem ich gestern erstmals aus Blödheit meine Arbeit der letzten Tage zerstört hatte (Ich habe den neuen Pi in das Gehäuse des alten eingebaut, ohne die SD Karte raus zu nehmen, stellte ich fest, wie leicht eine SD Karte doch zerbrechen kann, zum Glück hatte ich am Abend zuvor eine Sicherung der Datenbanken und editierten Dateien gemacht, also war es nur knapp 2 Stunden bis wieder alles online war).

Heute Morgen hatte ich dann einen Geistesblitz, hier meine Lösung:

Hilfreicher Link:
https://community.openhab.org/t/datetim ... on/54266/1

Lösung:
//-----------------------------------------
//Wenn Echo Alarm ausgibt soll x ausgeführt werden

//Erkennen der AlarmTypen
//Timer
rule "Timer_Timer"
when
Item ChristophsEchoDot_NChsterTimer changed
then
createTimer(new DateTime(ChristophsEchoDot_NChsterTimer.state.toString)) [|
sendCommand(T_Alarm , ON)]
end

//Alarm
rule "Alarm_Timer"
when
Item ChristophsEchoDot_NChsterAlarm changed
then
createTimer(new DateTime(ChristophsEchoDot_NChsterAlarm.state.toString)) [|
sendCommand(T_Alarm , ON)]
end

//Erinnerung
rule "Reminder_Timer"
when
Item ChristophsEchoDot_NChsteErinnerung changed
then
createTimer(new DateTime(ChristophsEchoDot_NChsteErinnerung.state.toString)) [|
sendCommand(T_Alarm , ON)]
end


//Aktion
rule "Alarm_Aktion"
when
Item T_Alarm changed to ON
then
sendCommand(A_Boxen , ON)
sendCommand(A_Boxen_Kanal_AV6 , ON)
sendCommand(T_Alarm , OFF)
end
//----------------------------------------------------------------------------

Re: Alarm, Timer on alexa soll eine Aktion auslösen

Verfasst: 13. Dez 2019 13:57
von udo1toni
~Nörgel~ Ja aber...

Warum 4 Rules für ein Problem? Warum marodierende Timer anlegen? Seit wann kann man einen Verstärker innerhalb 0 Sekunden einschalten?
Items:

Code: Alles auswählen

Group:DateTime gDtEchoAlarm
DateTime ChristophsEchoDot_NChsterTimer (gDtEchoAlarm)
DateTime ChristophsEchoDot_NChsterAlarm  (gDtEchoAlarm)
DateTime ChristophsEchoDot_NChsteErinnerung  (gDtEchoAlarm)
rule:

Code: Alles auswählen

// Globale Variablen zu Beginn der Datei definieren!
var Timer tEcho = null

//-----------------------------------------
//Wenn Echo Alarm ausgibt soll x ausgeführt werden

rule "Timer_Timer"
when
    member of gDtEchoAlarm changed
then
    val 1stAlarm = gDtEchoAlarm.members.filter[i|i.state instanceof DateTimeType].filter[j|(new DateTime(j.state.toString)) > now.plusSeconds(10)].sortBy[ state ].head.state.toString
    if(1stAlarm !== null) {
        tEcho?.cancel
        tEcho = createTimer((new DateTime(1stAlarm)).minusSeconds(10), [
            val 1stAlarm = gDtEchoAlarm.members.filter[i|i.state instanceof DateTimeType].filter[j|(new DateTime(j.state.toString)) > now.plusSeconds(10)].sortBy[ state ].head.state.toString
            if(1stAlarm !== null) {
                tEcho.reschedule((new DateTime(1stAlarm)).minusSeconds(10))
            }
            A_Boxen.sendCommand(ON)
            A_Boxen_Kanal_AV6.sendCommand(ON)
        ])
    }
//----------------------------------------------------------------------------
Die Konstante 1stAlarm wird zum zeitlich ersten Alarm der Gruppe. Anschließend wird geprüft, ob es überhaupt einen Alarm gibt und gegebenenfalls ein Timer anglegt (falls es noch einen laufenden Timer gibt, wird dieser zuerst entfernt). Der Timerstart ist dabei um 10 Sekunden vor den Alarm gelegt, damit der Verstärker schon komplett betriebsbereit ist (z.B. Ausgänge nicht mehr gemutet...)
Innerhalb des Timers wird geprüft, ob es einen weiteren Timer gibt, falls ja, wird der Timer erneut eingeplant.
Zum Schluss wird im Timer die eigentliche Aufgabe ausgeführt.

Bist Du sicher, dass dieser Teil (unverändert gegenüber Deinem Originalcode) so funktioniert? Manches Gerät braucht ein paar Sekunden Bedenkzeit, nachdem es eingeschaltet wurde.

Die Rule ist ungetestet, kann also sein, dass ich irgendwo einen Denkfehler gemacht habe.