Kalender - Schaltzeiten nach Name, Alias oder Gruppe

Begonnen von JensS, 20 Dezember 2014, 18:34:15

Vorheriges Thema - Nächstes Thema

JensS

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
Debian auf APU2C4, HM-CFG-USB2, SIGNALduino, HM-ES-PMSw1-Pl, TFA 30.3121, TFA 30.3125, ITS-150, PIR-5000, configurable Firmata USB & LAN, 1-wire: DS-18B20, DS-18S20, DS-2408, DS-2413, diverse I2C-Komponenten, zigbee2mqtt, ESPEasy etc.

Rudibarani

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.

JensS

Danke Rudibarani, die Zeile habe ich jetzt eingefügt. Gruß Jens
Debian auf APU2C4, HM-CFG-USB2, SIGNALduino, HM-ES-PMSw1-Pl, TFA 30.3121, TFA 30.3125, ITS-150, PIR-5000, configurable Firmata USB & LAN, 1-wire: DS-18B20, DS-18S20, DS-2408, DS-2413, diverse I2C-Komponenten, zigbee2mqtt, ESPEasy etc.

betateilchen

ab dem nächsten FHEM Release (5.9) funktioniert das so ohnehin nicht mehr.

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

JensS

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
Debian auf APU2C4, HM-CFG-USB2, SIGNALduino, HM-ES-PMSw1-Pl, TFA 30.3121, TFA 30.3125, ITS-150, PIR-5000, configurable Firmata USB & LAN, 1-wire: DS-18B20, DS-18S20, DS-2408, DS-2413, diverse I2C-Komponenten, zigbee2mqtt, ESPEasy etc.

Rudibarani

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