Rückfrage zu bedingungsabhängiger Lichtsteuerung

Begonnen von zensbert, 11 November 2015, 18:39:40

Vorheriges Thema - Nächstes Thema

zensbert

Hallo,
Ich mach das hier nochmal als Extra-Thema um das XBMC-Thema nicht vollzumüllen.

Ich quote mal meine bisherige Frage:
ZitatHi,
Nachdem ihr mir so schnell geholfen hattet nochmal eine Frage:

Ich schalte über FHEM Licht ein, wenn bei XBMC Pause ist. aber 2 Nachteile:
-schalte ich über XBMC von Kanal 1 auf 2 ist ca. eine Sekunde Status pause, also geht licht an
-schalte ich über die Harmony alles aus, geht der HTPC nicht schnell genug aus, demnach gibt FHEM nochmal ein Licht-Einschalt-Signal obwohl eigentlich alles aus sein sollte

Der aktuelle Notify sieht so aus:
Code:
HTPC.playStatus:.paused set LEDLichtleiste PowerOn

Kann ich da ein 2-3 Sekunden Delay einsetzen? Bzw. auch verhindern dass das Licht anbleibt wenn Harmony Status = PowerOff?

Cool wäre auch generell: wenn Wechsel von Harmony Status auf PowerOff 5 Minuten Licht an, ist aber ja wahrsch. Ein eigenes Notify, oder?

Vielen Dank!!

Thomas


Amenophis86 hatte mir mit einer Antwort schon mal grundlegend weiterhelfen können, nun sieht der Quelltext so aus:

Define xbmc_lighton DOIF ([HTPC:playStatus] eq "paused") (set LEDLichtleiste PowerOn) DOELSEIF ([HTPC:playStatus] eq "stopped") (set LEDLichtleiste PowerOn) DOELSE (set LEDLichtleiste PowerOff)
attr xbmc_lighton wait 4:4


Vom Grundprinzip her funktioniert es schon, dass Problem hat sich aber nicht geändert da nun die o.g. Umschaltaktion zw. 2 Kanälen immer noch dass Licht schaltet.. nur mit 4 Sekunden Verzögerung. Selbst wenn ich es auf 10 Sekunden stelle wird das Licht geschaltet, nur mit 10 Sek. Verzögerung. Wie kann ich das denn nun realisieren, im Grunde müsste es so laufen, dass wenn XBMC=Stop, 4 Sek. Wait, Erneut prüfen ob immer noch Stop, falls ja Lighton, falls nein Lightoff.

Vielen Dank im Voraus!
Thomas

Amenophis86

Mach aus dem DOELSE mal folgendes:


DOLESEIF ([HTPC:playStatus] eq "play")] (set LEDLichtleiste PowerOn)


Und beim wait hinten noch ein :0 dran, also 4:4:0
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

zensbert

Also so?

([HTPC:playStatus] eq "paused") (set LEDLichtleiste PowerOn) DOELSEIF ([HTPC:playStatus] eq "stopped") (set LEDLichtleiste PowerOn) DOELSEIF ([HTPC:playStatus] eq "play") (set LEDLichtleiste PowerOn)

Dann ist sie immer an..

habe mal weitergetestet, so schaltet es zumindest korrekt:

([HTPC:playStatus] eq "playing") (set LEDLichtleiste PowerOff) DOELSE (set LEDLichtleiste PowerOn) aber weiterhin effekt dass er beim umschalten der Kanäle Licht einschaltet.

ich finde in der commandref absolut nichts zum wait Attribut.. wo nimmst du die Infos her?

Amenophis86

#3
 ;D ich meine natürlich PowerOff am Ende. Sry vertippt. Also so:

([HTPC:playStatus] eq "paused") (set LEDLichtleiste PowerOn) DOELSEIF ([HTPC:playStatus] eq "stopped") (set LEDLichtleiste PowerOn) DOELSEIF ([HTPC:playStatus] eq "play") (set LEDLichtleiste PowerOff)

Zum wait musst du unter DOIF bei Verzögerungen schauen.
http://fhem.de/commandref_DE.html#DOIF
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

zensbert

Habe es jetzt probiert, er schaltet es aber trotzdem ein, halt mit 4 Sekunden Verzögerung. Muss ich denn keine "doppelte Prüfung" einbauen? Also so:

XBMC=Stop, 4 Sek. Wait, Erneut prüfen ob immer noch Stop, falls ja Lighton, falls nein Lightoff

Danke für die Commandref, hatte es da nicht gefunden.

Amenophis86

Nein, musst du normal nicht. Sobald die Bedingung mit dem Player wahr wird, wird dieser Befehl ausgeführt, also das Licht ausschalten bzw nicht einschalten, wenn es aus ist.

Ist denn die Syntax richtig? Also hat das Reading auch "play"  als Status, wenn etwas läuft? Weiterhin  wie lange dauert der Wechsel zwischen stop und play, dem entsprechend lange muss das wait gesetzt werden?
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

zensbert

der Status ist "playing" und so habe ich es auch definiert. auch den Wait time wert mal auf 10 Sekunden erhöht, kein unterschied (bis auf dass er halt nach 10 sek schaltet). Von meinem Verständnis her muss ich dass schon 2 mal prüfen, schließlich ist die bedingung paused/stopped ja erfüllt und dann ist ja auch logisch dass er schaltet, egal mit wieviel verzögerung. kann ich denn nicht eine Doif anlegen und die in einer anderen Doif abfragen / auffrufen? der wunsch ist ja schließlich dass er nur dann licht schaltet wenn nach 4 sekunden auch wirklich immer noch der status auf stopped/paused steht.

Amenophis86

Ein Doif in einem Doif geht nicht. Der Sinn von wait ist aber eigentlich was du willst und so zu erklären:

Das Doif wird getriggert, weil Pause oder Stop der Fall ist --> Verzögerung des Einschalten des Lichts um die Wait Zeit
-->
Möglichkeit A: In der Wait Zeit passiert kein neuer Trigger = Das Licht wird eingeschaltet bzw. der Befehl ausgeführt
Möglichkeit B: In der Wait Zeit passiert ein neuer Trigger = Der Befehl wird abgebrochen und der neue Trigger Befehl wird ausgeführt.

Somit ist DOIF eigentlich genau das, was du willst. Ich glaube eher, dass es ein Syntax Fehler ist. Poste mal bitte folgende Sachen hier im Thread in Code Tags:

1. Das Listing der Readings von HTPC bei Stop
2. Das Listing der Readings von HTPC bei Play
3. Das Listing der Readings von HTPC bei Pause
4. Das Listing der Readings von HTPC beim Umschalten (müsste laut deiner Aussage ja gleich zu einem der oben genannten sein)
5. Das Listing der Readings von deinem DOIF

Dann schauen wir mal, ob die Syntax soweit richtig ist. Wenn das der Fall ist, dann schauen wir weiter.
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

zensbert

1. Playstatus stop = stopped
2. Playstatus play = playing
3. Playstatus pause = paused
4. Playstatus umschalten = paused
5. bin ich mir jetzt nicht sicher was du meinst.

Aber: du hast recht. Ich habe jetzt den Timer hochgesetzt und nochmal den HTPC neugestartet, jetzt schaltet er die Lampen richtig.

Bleibt aber immer noch das Problem, dass er nach dem Ausschalten vom HTPC die Lampen final einschaltet. muss ich jetzt noch eine DOELSEIF einbauen, weg. Harmony.activity = PowerOff ?

zensbert

Nachtrag:

so klappts noch nicht mit dem Harmony-Status, aber ich nehme an es ist der richtige Weg:

([HTPC:playStatus] eq "paused") (set LEDLichtleiste PowerOn) DOELSEIF ([HTPC:playStatus] eq "stopped") (set LEDLichtleiste PowerOn) DOELSEIF ([HTPC:playStatus] eq "playing" and [WZ_HarmonyHub:activity] ne "PowerOff") (set LEDLichtleiste PowerOff)

Amenophis86

#10
Na also, geht doch  :)

Dann musst du dir jetzt eine Logik überlegen, welche wahr wird, wenn du ausschaltest, dass die Lampe nicht eingeschaltet, oder ausgeschaltet wird. ZB könntest du das Wait fürs Ausschalten relativ hoch setzten und noch ein DOELSEIF mit dem Harmony Status dran hängen. Wenn die auf zB Off geht, dass dann die Lampe auch nicht eingeschaltet wird.

Edit:
Die Frage fängt glaube wo anders an. Erklär mir nochmal wann die Lampe an und wann sie aus gehen soll. Weil ich glaube das " DOELSEIF ([HTPC:playStatus] eq "stopped")" brauchst du nicht. Oder soll die Lampe angehen, wenn gestoppt wird? Was ist denn der Unterschied zwischen "stopped" und "paused"? Und soll bei beiden die Lampe angehen?
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

zensbert

#11
ja es soll bei beiden an gehen. pause ist nur-mal-kurz-auf-klo-gehen und der film bleibt an der stelle stehen und stop ist film ausmachen, null wiedergabeaktivität. jeder dvd player hat ja auch pause und stop.

edit: auch mit 10 Sek Timer geht die Lampe trotzdem noch an wenn alles aus geht (Harmony:activity = PowerOff)

Amenophis86

#12
gut, wenn es bei beiden angehen soll, dann muss das DOIF so bleiben. Dann jetzt die Frage, wenn du ausschaltest soll es nicht angehen, richtig verstanden? Und wenn du ausschaltet, dann schaltest du auch die Harmony auf aus? Ist das immer so? Dann müsstest du dein DOIF etwas anders anpassen:


([HTPC:playStatus] eq "paused") (set LEDLichtleiste PowerOn) DOELSEIF ([HTPC:playStatus] eq "stopped") (set LEDLichtleiste PowerOn) DOELSEIF ([HTPC:playStatus] eq "playing") (set LEDLichtleiste PowerOff) DOELSEIF [WZ_HarmonyHub:activity] eq "PowerOff") (set LEDLichtleiste PowerOff)

Jetzt noch das wait anpassen. Wichtig für die Harmony Bedingung muss es auf 0 stehen, dass es gleich ausgeht und das wait der anderen überschreibt.

Jetzt würde das DOIF folgendes machen:

Pause/Stop = DOIF wartet die Wait Zeit ab -->
Möglichkeit A) Kein neuer Trigger => Lampe geht an
Möglichkeit B) Neuer Trigger => Der neue Befehl wird ausgeführt

Play = DOIF wird ausgeführt --> Die Lampe geht aus (je nachdem, wie schnell dein Wait ist)

Harmony geht aus --> Die Lampe wird ausgeschaltet (je nachdem, wie schnell dein Wait ist)


Wichtig ist, dass du für jeden Befehl einen Wert bei Wait sitzt. Hier musst du mit den Werten halt spielen, bis du Zeit hast, die Kodi brauch um den Status zu wechseln. Aber das hast du ja schon gemerkt. Alternativ kannst du überlegen, was wahr oder unwahr wird und dies als Trigger benutzen um die Lampe zu schalten. Kenne dein Smarthome nicht, daher musst du selbst drauf kommen.
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

zensbert

Okay, erstmal vielen Dank, ich probier noch ein bischen rum.. wenn ichs dann soweit habe werde ich es hier für andere noobs wie mich mal posten.

Dir noch einen schönen Abend!

Amenophis86

Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...