57_SSCal: set compatibility to Calendar package 2.3.4-0631, some changes according to PBP

git-svn-id: https://svn.fhem.de/fhem/trunk@21776 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
DS_Starter
2020-04-25 19:53:14 +00:00
parent 13812a1ab9
commit c3cf946e8a
3 changed files with 730 additions and 701 deletions

View File

@@ -1,5 +1,7 @@
# Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # Add changes at the top of the list. Keep it in ASCII, and 80-char wide.
# Do not insert empty lines here, update check depends on it. # Do not insert empty lines here, update check depends on it.
- feature: 57_SSCal: set compatibility to Calendar package 2.3.4-0631,
some changes according to PBP
- change: 73_GardenaSmartBridge: change state value to Connected - change: 73_GardenaSmartBridge: change state value to Connected
- change: 37_echodevice.pm more loginformations set "NPM_login refresh" - change: 37_echodevice.pm more loginformations set "NPM_login refresh"
- bugfix: 88_HMCCU: Fixed bug in RPC callback URL creation. - bugfix: 88_HMCCU: Fixed bug in RPC callback URL creation.

File diff suppressed because it is too large Load Diff

View File

@@ -344,11 +344,11 @@ return;
} }
################################################################ ################################################################
sub SSCal_Attr { sub SSCal_Attr { ## no critic 'complexity'
my ($cmd,$name,$aName,$aVal) = @_; my ($cmd,$name,$aName,$aVal) = @_;
my $hash = $defs{$name}; my $hash = $defs{$name};
my $model = $hash->{MODEL}; my $model = $hash->{MODEL};
my ($do,$val,$cache); my ($do,$val);
# $cmd can be "del" or "set" # $cmd can be "del" or "set"
# $name is device name # $name is device name
@@ -422,7 +422,7 @@ return;
} }
################################################################ ################################################################
sub SSCal_Set { sub SSCal_Set { ## no critic 'complexity'
my ($hash, @a) = @_; my ($hash, @a) = @_;
return "\"set X\" needs at least an argument" if ( @a < 2 ); return "\"set X\" needs at least an argument" if ( @a < 2 );
my $name = $a[0]; my $name = $a[0];
@@ -441,7 +441,7 @@ sub SSCal_Set {
# alle aktuell angezeigten Event Id's ermitteln # alle aktuell angezeigten Event Id's ermitteln
my (@idarray,$evids); my (@idarray,$evids);
foreach my $key (keys %{$defs{$name}{READINGS}}) { for my $key (keys %{$defs{$name}{READINGS}}) {
next if $key !~ /^.*_EventId$/; next if $key !~ /^.*_EventId$/;
push (@idarray, $defs{$name}{READINGS}{$key}{VAL}); push (@idarray, $defs{$name}{READINGS}{$key}{VAL});
} }
@@ -499,7 +499,7 @@ sub SSCal_Set {
my $sub = sub { my $sub = sub {
my ($idx) = @_; my ($idx) = @_;
my $ret; my $ret;
foreach my $key (reverse sort keys %{$data{SSCal}{$name}{sendqueue}{entries}{$idx}}) { for my $key (reverse sort keys %{$data{SSCal}{$name}{sendqueue}{entries}{$idx}}) {
$ret .= ", " if($ret); $ret .= ", " if($ret);
$ret .= $key."=>".$data{SSCal}{$name}{sendqueue}{entries}{$idx}{$key}; $ret .= $key."=>".$data{SSCal}{$name}{sendqueue}{entries}{$idx}{$key};
} }
@@ -510,7 +510,7 @@ sub SSCal_Set {
return "SendQueue is empty."; return "SendQueue is empty.";
} }
my $sq; my $sq;
foreach my $idx (sort{$a<=>$b} keys %{$data{SSCal}{$name}{sendqueue}{entries}}) { for my $idx (sort{$a<=>$b} keys %{$data{SSCal}{$name}{sendqueue}{entries}}) {
$sq .= $idx." => ".$sub->($idx)."\n"; $sq .= $idx." => ".$sub->($idx)."\n";
} }
return $sq; return $sq;
@@ -522,7 +522,7 @@ sub SSCal_Set {
$data{SSCal}{$name}{sendqueue}{index} = 0; $data{SSCal}{$name}{sendqueue}{index} = 0;
return "All entries of SendQueue are deleted"; return "All entries of SendQueue are deleted";
} elsif($prop eq "-permError-") { } elsif($prop eq "-permError-") {
foreach my $idx (keys %{$data{SSCal}{$name}{sendqueue}{entries}}) { for my $idx (keys %{$data{SSCal}{$name}{sendqueue}{entries}}) {
delete $data{SSCal}{$name}{sendqueue}{entries}{$idx} delete $data{SSCal}{$name}{sendqueue}{entries}{$idx}
if($data{SSCal}{$name}{sendqueue}{entries}{$idx}{forbidSend}); if($data{SSCal}{$name}{sendqueue}{entries}{$idx}{forbidSend});
} }
@@ -632,7 +632,7 @@ sub SSCal_Set {
# Blocknummer ermitteln # Blocknummer ermitteln
my $bnr; my $bnr;
my @allrds = keys%{$defs{$name}{READINGS}}; my @allrds = keys%{$defs{$name}{READINGS}};
foreach my $key(@allrds) { for my $key(@allrds) {
next if $key !~ /^.*_EventId$/; next if $key !~ /^.*_EventId$/;
$bnr = (split("_", $key))[0] if($defs{$name}{READINGS}{$key}{VAL} == $eventid); # Blocknummer ermittelt $bnr = (split("_", $key))[0] if($defs{$name}{READINGS}{$key}{VAL} == $eventid); # Blocknummer ermittelt
} }
@@ -678,7 +678,7 @@ return;
} }
################################################################ ################################################################
sub SSCal_Get { sub SSCal_Get { ## no critic 'complexity'
my ($hash, @a) = @_; my ($hash, @a) = @_;
return "\"get X\" needs at least an argument" if ( @a < 2 ); return "\"get X\" needs at least an argument" if ( @a < 2 );
my $name = shift @a; my $name = shift @a;
@@ -754,7 +754,7 @@ sub SSCal_Get {
$ret .= "<tr class=\"even\">"; $ret .= "<tr class=\"even\">";
if($arg && $arg =~ /[\d]+/x) { if($arg && $arg =~ /[\d]+/x) {
my @hints = split(",",$arg); my @hints = split(",",$arg);
foreach (@hints) { for (@hints) {
if(AttrVal("global","language","EN") eq "DE") { if(AttrVal("global","language","EN") eq "DE") {
$hs{$_} = $SSCal_vHintsExt_de{$_}; $hs{$_} = $SSCal_vHintsExt_de{$_};
} else { } else {
@@ -769,7 +769,7 @@ sub SSCal_Get {
} }
} }
$i = 0; $i = 0;
foreach my $key (SSCal_sortVersion("desc",keys %hs)) { for my $key (SSCal_sortVersion("desc",keys %hs)) {
$val0 = $hs{$key}; $val0 = $hs{$key};
$ret .= sprintf("<td style=\"vertical-align:top\"><b>$key</b> </td><td style=\"vertical-align:top\">$val0</td>" ); $ret .= sprintf("<td style=\"vertical-align:top\"><b>$key</b> </td><td style=\"vertical-align:top\">$val0</td>" );
$ret .= "</tr>"; $ret .= "</tr>";
@@ -794,7 +794,7 @@ sub SSCal_Get {
$ret .= "<tbody>"; $ret .= "<tbody>";
$ret .= "<tr class=\"even\">"; $ret .= "<tr class=\"even\">";
$i = 0; $i = 0;
foreach my $key (SSCal_sortVersion("desc",keys %SSCal_vNotesExtern)) { for my $key (SSCal_sortVersion("desc",keys %SSCal_vNotesExtern)) {
($val0,$val1) = split(/\s/,$SSCal_vNotesExtern{$key},2); ($val0,$val1) = split(/\s/,$SSCal_vNotesExtern{$key},2);
$ret .= sprintf("<td style=\"vertical-align:top\"><b>$key</b> </td><td style=\"vertical-align:top\">$val0 </td><td>$val1</td>" ); $ret .= sprintf("<td style=\"vertical-align:top\"><b>$key</b> </td><td style=\"vertical-align:top\">$val0 </td><td>$val1</td>" );
$ret .= "</tr>"; $ret .= "</tr>";
@@ -1036,7 +1036,7 @@ sub SSCal_getapisites {
} }
# den nächsten Eintrag aus "SendQueue" selektieren und ausführen wenn nicht forbidSend gesetzt ist # den nächsten Eintrag aus "SendQueue" selektieren und ausführen wenn nicht forbidSend gesetzt ist
foreach my $idx (sort{$a<=>$b} keys %{$data{SSCal}{$name}{sendqueue}{entries}}) { for my $idx (sort{$a<=>$b} keys %{$data{SSCal}{$name}{sendqueue}{entries}}) {
if (!$data{SSCal}{$name}{sendqueue}{entries}{$idx}{forbidSend}) { if (!$data{SSCal}{$name}{sendqueue}{entries}{$idx}{forbidSend}) {
$hash->{OPIDX} = $idx; $hash->{OPIDX} = $idx;
$hash->{OPMODE} = $data{SSCal}{$name}{sendqueue}{entries}{$idx}{opmode}; $hash->{OPMODE} = $data{SSCal}{$name}{sendqueue}{entries}{$idx}{opmode};
@@ -1087,7 +1087,7 @@ return;
#################################################################################### ####################################################################################
# Auswertung Abruf apisites # Auswertung Abruf apisites
#################################################################################### ####################################################################################
sub SSCal_getapisites_parse { sub SSCal_getapisites_parse { ## no critic 'complexity'
my ($param, $err, $myjson) = @_; my ($param, $err, $myjson) = @_;
my $hash = $param->{hash}; my $hash = $param->{hash};
my $name = $hash->{NAME}; my $name = $hash->{NAME};
@@ -1338,7 +1338,7 @@ return;
############################################################################################# #############################################################################################
# Callback from SSCal_calop # Callback from SSCal_calop
############################################################################################# #############################################################################################
sub SSCal_calop_parse { sub SSCal_calop_parse { ## no critic 'complexity'
my ($param, $err, $myjson) = @_; my ($param, $err, $myjson) = @_;
my $hash = $param->{hash}; my $hash = $param->{hash};
my $name = $hash->{NAME}; my $name = $hash->{NAME};
@@ -1428,7 +1428,7 @@ sub SSCal_calop_parse {
my @newa; my @newa;
my $list = $modules{$hash->{TYPE}}{AttrList}; my $list = $modules{$hash->{TYPE}}{AttrList};
my @deva = split(" ", $list); my @deva = split(" ", $list);
foreach (@deva) { for (@deva) {
push @newa, $_ if($_ !~ /usedCalendars:/); push @newa, $_ if($_ !~ /usedCalendars:/);
} }
@@ -1548,7 +1548,7 @@ return;
############################################################################################# #############################################################################################
# Extrahiert empfangene Kalendertermine (Events) # Extrahiert empfangene Kalendertermine (Events)
############################################################################################# #############################################################################################
sub SSCal_extractEventlist { sub SSCal_extractEventlist { ## no critic 'complexity'
my ($name) = @_; my ($name) = @_;
my $hash = $defs{$name}; my $hash = $defs{$name};
my $data = delete $hash->{eventlist}; # zentrales Eventhash löschen ! my $data = delete $hash->{eventlist}; # zentrales Eventhash löschen !
@@ -1563,7 +1563,7 @@ sub SSCal_extractEventlist {
my $datetimeend = FmtDateTime($tend); my $datetimeend = FmtDateTime($tend);
my $n = 0; # Zusatz f. lfd. Nr. zur Unterscheidung exakt zeitgleicher Events my $n = 0; # Zusatz f. lfd. Nr. zur Unterscheidung exakt zeitgleicher Events
foreach my $key (keys %{$data->{data}}) { for my $key (keys %{$data->{data}}) {
my $i = 0; my $i = 0;
while ($data->{data}{$key}[$i]) { while ($data->{data}{$key}[$i]) {
@@ -1631,7 +1631,7 @@ sub SSCal_extractEventlist {
# Format: FREQ=YEARLY;COUNT=1;INTERVAL=2;BYMONTHDAY=15;BYMONTH=10;UNTIL=2020-12-31T00:00:00 # Format: FREQ=YEARLY;COUNT=1;INTERVAL=2;BYMONTHDAY=15;BYMONTH=10;UNTIL=2020-12-31T00:00:00
my @para = split(";", $rr); my @para = split(";", $rr);
foreach my $par (@para) { for my $par (@para) {
my ($p1,$p2) = split("=", $par); my ($p1,$p2) = split("=", $par);
if ($p1 eq "FREQ") { if ($p1 eq "FREQ") {
$freq = $p2; $freq = $p2;
@@ -1767,7 +1767,7 @@ sub SSCal_extractEventlist {
my ($nbhh,$nbmm,$nbss,$nehh,$nemm,$ness,$rDayOfWeekNew,$rDaysToAddOrSub,$rNewTime); my ($nbhh,$nbmm,$nbss,$nehh,$nemm,$ness,$rDayOfWeekNew,$rDaysToAddOrSub,$rNewTime);
my @ByDays = split(",", $byday); # Array der Wiederholungstage my @ByDays = split(",", $byday); # Array der Wiederholungstage
foreach (@ByDays) { for (@ByDays) {
my $rByDay = $_; # das erste Wiederholungselement my $rByDay = $_; # das erste Wiederholungselement
my $rByDayLength = length($rByDay); # die Länge des Strings my $rByDayLength = length($rByDay); # die Länge des Strings
@@ -1865,7 +1865,7 @@ sub SSCal_extractEventlist {
while ($ci<$count) { while ($ci<$count) {
$rNewTime = $btsstart; $rNewTime = $btsstart;
foreach (@ByDays) { for (@ByDays) {
$ci++; $ci++;
my $rByDay = $_; # das erste Wiederholungselement my $rByDay = $_; # das erste Wiederholungselement
my @weekdays = qw(SU MO TU WE TH FR SA); my @weekdays = qw(SU MO TU WE TH FR SA);
@@ -2060,15 +2060,15 @@ return SSCal_createReadings ("$name|$rowlist"); # synchoner Mode
############################################################################################# #############################################################################################
# Extrahiert empfangene Tasks aus ToDo-Kalender (Aufgabenliste) # Extrahiert empfangene Tasks aus ToDo-Kalender (Aufgabenliste)
############################################################################################# #############################################################################################
sub SSCal_extractToDolist { sub SSCal_extractToDolist { ## no critic 'complexity'
my ($name) = @_; my ($name) = @_;
my $hash = $defs{$name}; my $hash = $defs{$name};
my $data = delete $hash->{eventlist}; my $data = delete $hash->{eventlist};
my $am = AttrVal($name, "asyncMode", 0); my $am = AttrVal($name, "asyncMode", 0);
my ($val,$tz,$td,$d,$t,$uts); my ($val,$tz,$td,$d,$t,$uts);
my ($bdate,$btime,$bts,$edate,$etime,$ets,$ci,$numday,$bi,$ei,$startEndDiff,$excl); my ($bdate,$btime,$bts,$edate,$etime,$ets,$ci,$bi,$ei,$startEndDiff,$excl);
my ($bmday,$bmonth,$emday,$emonth,$byear,$eyear,$nbdate,$nbtime,$nbts,$nedate,$netime,$nets,$ydiff); my ($bmday,$bmonth,$emday,$emonth,$byear,$eyear,$nbdate,$nbtime,$nbts,$nedate,$netime,$nets);
my @row_array; my @row_array;
my (undef,$tstart,$tend) = SSCal_timeEdge($name); # Sollstart- und Sollendezeit der Kalenderereignisse ermitteln my (undef,$tstart,$tend) = SSCal_timeEdge($name); # Sollstart- und Sollendezeit der Kalenderereignisse ermitteln
@@ -2076,7 +2076,7 @@ sub SSCal_extractToDolist {
my $datetimeend = FmtDateTime($tend); my $datetimeend = FmtDateTime($tend);
my $n = 0; my $n = 0;
foreach my $key (keys %{$data->{data}}) { for my $key (keys %{$data->{data}}) {
my $i = 0; my $i = 0;
while ($data->{data}{$key}[$i]) { while ($data->{data}{$key}[$i]) {
@@ -2167,7 +2167,7 @@ sub SSCal_createReadings {
my @row_array = split("_ESC_", $rowlist); my @row_array = split("_ESC_", $rowlist);
# zentrales Datenhash füllen (erzeugt dadurch sortierbare Keys) # zentrales Datenhash füllen (erzeugt dadurch sortierbare Keys)
foreach my $row (@row_array) { for my $row (@row_array) {
chomp $row; chomp $row;
my @r = split(" ", $row, 3); my @r = split(" ", $row, 3);
$data{SSCal}{$name}{eventlist}{$r[0]}{$r[1]} = $r[2]; $data{SSCal}{$name}{eventlist}{$r[0]}{$r[1]} = $r[2];
@@ -2182,11 +2182,11 @@ sub SSCal_createReadings {
$data{SSCal}{$name}{lstUpdtTs} = $hash->{".updateTime"}; # letzte Updatezeit speichern (Unix Format) $data{SSCal}{$name}{lstUpdtTs} = $hash->{".updateTime"}; # letzte Updatezeit speichern (Unix Format)
my $k = 0; my $k = 0;
foreach my $idx (sort keys %{$data{SSCal}{$name}{eventlist}}) { for my $idx (sort keys %{$data{SSCal}{$name}{eventlist}}) {
my $idxstr = sprintf("%0$l.0f", $k); # Blocknummer erstellen my $idxstr = sprintf("%0$l.0f", $k); # Blocknummer erstellen
push(@abnr, $idxstr); # Array aller vorhandener Blocknummern erstellen push(@abnr, $idxstr); # Array aller vorhandener Blocknummern erstellen
foreach my $r (keys %{$data{SSCal}{$name}{eventlist}{$idx}}) { for my $r (keys %{$data{SSCal}{$name}{eventlist}{$idx}}) {
if($r =~ /.*Timestamp$/x) { # Readings mit Unix Timestamps versteckt erstellen if($r =~ /.*Timestamp$/x) { # Readings mit Unix Timestamps versteckt erstellen
readingsBulkUpdate($hash, ".".$idxstr."_".$r, $data{SSCal}{$name}{eventlist}{$idx}{$r}); readingsBulkUpdate($hash, ".".$idxstr."_".$r, $data{SSCal}{$name}{eventlist}{$idx}{$r});
} else { } else {
@@ -2245,7 +2245,7 @@ sub SSCal_doCompositeEvents {
} }
CommandTrigger(undef, "$name $event"); CommandTrigger(undef, "$name $event");
foreach my $bnr (@{$abnr}) { for my $bnr (@{$abnr}) {
$summary = ReadingsVal($name, $bnr."_01_Summary", ""); $summary = ReadingsVal($name, $bnr."_01_Summary", "");
$desc = ReadingsVal($name, $bnr."_03_Description", ""); $desc = ReadingsVal($name, $bnr."_03_Description", "");
$begin = ReadingsVal($name, $bnr."_05_Begin", ""); $begin = ReadingsVal($name, $bnr."_05_Begin", "");
@@ -2284,13 +2284,13 @@ sub SSCal_createATdevices {
readingsDelete($hash,".associatedWith"); # Deviceassoziationen löschen readingsDelete($hash,".associatedWith"); # Deviceassoziationen löschen
@devs = devspec2array("TYPE=at:FILTER=NAME=SSCal.$name.*"); @devs = devspec2array("TYPE=at:FILTER=NAME=SSCal.$name.*");
foreach (@devs) { for (@devs) {
next if(!$defs{$_}); next if(!$defs{$_});
Log3($name, 4, "$name - delete device: $_"); Log3($name, 4, "$name - delete device: $_");
CommandDelete(undef,$_); CommandDelete(undef,$_);
} }
foreach my $bnr (@{$abnr}) { for my $bnr (@{$abnr}) {
$summary = ReadingsVal($name, $bnr."_01_Summary", ""); $summary = ReadingsVal($name, $bnr."_01_Summary", "");
$desc = ReadingsVal($name, $bnr."_03_Description", ""); $desc = ReadingsVal($name, $bnr."_03_Description", "");
$begin = ReadingsVal($name, $bnr."_05_Begin", ""); $begin = ReadingsVal($name, $bnr."_05_Begin", "");
@@ -2390,7 +2390,7 @@ return ($nbss,$nbmm,$nbhh,$bmday,$bmonth,$byear,$ness,$nemm,$nehh,$emday,$emonth
# (Index aus BeginTimestamp + lfNr) , (Blockindex_Reading) , (Wert) # (Index aus BeginTimestamp + lfNr) , (Blockindex_Reading) , (Wert)
# #
############################################################################################# #############################################################################################
sub SSCal_writeValuesToArray { sub SSCal_writeValuesToArray { ## no critic 'complexity'
my ($name,$n,$vh,$tz,$bdate,$btime,$bts,$edate,$etime,$ets,$aref,$uid) = @_; my ($name,$n,$vh,$tz,$bdate,$btime,$bts,$edate,$etime,$ets,$aref,$uid) = @_;
my @row_array = @{$aref}; my @row_array = @{$aref};
my $hash = $defs{$name}; my $hash = $defs{$name};
@@ -2437,7 +2437,7 @@ sub SSCal_writeValuesToArray {
my $isRecurrence = 0; my $isRecurrence = 0;
my $isAlldaychanded; # 0 -> Ganztagsevent wurde in Serienelement geändert in kein Ganztagsevent my $isAlldaychanded; # 0 -> Ganztagsevent wurde in Serienelement geändert in kein Ganztagsevent
foreach (keys %{$data{SSCal}{$name}{vcalendar}{"$uid"}{VALM}{RECURRENCEID}}) { # $isRecurrence = 1 setzen wenn für die aktuelle Originalstartzeit ($bts) eine RECURRENCEID vorliegt -> Veränderung ist vorhanden for (keys %{$data{SSCal}{$name}{vcalendar}{"$uid"}{VALM}{RECURRENCEID}}) { # $isRecurrence = 1 setzen wenn für die aktuelle Originalstartzeit ($bts) eine RECURRENCEID vorliegt -> Veränderung ist vorhanden
next if(!$data{SSCal}{$name}{vcalendar}{"$uid"}{VALM}{RECURRENCEID}{$_}); next if(!$data{SSCal}{$name}{vcalendar}{"$uid"}{VALM}{RECURRENCEID}{$_});
$isRecurrence = 1 if($data{SSCal}{$name}{vcalendar}{"$uid"}{VALM}{RECURRENCEID}{$_} eq $origdtstart); $isRecurrence = 1 if($data{SSCal}{$name}{vcalendar}{"$uid"}{VALM}{RECURRENCEID}{$_} eq $origdtstart);
} }
@@ -2445,7 +2445,7 @@ sub SSCal_writeValuesToArray {
my $l = length (keys %{$data{SSCal}{$name}{vcalendar}{"$uid"}{VALM}{TIMEVALUE}}); # Anzahl Stellen (Länge) des aktuellen VALM TIMEVALUE Hashes my $l = length (keys %{$data{SSCal}{$name}{vcalendar}{"$uid"}{VALM}{TIMEVALUE}}); # Anzahl Stellen (Länge) des aktuellen VALM TIMEVALUE Hashes
my $ens = 0; my $ens = 0;
foreach (keys %{$data{SSCal}{$name}{vcalendar}{"$uid"}{VALM}{TIMEVALUE}}) { for (keys %{$data{SSCal}{$name}{vcalendar}{"$uid"}{VALM}{TIMEVALUE}}) {
my $z = $_; my $z = $_;
$val = encode("UTF-8", $data{SSCal}{$name}{vcalendar}{"$uid"}{VALM}{TIMEVALUE}{$z}); $val = encode("UTF-8", $data{SSCal}{$name}{vcalendar}{"$uid"}{VALM}{TIMEVALUE}{$z});
@@ -2471,7 +2471,7 @@ sub SSCal_writeValuesToArray {
} }
# restliche Keys extrahieren # restliche Keys extrahieren
foreach my $p (keys %{$vh}) { for my $p (keys %{$vh}) {
$vh->{$p} = "" if(!defined $vh->{$p}); $vh->{$p} = "" if(!defined $vh->{$p});
$vh->{$p} = SSCal_jboolmap($vh->{$p}); $vh->{$p} = SSCal_jboolmap($vh->{$p});
next if($vh->{$p} eq ""); next if($vh->{$p} eq "");
@@ -2484,7 +2484,7 @@ sub SSCal_writeValuesToArray {
if($p eq "gps") { if($p eq "gps") {
my ($address,$lng,$lat) = ("","",""); my ($address,$lng,$lat) = ("","","");
foreach my $r (keys %{$vh->{gps}}) { for my $r (keys %{$vh->{gps}}) {
$vh->{$p}{$r} = "" if(!defined $vh->{$p}{$r}); $vh->{$p}{$r} = "" if(!defined $vh->{$p}{$r});
next if($vh->{$p}{$r} eq ""); next if($vh->{$p}{$r} eq "");
if ($r eq "address") { if ($r eq "address") {
@@ -2513,7 +2513,7 @@ sub SSCal_writeValuesToArray {
push(@row_array, $bts+$n." 90_calName " .SSCal_getCalFromId($hash,$val)."\n") if($p eq "original_cal_id"); push(@row_array, $bts+$n." 90_calName " .SSCal_getCalFromId($hash,$val)."\n") if($p eq "original_cal_id");
if($p eq "evt_repeat_setting") { if($p eq "evt_repeat_setting") {
foreach my $r (keys %{$vh->{evt_repeat_setting}}) { for my $r (keys %{$vh->{evt_repeat_setting}}) {
$vh->{$p}{$r} = "" if(!defined $vh->{$p}{$r}); $vh->{$p}{$r} = "" if(!defined $vh->{$p}{$r});
next if($vh->{$p}{$r} eq ""); next if($vh->{$p}{$r} eq "");
$val = encode("UTF-8", $vh->{$p}{$r}); $val = encode("UTF-8", $vh->{$p}{$r});
@@ -2581,7 +2581,7 @@ sub SSCal_extractIcal {
my $do = 0; my $do = 0;
$n = 0; $n = 0;
foreach (@ical) { for (@ical) {
if($_ =~ m/^([-A-Z]*;).*/) { if($_ =~ m/^([-A-Z]*;).*/) {
($k,$v) = split(";", $_, 2); ($k,$v) = split(";", $_, 2);
} else { } else {
@@ -2621,7 +2621,7 @@ sub SSCal_extractIcal {
$n = 0; $n = 0;
while ($vh->{evt_notify_setting}[$n]) { while ($vh->{evt_notify_setting}[$n]) {
foreach (keys %{$vh->{evt_notify_setting}[$n]}) { for (keys %{$vh->{evt_notify_setting}[$n]}) {
if($_ eq "recurrence-id") { if($_ eq "recurrence-id") {
$valm{$n}{RECURRENCEID} = SSCal_icalTimecheck ($name,$vh->{evt_notify_setting}[$n]{$_}); $valm{$n}{RECURRENCEID} = SSCal_icalTimecheck ($name,$vh->{evt_notify_setting}[$n]{$_});
} }
@@ -3363,7 +3363,7 @@ sub SSCal_getclhash {
my $outdev; my $outdev;
my @webdvs = devspec2array("TYPE=FHEMWEB:FILTER=canAsyncOutput=1:FILTER=STATE=Connected"); my @webdvs = devspec2array("TYPE=FHEMWEB:FILTER=canAsyncOutput=1:FILTER=STATE=Connected");
my $i = 1; my $i = 1;
foreach (@webdvs) { for (@webdvs) {
$outdev = $_; $outdev = $_;
next if(!$defs{$outdev}); next if(!$defs{$outdev});
$hash->{HELPER}{CL}{$i}->{NAME} = $defs{$outdev}{NAME}; $hash->{HELPER}{CL}{$i}->{NAME} = $defs{$outdev}{NAME};
@@ -3401,7 +3401,7 @@ sub SSCal_getCalFromId {
my $cal = ""; my $cal = "";
$cid = SSCal_trim($cid); $cid = SSCal_trim($cid);
foreach my $calname (keys %{$hash->{HELPER}{CALENDARS}}) { for my $calname (keys %{$hash->{HELPER}{CALENDARS}}) {
my $oid = $hash->{HELPER}{CALENDARS}{"$calname"}{id}; my $oid = $hash->{HELPER}{CALENDARS}{"$calname"}{id};
next if(!$oid); next if(!$oid);
$oid = SSCal_trim($oid); $oid = SSCal_trim($oid);
@@ -3440,7 +3440,7 @@ sub SSCal_delReadings {
$excl .= "|lastUpdate" if($respts); $excl .= "|lastUpdate" if($respts);
my @allrds = keys%{$defs{$name}{READINGS}}; my @allrds = keys%{$defs{$name}{READINGS}};
foreach my $key(@allrds) { for my $key(@allrds) {
if($respts) { if($respts) {
$lu = $data{SSCal}{$name}{lastUpdate}; $lu = $data{SSCal}{$name}{lastUpdate};
$rts = ReadingsTimestamp($name, $key, $lu); $rts = ReadingsTimestamp($name, $key, $lu);
@@ -3497,7 +3497,7 @@ sub SSCal_explodeDateTime {
if($dt eq $dtstart) {$checkbegin = 1} else {$checkbegin = 0}; if($dt eq $dtstart) {$checkbegin = 1} else {$checkbegin = 0};
if ($checkbegin) { if ($checkbegin) {
# prüfen ob DTSTART verändert # prüfen ob DTSTART verändert
foreach (keys %{$data{SSCal}{$name}{vcalendar}{"$uid"}{RECURRENCEID}}) { for (keys %{$data{SSCal}{$name}{vcalendar}{"$uid"}{RECURRENCEID}}) {
next if(!$data{SSCal}{$name}{vcalendar}{"$uid"}{RECURRENCEID}{$_}); next if(!$data{SSCal}{$name}{vcalendar}{"$uid"}{RECURRENCEID}{$_});
$z = $_ if($data{SSCal}{$name}{vcalendar}{"$uid"}{RECURRENCEID}{$_} eq $dtstart); $z = $_ if($data{SSCal}{$name}{vcalendar}{"$uid"}{RECURRENCEID}{$_} eq $dtstart);
} }
@@ -3509,7 +3509,7 @@ sub SSCal_explodeDateTime {
} }
} else { } else {
# prüfen ob DTEND verändert # prüfen ob DTEND verändert
foreach (keys %{$data{SSCal}{$name}{vcalendar}{"$uid"}{RECURRENCEID}}) { for (keys %{$data{SSCal}{$name}{vcalendar}{"$uid"}{RECURRENCEID}}) {
next if(!$data{SSCal}{$name}{vcalendar}{"$uid"}{RECURRENCEID}{$_}); next if(!$data{SSCal}{$name}{vcalendar}{"$uid"}{RECURRENCEID}{$_});
$z = $_ if($data{SSCal}{$name}{vcalendar}{"$uid"}{RECURRENCEID}{$_} eq $dtstart); $z = $_ if($data{SSCal}{$name}{vcalendar}{"$uid"}{RECURRENCEID}{$_} eq $dtstart);
} }
@@ -3633,7 +3633,7 @@ return $bool;
############################################################################################# #############################################################################################
# Kalenderliste als HTML-Tabelle zurückgeben # Kalenderliste als HTML-Tabelle zurückgeben
############################################################################################# #############################################################################################
sub SSCal_calAsHtml { sub SSCal_calAsHtml { ## no critic 'complexity'
my ($name,$FW_wname) = @_; my ($name,$FW_wname) = @_;
my $hash = $defs{$name}; my $hash = $defs{$name};
my $lang = AttrVal("global", "language", "EN"); my $lang = AttrVal("global", "language", "EN");
@@ -3721,7 +3721,7 @@ sub SSCal_calAsHtml {
} }
my $maxbnr; my $maxbnr;
foreach my $key (keys %{$defs{$name}{READINGS}}) { for my $key (keys %{$defs{$name}{READINGS}}) {
next if $key !~ /^(\d+)_\d+_EventId$/; next if $key !~ /^(\d+)_\d+_EventId$/;
$maxbnr = $1 if(!$maxbnr || $1>$maxbnr); $maxbnr = $1 if(!$maxbnr || $1>$maxbnr);
} }
@@ -3910,7 +3910,7 @@ return $out;
# $rdtype: erwarteter Datentyp als Rückgabe (image, string) # $rdtype: erwarteter Datentyp als Rückgabe (image, string)
# #
###################################################################################### ######################################################################################
sub SSCal_evalTableSpecs { sub SSCal_evalTableSpecs { ## no critic 'complexity'
my ($hash,$default,$specs,$bnr,$allrds,$rdtype) = @_; my ($hash,$default,$specs,$bnr,$allrds,$rdtype) = @_;
my $name = $hash->{NAME}; my $name = $hash->{NAME};
my $check; my $check;