Hallo,
im folgenden Script werden die Termine im bereits angelegten Kalender nach Übereinstimmungen zu Name, Alias oder Gruppe von Devices durchsucht und die jeweilige Schaltzeiten angelegt.
99_myUtils.pm
sub Kalenderstart ($) {
my ($Ereignis) = @_;
my @Ereignisarray = split(/.*:\s/,$Ereignis);
my $Ereignisteil1 = $Ereignisarray[1];
my @uids=split(/;/,$Ereignisteil1);
foreach my $uid (@uids) {
my $Kalendertext = fhem("get Kalender_fhem summary $uid");
my @ret;
my @etDev = devspec2array("NAME=.*");
foreach my $d (@etDev){
next unless $d;
my $Geraetename= $defs{$d}{NAME};
my $Alias=AttrVal($Geraetename,"alias",0);
my $Gruppenstring=AttrVal($Geraetename,"group",0);
my @Gruppen=split(/\,/,$Gruppenstring);
my $Gruppe;
foreach my $w (@Gruppen){
next unless $w;
if($Kalendertext eq $w){$Gruppe=$w};
};
my $Geraet;
if($Kalendertext eq $Geraetename or $Kalendertext eq $Alias or $Kalendertext eq $Gruppe){$Geraet=$Geraetename;
fhem("set $Geraet on");
};
}
};
}
sub Kalenderende ($) {
my ($Ereignis) = @_;
my @Ereignisarray = split(/.*:\s/,$Ereignis);
my $Ereignisteil1 = $Ereignisarray[1];
my @uids=split(/;/,$Ereignisteil1);
foreach my $uid (@uids) {
my $Kalendertext = fhem("get Kalender_fhem summary $uid");
my @ret;
my @etDev = devspec2array("NAME=.*");
foreach my $d (@etDev){
next unless $d;
my $Geraetename= $defs{$d}{NAME};
my $Alias=AttrVal($Geraetename,"alias",0);
my $Gruppenstring=AttrVal($Geraetename,"group",0);
my @Gruppen=split(/\,/,$Gruppenstring);
my $Gruppe;
foreach my $w (@Gruppen){
if($Kalendertext eq $w){$Gruppe=$w};
};
my $Geraet;
if($Kalendertext eq $Geraetename or $Kalendertext eq $Alias or $Kalendertext eq $Gruppe){$Geraet=$Geraetename;
fhem("set $Geraet off");
};
}
};
}
Zum Aufruf müssen noch zwei Notifys erzeugt werden:
define Kalender_Beginn notify meinGoogleKalender:modeStarted.*.* {Kalenderstart("$EVENT");;}
define Kalender_Ende notify meinGoogleKalender:modeEnded.*.* {Kalenderende("$EVENT");;}
Danke an all jene, deren Scripte ich hierfür verwendet habe.
Gruß Jens
Hallo dirigent,
vielen Dank für den Code - damit konnte ich meine Kalendersteuerung deutlich vereinfachen. Eine Ergänzung würde ich allerdings für die Gruppenschleifen vorschlagen:
my $Gruppe;
foreach my $w (@Gruppen){
next unless $w;
if($Kalendertext eq $w){
$Gruppe=$w};
};
};
Ohne "next unless $w" kann es passieren, dass bei einem fehlerhaften Kalendereintrag dieser leer bleibt und in der Folge in der abschließenden If-Abfrage zu jeder leeren Gruppe passt. Dadurch wird dann JEDES Gerät auf on oder off gesetzt.
Danke Rudibarani, die Zeile habe ich jetzt eingefügt. Gruß Jens
ab dem nächsten FHEM Release (5.9) funktioniert das so ohnehin nicht mehr.
Hallo Betateilchen,
das Featurelevel 5.9 ist mir neu - hab ich wohl was überlesen. Wo stehen die Info's zu den Änderungen? In den Ankündigungen und per Suche habe ich sie nicht gefunden.
Gruß Jens
Hallo Jens,
hast Du hier was rausfinden können, warum das beim nächsten größeren Update nicht mehr gehen soll?
Viele Grüße
Phillip