Seite 2 von 3

Re: AVR Receiver Input via Rule

Verfasst: 11. Mär 2020 04:43
von udo1toni
Man kann Bool'sche Algebra eigentlich immer beliebig komplex gestalten. Es muss nur am Ende true oder false heraus kommen.

Eine andere Variante (mit Timer für die Verzögerung):

Code: Alles auswählen

var Timer tAutoInput = null  // globale Variablen immer zu Beginn der Datei definieren

rule "Denon Autoinput IRP"
when 
    Thing "denonmarantz:avr:0005cd3a0e8e" changed
then
    if(DenonInputAuto_to_IRP.state != ON) {
        logDebug("autoinput","Regel getriggert, aber deaktiviert.")
        return;
    }
    var status = getThingStatusInfo("denonmarantz:avr:0005cd3a0e8e").getStatus()
    if(status.toString() != 'ONLINE') {
        logDebug("autoinput","Regel getriggert, Gerät nicht ONLINE.")
        return;
    }
    if (now.getHourOfDay < 7 || now.getHourOfDay > 12 || now.getDayOfWeek < 6) {
        logDebug("autoinput","Regel getriggert, falscher Zeitraum.")
        return;
    }
    logDebug("autoinput","Regel getriggert, berreite Umschaltung vor.")
    tAutoInput?.cancel
    tAutoInput = createTimer(now.plusSeconds(30), [|
        logDebug("autoinput","Timer abgelaufen, wähle Internet Radio.")
        DenonAVRX2000_MainZone_InputSource.sendCommand("IRP")
    ])
end
Diese Variante läuft genau andersrum. Die Bedingungen werden der Reihe nach überprüft, falls eine Bedingung nicht zutrifft, wird der Ablauf der Regel abgebrochen (die Anweisung return). Ausnahmsweise muss hier ein Semikolon stehen, das liegt daran, dass return eigentlich einen Parameter erwartet (den Rückgabewert), den man aber auch weg lassen kann. Um die Übersetzung nicht scheitern zu lassen, braucht es also das Semikolon.
Weil es so schön ist, gibt die Rule jeweils per log Auskunft darüber, warum sie abgebrochen wurde. Das ist natürlich optional.
Weil man solche Meldungen im Alltag eher nicht sehen möchte, habe ich hier bewusst logDebug() eingesetzt. Um die Meldungen zu Gesicht zu bekommen, muss man über die Karaf Konsole das log Level für org.openhab.model.script.autoinput auf DEBUG setzen.

Die Rule wie oben zu schreiben, hat den Vorteil, dass man auch nach Jahren ohne weitere Kommentare direkt erkennen kann, was die Rule macht.
Weiterhin werden alle unnötigen Dinge gar nicht erst erledigt. In der früheren Variante wurde hingegen immer alles bis auf den eigentlichen Schaltbefehl ausgeführt. Die neue Variante wird also ziemlich sicher weniger Taktzyklen pro Durchlauf benötigen (solange eine der Bedingungen nicht zutrifft).

Re: AVR Receiver Input via Rule

Verfasst: 11. Mär 2020 07:59
von PeterA
Hallo Udo,

tja wie soll man den auf so was ausgefeiltes kommen :) "verbeug" :D
Macht natürlich Sinn das zu Strukturieren.

Eines ist mir jedoch beim Zeitraum aufgefallen.

Du hast in ein Deinem optimierten Vorschlag das nun mit "ODER" verkünpft, die Uhrzeiten und den Tag geändert:

Code: Alles auswählen

if (now.getHourOfDay < 7|| now.getHourOfDay > 12 || now.getDayOfWeek < 6)
Wenn ich aber möchte das nur am Samstag und Sonntag zwischen 7 und 13Uhr automatisch Umgeschaltet wird müsste es doch so lauten ?:

Code: Alles auswählen

if (now.getHourOfDay > 6 && now.getHourOfDay <13 && now.getDayOfWeek > 5)
Gruß Peter

Re: AVR Receiver Input via Rule

Verfasst: 11. Mär 2020 09:11
von Darkwin101
Bei Udos Regel bricht ja die Regel ab und führt sie nicht aus


Gesendet von iPhone mit Tapatalk

Re: AVR Receiver Input via Rule

Verfasst: 11. Mär 2020 10:14
von PeterA
aber ist der Vergleich auf die Uhrzeiten und Tag nicht falsch gesetzt ? "confused"

Re: AVR Receiver Input via Rule

Verfasst: 11. Mär 2020 10:24
von Darkwin101
Nein breche Regel ab wenn Uhrzeit <7 Uhr oder >12 Uhr oder nicht Samstag Sonntag damit wird die Regel also nur ausgeführt Samstag Sonntag 7 bis 13 Uhr
Ich hoffe so ist das verständlicher


Gesendet von iPhone mit Tapatalk

Re: AVR Receiver Input via Rule

Verfasst: 11. Mär 2020 10:43
von udo1toni
Also, die erste Variante ist, jede der Bedingungen muss erfüllt sein, damit der Befehl ausgeführt wird.
Die zweite Variante ist, keine der Bedingungen darf erfüllt sein, damit der Abbruch nicht ausgeführt wird.

Erste Variante: Uhrzeit größer Untergrenze UND Uhrzeit kleiner Obergrenze UND Wochentag > 5 -> Befehl ausführen.
Zweite Variante: Uhrzeit ist kleiner Untergrenze ODER Uhrzeit ist größer Obergrenze ODER Wochentag < 6 -> Abbruch ausführen.

Allgemein passieren mir gerne mal Fehler :) eigentlich sogar in jedem Posting, obwohl ich immer noch mal gegen lese, aber in diesem Fall stimmt's ;)

Re: AVR Receiver Input via Rule

Verfasst: 11. Mär 2020 11:43
von PeterA
Hallo Darkwin und Udo,

Hachtcore :) Aber das quasi "Invertiert" zu lösen, wäre ich niemals drauf gekommen! Top!

Vielen Dank erstmal, immer wieder toll wie man hier im Forum Lösungen zusammen finden kann.

Gruß Peter

Re: AVR Receiver Input via Rule

Verfasst: 11. Mär 2020 16:58
von udo1toni
Also, Du kannst das auch nicht invertiert lösen, das ist dann aber total unübersichtlich, weil jede Bedingung in eine andere Bedingung geschachtelt sein muss und jeweils noch else mit dazu kommt, falls Du eine entsprechende Meldung haben willst.

Re: AVR Receiver Input via Rule

Verfasst: 14. Mär 2020 10:43
von PeterA
Der guten Ordnung halber wollte ich nochmal melden das es Funktioniert!
Vielen Dank an Darkwin und Udo!

Code: Alles auswählen

2020-03-14 08:53:57.270 [INFO ] [arthome.model.script.Denon AVR X2000] - Status: ONLINE

Code: Alles auswählen

2020-03-14 08:53:57.285 [INFO ] [pse.smarthome.model.script.autoinput] - Regel getriggert, berreite Umschaltung vor.

Code: Alles auswählen

2020-03-14 08:53:57.293 [vent.ItemStateChangedEvent] - DenonAVRX2000_MainZone_Power changed from OFF to ON

Code: Alles auswählen

2020-03-14 08:54:12.295 [INFO ] [pse.smarthome.model.script.autoinput] - Timer abgelaufen, wähle Internet Radio.

Code: Alles auswählen

2020-03-14 08:54:12.310 [ome.event.ItemCommandEvent] - Item 'DenonAVRX2000_MainZone_InputSource' received command IRP

2020-03-14 08:54:12.314 [nt.ItemStatePredictedEvent] - DenonAVRX2000_MainZone_InputSource predicted to become IRP

2020-03-14 08:54:12.324 [vent.ItemStateChangedEvent] - DenonAVRX2000_MainZone_InputSource changed from SAT/CBL to IRP
2020-03-14 08:54:18.715 [vent.ItemStateChangedEvent] - DenonAVRX2000_MainZone_InputSource changed from IRP to Internet Radio

2020-03-14 08:54:18.823 [vent.ItemStateChangedEvent] - DenonAVRX2000_General_NowPlayingArtist changed from  to hr1

2020-03-14 08:54:18.830 [vent.ItemStateChangedEvent] - DenonAVRX2000_General_NowPlayingTrack changed from  to Queen & David Bowie - Under pressure
:D :D :D

Re: AVR Receiver Input via Rule

Verfasst: 18. Aug 2020 10:33
von PeterA
Hallo Zusammen hallo Udo,

ich hole diesen Thread noch mal nach "oben" :)

Der Rule Vorschlag von dir Udo funktioniert hier bestens und sehr zuverlässig!!
Nun hat aber mein Denon die Eigenschaft sich seinen letzten Input zu merken.
Abends steht der Denon dann immer noch auf Radio wenn wir Fernsehen möchten.

Wie könnte die Rule erweitert werden damit, wenn der Denon Abends wieder eingeschaltet wird
und immer noch auf Radio Input steht, auf TV Input umgeschaltet wird ?

Gruß Peter