Code
#######################################
my $version="2020-06-06";
#######################################
package main;
use strict;
use warnings;
use POSIX;
use Time::Local;
#######################################
## Init
#######################################
sub myUtils_Kino_Initialize($$)
{
my ($hash) = @_;
}
#######################################
## ROUTING
#######################################
# Aufruf über HarmonyActivitiesNtfy
sub HarmonyActivities($) {
my ($activity) = @_;
my $sub = "HarmonyActivity_" . $activity;
my $coderef=__PACKAGE__->can($sub);
fhem("setreading KinoSteuerung Activity $activity;");
fhem("setreading KinoSteuerung Version $version;");
if ($coderef) {
$coderef->($activity);
}
}
# Aufruf über HarmonyActionNtfy
sub HarmonyAction($) {
my ($action) = @_;
if ($action eq "Search"){$action = "Play"}
elsif ($action eq "Info"){$action = "Pause"}
elsif ($action eq "Home"){$action = "Vorflm"};
my $sub = "HarmonyAction_" . $action;
my $coderef=__PACKAGE__->can($sub);
fhem("setreading KinoSteuerung LastAction $action;");
fhem("setreading KinoSteuerung Version $version;");
if ($coderef) {
$coderef->($action);
}
}
#######################################
## Blu-ray
#######################################
sub HarmonyActivity_Bluray ($) {
my ($activity) = @_;
Log 1, ("$activity Modus wird eingeleitet");
if (ReadingsVal('KinoSteuerung','StatusDev','NN') eq "off") {
KinoLicht("on");
KinoRelais("on");
KinoRoll("down");
fhem("setreading KinoSteuerung StatusDev on;");
}
else {
Log 1, ("Geraete sind bereits eingeschaltet, es ist nicht zu tun");
}
if (ReadingsVal('Bluray','power','NN') ne "on") {
fhem("sleep 10;set Bluray PowerOn; setreading Bluray power on;");
Log 1, ("Blueray Power on ");
}
if (ReadingsVal('Denon','power','NN') ne "on") {
fhem("sleep 10;set Denon on; setreading AVR power on;");
Log 1, ("Denon Power on ");
}
if (ReadingsVal('Denon','input','NN') ne "Blu-Ray") {
fhem("sleep 10;set Denon input Blu-Ray;");
Log 1, ("Denon Input Blu-Ray");
}
if (ReadingsVal('Beamer','power','NN') ne "on") {
fhem("sleep 10;set Beamer PowerOn; setreading Beamer power on;");
Log 1, ("Beamer on");
}
if (ReadingsVal('KinoSteuerung','Vorfilm','NN') ne "off") {
fhem("sleep 30; {HarmonyAction_Vorfilm('Home')};");
Log 1, ("Mit Vorfilm");
}
}
#######################################
## Ende
#######################################
sub HarmonyActivity_Ende($) {
my ($activity) = @_;
Log 1, ("$activity Modus wird eingeleitet");
if (ReadingsVal('KinoSteuerung','StatusDev','NN') eq "on") {
KinoLicht("ende");
KinoRelais("off");
KinoRoll("up");
fhem("setreading KinoSteuerung StatusDev off;");
}
else {
Log 1, ("Geraete sind bereits aus, es ist nicht zu tun");
}
if (ReadingsVal('Bluray','power','NN') ne "off") {
fhem("sleep 10;set Bluray PowerOff; setreading Bluray power off;");
}
if (ReadingsVal('Denon','power','NN') ne "off") {
fhem("sleep 10;set Denon off; setreading AVR power off;");
Log 1, ("Denon Power off");
}
if (ReadingsVal('Beamer','power','NN') ne "off") {
fhem("sleep 10;set Beamer PowerOff; setreading Beamer power off;");
Log 1, ("Beamer off");
}
}
#######################################
## Action - Play - "search" ROKU
#######################################
sub HarmonyAction_Play($) {
my ($action) = @_;
Log 1, ("$action wird eingeleitet");
KinoLicht("play");
}
#######################################
## Action - Pause - "Info" ROKU
#######################################
sub HarmonyAction_Pause($) {
my ($action) = @_;
Log 1, ("$action wird eingeleitet");
KinoLicht("pause");
}
#######################################
## Action - Vorspann abspielen /Home
#######################################
sub HarmonyAction_Vorfilm($) {
my ($action) = @_;
Log 1, ("$action wird eingeleitet");
fhem("set Dimmer.Kino.Deckenfries 20 0 10;");
fhem("set Bluray pause;");
fhem("set FireTVKino connect;");
fhem("sleep 1;set FireTVKino screen wakeup;");
fhem("sleep 1;set FireTVKino appstart org.xbmc.kodi;");
fhem("sleep 1;set FireTVKino_KODI back;set FireTVKino_KODI opendir nfs://192.168.178.28/volume1/filme/Kodi-Test/Intro/;");
fhem("set Denon input Mediaplayer;");
fhem("sleep 2;set FireTVKino_KODI pause;");
fhem("sleep 1;set Denon volume 45");
fhem("sleep 2;set FireTVKino_KODI play;");
}
#######################################
## Action - VorfilmEnde
#######################################
sub HarmonyAction_VorfilmEnde($) {
my ($action) = @_;
Log 1, ("$action wird eingeleitet");
fhem("set Dimmer.Kino.Deckenfries 0 0 10;");
fhem("set Denon volume 57");
fhem("set Denon input Blu-Ray;");
fhem("set HarmonyHub.Kino command UBP-X700 play;");
fhem("setreading KinoSteuerung Vorfilm off;");
}
#######################################
## LED und Spot schalten
#######################################
sub KinoLicht ($) {
my ($state) = @_;
my $spotdim = AttrVal("KinoSteuerung","KinoSpotDimAn","nn");
my $spotramp = AttrVal("KinoSteuerung","KinoSpotRampAn","nn");
my $ledcolor = AttrVal("KinoSteuerung","KinoLEDFarbeAn","nn");
my $ledramp = AttrVal("KinoSteuerung","KinoLEDRamp","nn");
my $spotdimpause = AttrVal("KinoSteuerung","KinoSpotDimPause","nn");
my $spotramppause = AttrVal("KinoSteuerung","KinoSpotRampPause","nn");
my $ledcolorpause = AttrVal("KinoSteuerung","KinoLEDFarbePause","nn");
my $spotrampplay = AttrVal("KinoSteuerung","KinoSpotRampPlay","nn");
if ($state eq "on") {
if (ReadingsVal("Dimmer.Kino.Deckenfries","state","NN") eq "off") {
fhem("set Dimmer.Kino.Deckenfries $spotdim 0 $spotramp;");
}
if (ReadingsVal("LedStripesAlle.Kino","state","NN") eq "off") {
fhem("set LedStripesAlle.Kino HSV $ledcolor $ledramp;");
}
if (ReadingsVal("Relais.Kino.1.LichtBar","state","NN") eq "off") {
fhem("set Relais.Kino.1.LichtBar on;");
}
}
elsif ($state eq "off") {
if (ReadingsVal("Dimmer.Kino.Deckenfries","state","NN") ne "off") {
fhem("set Dimmer.Kino.Deckenfries 0 0 120;");
}
if (ReadingsVal("LedStripesAlle.Kino","state","NN") ne "off") {
fhem("set LedStripesAlle.Kino HSV 0,0,0 10;");
}
if (ReadingsVal("Relais.Kino.1.LichtBar","state","NN") ne "off") {
fhem("defmod Relais.LichtBar_at at +00:03:00 set Relais.Kino.1.LichtBar off;");
}
}
elsif ($state eq "play") {
if (ReadingsVal("Dimmer.Kino.Deckenfries","state","NN") ne "off") {
fhem("set Dimmer.Kino.Deckenfries 0 0 $spotrampplay;");
}
if (ReadingsVal("LedStripesAlle.Kino","state","NN") ne "off") {
fhem("set LedStripesAlle.Kino HSV 0,0,0 $ledramp;");
}
if (ReadingsVal("Relais.Kino.1.LichtBar","state","NN") ne "off") {
fhem("set Relais.Kino.1.LichtBar off;");
}
}
elsif ($state eq "pause") {
if (ReadingsVal("Dimmer.Kino.Deckenfries","state","NN") ne "on") {
fhem("set Dimmer.Kino.Deckenfries $spotdimpause 0 $spotramppause;");
}
if (ReadingsVal("LedStripesAlle.Kino","state","NN") ne "on") {
fhem("set LedStripesAlle.Kino HSV $ledcolorpause $ledramp;");
}
if (ReadingsVal("Relais.Kino.1.LichtBar","state","NN") ne "on") {
fhem("set Relais.Kino.1.LichtBar on;");
}
}
elsif ($state eq "ende") {
if (ReadingsVal("Dimmer.Kino.Deckenfries","state","NN") ne "on") {
fhem("set Dimmer.Kino.Deckenfries 50 0 60;");
}
if (ReadingsVal("LedStripesAlle.Kino","state","NN") ne "on") {
fhem("set LedStripesAlle.Kino HSV $ledcolor $ledramp;");
}
if (ReadingsVal("Relais.Kino.1.LichtBar","state","NN") ne "on") {
fhem("set Relais.Kino.1.LichtBar on;");
}
fhem("defmod DimmerAus_at at +00:04:00 set Dimmer.Kino.Deckenfries 0 0 120;");
fhem("defmod LedsAus_at at +00:04:00 set LedStripesAlle.Kino HSV 0,0,0 10;");
fhem("defmod Relais.LichtBar_at at +00:04:00 set Relais.Kino.1.LichtBar off;");
}
fhem("setreading KinoSteuerung Leds $state;");
fhem("setreading KinoSteuerung Spots $state;");
}
#######################################
## Kino Rollladen steuern
#######################################
sub KinoRoll ($) {
my ($state) = @_;
my $ARSnextDown = ReadingsVal("Roll.KinoVorne","ARSnextDown","NN");
my $timedif = ZeitDiff($ARSnextDown);
if ($state eq "down") {
if (ReadingsNum("Roll.KinoVorne","level","NN") > 0) {
fhem('set Roll.KinoVorne down');
Log 1, ("$timedif ... Rollo fährt runter.");
}
}
elsif ($state eq "up") {
if (ReadingsNum("Roll.KinoVorne","level","NN") == 0) {
if ($timedif >5 and $timedif <600){
fhem('set Roll.KinoVorne up');
Log 1, ("$timedif ... Rollo fährt hoch");
fhem("setreading Roll.KinoVorne ARSlocked on;");
}
else {
Log 1, ("$timedif ... Rollo bleibt unten, weil gleich die Nacht beginnt.");
}
}
}
}
#######################################
## Relais schalten
#######################################
sub KinoRelais ($){
my ($state) = @_;
if ($state eq "on") {
if (ReadingsVal("Relais.Kino.1.AVR","state","NN") eq "off") {
fhem("set Relais.Kino.1.AVR on;");
}
if (ReadingsVal("Funkschalter.Kino.Subwoofer","state","NN") eq "off") {
fhem("defmod Funkschalter.Kino.Subwoofer_at at +00:00:01 set Funkschalter.Kino.Subwoofer on;");
}
if (ReadingsVal("Relais.Kino.1.Beamer","state","NN") eq "off") {
fhem("defmod Relais.KinoBeamer_at at +00:00:02 set Relais.Kino.1.Beamer on;");
}
}
elsif ($state eq "off") {
if (ReadingsVal("Relais.Kino.1.AVR","state","NN") eq "on") {
fhem("defmod Relais.KinoAVR_at at +00:05:00 set Relais.Kino.1.AVR off;");
}
if (ReadingsVal("Relais.Kino.1.Beamer","state","NN") eq "on") {
fhem("define Relais.KinoBeamer_at at +00:10:00 set Relais.Kino.1.Beamer off;");
}
if (ReadingsVal("Funkschalter.Kino.Subwoofer","state","NN") eq "on") {
fhem("defmod Funkschalter.Kino.Subwoofer_at at +00:00:30 set Funkschalter.Kino.Subwoofer off;");
}
}
fhem("setreading KinoSteuerung RelaisAVR $state;");
fhem("setreading KinoSteuerung RelaisBeamer $state;");
}
#######################################
## Zeit Differenzen berechnen
#######################################
sub ZeitDiff($)
{
my ($MeH,$MeM,$MeS)=split(':',shift(@_));
my $ZtA = int($MeH*3600 + $MeM*60 + $MeS);
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time()); # aktuelle Zeit/Datum in Einzelvariabeln zerlegen für die weitere Verarbeitung
my $ZtB = int($hour*3600 + $min*60 + $sec);
my $Zd_diff = int(($ZtA-$ZtB)/60); # Differenz in Minuten ausrechnen
return($Zd_diff);
}
Alles anzeigen
Wie gesagt, dass ich noch beta Status. Macht aber alles, was es soll. Da sind noch einige Kürzungen und Vereinfachungen drin. Aber .. 1-Click mit Vorfilm, Werbung usw. funktioniert schon mal.