Hauptmenü

Fragen zu LightScene

Begonnen von Enlightning Man, 25 Januar 2015, 14:37:36

Vorheriges Thema - Nächstes Thema

Enlightning Man

Hallo.

Ich habe ein Paar grundlegende Verständnisfragen zu LightScene.

Ich möchte bei der Wiedergabe von 3D Filmen via XBMC (siehe XBMC Thread) mir:

  • eine LightScene beim Start der Wiedergabe merken als tmp_pre_movie_state
  • dann auf eine vordefinierte Szene 3d_movie umschalten
  • bei Pause oder Ende des Films wieder auf die alte temporär gemerkte Szene zurückschalten und sie dann entfernen

Ich habe mir hierfür eine LightScene kino_licht definiert und lege on-the-fly den Zustand tmp_pre_movie_state bevor ich auf den Zustand 3d_movie (gedimmte Lampen) wechsle. Sobald der Film pausiert wird, wird zurück auf scene tmp_pre_movie_state geswitched und die scene wird danach direkt wieder gelöscht.

Soweit so gut... Aber:

Problem A - LightScene scheint zu spät zu speichern:
Die Abfolge der Befehle
fhem("set kino_licht save tmp_pre_movie_state;");
fhem("set kino_licht scene 3d_movie;");

legt korrekt einen neuen Scene Zustand an, allerdings wird bei mir für die Lampe in der Scene immer der ausgeschaltete Zustand in der Scene gespeichert und nicht der aktuelle.
Verwende ich
fhem("set kino_licht save tmp_pre_movie_state;");
fhem("set wz_dimmer_tisch 0 0 3;");

dann klappt es und die tmp_pre_movie_state hat den korrekten Zustand. Das hört sich für mich verdächtig nach einer Race Condition an, dass das Speichern erst die Daten abfragt, nachdem die Scene schon gewechselt hat oder so. Kann das sein? Muss ich da irgendwie mit Sleep arbeiten?

Problem B - Kann man die aktuell aktive Scene abfragen?

Derzeit frage ich ab ob eine bestimmte Lampe an ist oder nicht um zu entscheiden, ob ich in die 3d_movie LightScene switchen soll. Schöner wäre, wenn ich abfragen könnte, welche scene die gerade aktive ist. Habe diese beiden Varianten erfolglos ausprobiert:
Log 3, "Current light scene of kino_licht: " . ReadingsVal("kino_licht", "scene", "n/a");
Log 3, "Current light scene of kino_licht: " . fhem("get kino_licht scene;");

Ist denke ich ein einfacher Denkfehler meinerseits, wie man an diese Info rankommt.

Problemchen C - Der Dimmvorgang ist jetzt sehr schnell
Das ist ein kleines Problem, aber ich hatte den Dimmvorgang vor der Einführung der LightScene per Einzelbefehl auf 3 Sekunden eingestellt und das wechseln der Scenes macht das jetzt in der schnelleren Default Geschwindigkeit des Dimmers. Das is natürlich nicht mehr so eindrucksvoll wie vorher. Kann man das irgendwie konfigurieren? Vielleicht via setcmd in der LightScene?  Die Commandref ist leider nicht so wirklich intuitiv verständlich und das Wiki zu Lightscene ist noch leerer...

Danke für Hilde und schöne Grüße,
EM

Enlightning Man

Ah, direkt mal eins rausgefunden:

Problem B ist super offensichtlich:
Value("kino_licht")
gibt mir die aktuell gesetzte Szene.

Enlightning Man

#2
Ok, die Erkenntnis zum Abfragen der aktuellen LightScene hat auch Problem A gelöst. Offenbar sind mehrere at notifications von meinem XBMC beim Start des Films angekommen. Mit dem Code hier geht es jetzt, dass die LightScene die korrekten Werte speichert und nach dem Film (oder bei Pause) wieder herstellt.
wz_xbmc:playStatus.* {
  my $media = ReadingsVal("wz_xbmc","currentMedia","none");
  my $isPlaying = ReadingsVal("wz_xbmc","playStatus","n/a") eq "playing";
  my $is3d = ReadingsVal("wz_xbmc","3dfile","n/a") eq "on";
  my $currentLightScene = Value("kino_licht");
  Log 3, "Wiedergegebene Datei: " . $media . " isPlaying: " . $isPlaying. " is3d: " . $is3d . " currentLightScene: " . $currentLightScene;
  if ($is3d && $isPlaying) {
     if ($currentLightScene ne "3d_movie") {       
        Log 3, "Speichere aktuellen Zustand als temporäre Szene und ändere kino_licht scene auf 3d_movie...";
        fhem("set kino_licht save tmp_pre_movie_state;");
        fhem("set kino_licht scene 3d_movie;");       
     }
  } elsif ($is3d && $currentLightScene eq "3d_movie") {
     Log 3, "Der Film ist pausiert oder zu Ende, ändere LightScene zurück auf tmp_pre_movie_state...";
     fhem("set kino_licht scene tmp_pre_movie_state;");
     fhem("set kino_licht remove tmp_pre_movie_state;");
  }
}


Ziemlich cool :)

Was bleibt ist dann noch die generelle Frage zum langsamen, definierten Übergang. Siehe "Problem C" im Initialpost.


P.A.Trick

Cool habe ich direkt mal übernnommen :) Danke!
Cubietruck,RPI,QNAP Ts-419p+, FS20, FRITZ!DECT200, 7 MAX! Thermostate, 3 MAX! Fensterkontakte, Kodi, CUL V3.3, EM1000S, LW12, LD382, HUE, HM-CFG-USB-2, 1x HM-LC-SW1-FM, 2x HM-LC-SW2-FM, 2x HM-LC-Sw1PBU-FM, 3xHM-LC-Bl1PBU-FM,HM-SEC-RHS, 2xHM-SEC-SD,HM-WDS30-T-O, 3x HM-LC-Dim1TPBU-FM, RPI+AddOn

Enlightning Man

Freut mich, dass es Anklang findet.
Als Hinweis: Im neuesten XBMC Modul Update ist "is3DFile" umbenannt worden in "3dfile". Heißt, man muss

my $is3d = ReadingsVal("wz_xbmc","is3DFile","n/a") eq "on";

ersetzen durch:

my $is3d = ReadingsVal("wz_xbmc","3dfile","n/a") eq "on";

Habe es im Snippet oben jetzt angepasst.

Kann mir irgendjemand nen Tipp geben in Richtung ob/wie man die Statusübergänge mit LightScene genauer kontrollieren kann?

P.A.Trick

Cubietruck,RPI,QNAP Ts-419p+, FS20, FRITZ!DECT200, 7 MAX! Thermostate, 3 MAX! Fensterkontakte, Kodi, CUL V3.3, EM1000S, LW12, LD382, HUE, HM-CFG-USB-2, 1x HM-LC-SW1-FM, 2x HM-LC-SW2-FM, 2x HM-LC-Sw1PBU-FM, 3xHM-LC-Bl1PBU-FM,HM-SEC-RHS, 2xHM-SEC-SD,HM-WDS30-T-O, 3x HM-LC-Dim1TPBU-FM, RPI+AddOn