Hallo
Leider habe ich doch noch Probleme mit dem Kalender-Modul.
Thread http://forum.fhem.de/index.php/topic,24090.0.html (http://forum.fhem.de/index.php/topic,24090.0.html) ist aber leider geschlossen.
Ich habe es erst nicht bemerkt, da die Heizung bei DEM Wetter aus ist.
An dem Event hängt bei mir aber auch die Freigabe der Warmwasser-Zirkulation.
Boris hat ja die Länge eines Events über "DURATION" eingebaut.
So werden die Einträge (manschmal) vom Thunderbird Lightning und auch vom "CalDAV Sync Adapter" erzeugt.
Es sieht auch erst mal alles gut aus, sprich in der Ansicht für "upcomming" sind die Events auch zu sehen.
Wenn allerdings die Zeit ran ist und der Event auf "start" wechseln müsste ist der Event weg :(
Damit gehen die Schaltfunktionen natürlich nicht.
(bei Wiederholungen taucht der Event natürlich dann später wieder als "upcomming" auf)
folgender Eintrag geht nur als "upcomming"
BEGIN:VEVENT
DTSTAMP:20140525T193109Z
UID:3610a5ceef7f5bae03e019d4c93a9719bfd630de
SUMMARY:Frueh Mo
STATUS:CONFIRMED
ORGANIZER:Heizung
RRULE:FREQ=DAILY;INTERVAL=28
DTSTART;TZID=Europe/Amsterdam:20131028T130000
DESCRIPTION:Eingetragen seit: 28. Oktober 2013
DURATION:PT3600S
END:VEVENT
so gehts als "upcomming" und "start"
BEGIN:VEVENT
LAST-MODIFIED;VALUE=DATE-TIME:20140609T115504Z
DTSTAMP;VALUE=DATE-TIME:20140609T115504Z
UID:3610a5ceef7f5bae03e019d4c93a9719bfd630de
SUMMARY:Frueh Mo
STATUS:CONFIRMED
ORGANIZER:Heizung
RRULE:FREQ=DAILY;INTERVAL=28
DTSTART;VALUE=DATE-TIME;TZID=Europe/Berlin:20131028T130000
DESCRIPTION:Eingetragen seit: 28. Oktober 2013
X-MOZ-GENERATION:1
DTEND;VALUE=DATE-TIME;TZID=Europe/Berlin:20131028T140000
CLASS:PUBLIC
END:VEVENT
Eben habe ich auch den Grund gefunden :
3610a5ceef7f5bae03e019d4c93a9719bfd630de known upcoming 07.07.2014 14:00:00-07.07.2014 14:00:00 Frueh Mo th tab
Wie man sehen kann stimmt das Ende nicht !
Es ist Anfang = Ende und das ist falsch.
Wie es aussieht wird das nicht richtig berechnet :
2014.06.09 17:32:12 1: DEBUG>Duration PT8H
2014.06.09 17:32:12 1: DEBUG>sign: 1 dw: dt: 8H t= 0
2014.06.09 17:32:12 1: DEBUG>Duration PT28800S
2014.06.09 17:32:12 1: DEBUG>sign: 1 dw: dt: 28800S t= 0
2014.06.09 17:32:12 1: DEBUG>Duration PT10800S
2014.06.09 17:32:12 1: DEBUG>sign: 1 dw: dt: 10800S t= 0
2014.06.09 17:32:12 1: DEBUG>Duration PT2H
2014.06.09 17:32:12 1: DEBUG>sign: 1 dw: dt: 2H t= 0
2014.06.09 17:32:12 1: DEBUG>Duration PT5400S
2014.06.09 17:32:12 1: DEBUG>sign: 1 dw: dt: 5400S t= 0
Im Code wird aber $t zurück gegeben und das ist ja immer 0.
main::Debug "sign: $sign dw: $dw dt: $dt t= $t";
return $t;
Ich habe versucht es zu debugen und komme bis hier hin :
if($dt =~ m/^(\d+)H(\d+)M(\d+)S$/) {
$t+= $1*3600+$2*60+$3;
}
Die Berechnung nacht dem "if" wird aber nicht ausgeführt ( ich habe da mal ein main::Debug rein gesetzt).
Leider bin ich nicht so fitt in Perl um heraus zu bekommen warum das "if" schief geht.
p.s.
Mit diesen Ergänzungen gibt es ein paar weniger Meckermeldungen im Log:
--- /opt/fhem/FHEM/57_Calendar.pm.org 2014-06-09 13:45:19.485259308 +0200
+++ 57_Calendar.pm 2014-06-09 18:37:22.696572520 +0200
@@ -413,12 +413,12 @@
sub summary {
my ($self)= @_;
- return $self->{summary};
+ return $self->{summary} ? $self->{summary} : "";
}
sub location {
my ($self)= @_;
- return $self->{location};
+ return $self->{location} ? $self->{location} : "";
}
@@ -426,7 +426,7 @@
my ($self)= @_;
return sprintf("%s %s",
ts0($self->{start}),
- $self->{summary}
+ $self->{summary} ? $self->{summary} : ""
);
}
@@ -439,8 +439,8 @@
$self->{alarm} ? ts($self->{alarm}) : " ",
ts($self->{start}),
ts($self->{end}),
- $self->{summary},
- $self->{location}
+ $self->{summary} ? $self->{summary} : " ",
+ $self->{location} ? $self->{location} : " "
);
}
Nur die habe ich nicht weg bekommen :
Use of uninitialized value in numeric ne (!=) at ./FHEM/57_Calendar.pm line 694
Gruß Ronald
Danke, Ronald, fürs Debuggen.
Schaue am kommenden Wochenende danach.
Grüße
Boris
Hallo Ronald,
bitte ersetze dieses
if($dt =~ m/^(\d+)H(\d+)M(\d+)S$/) {
$t+= $1*3600+$2*60+$3;
}
durch dieses
if($dt =~ m/(\d+)H/ {
$t+= $1*3600;
}
if($dt =~ m/(\d+)M/ {
$t+= $1*60;
}
if($dt =~ m/(\d+)S/ {
$t+= $1;
}
bei weiterhin eingeschaltetem Debugging. Ich hoffe, daß dann in $t das richtige Ergebnis geliefert wird. Bitte auch wieder den Debugging-Output hier posten.
Viele Grüße
Boris
Hallo Boris
ok wenn ich die fehlenden Klammern ergänze geht es :)
if($dt =~ m/(\d+)H/) {
$t+= $1*3600;
}
if($dt =~ m/(\d+)M/) {
$t+= $1*60;
}
if($dt =~ m/(\d+)S/) {
$t+= $1;
}
Debugausgabe dann so :
2014.06.14 22:50:33 1: DEBUG>sign: 1 dw: dt: 8H t= 28800
2014.06.14 22:50:33 1: DEBUG>sign: 1 dw: dt: 28800S t= 28800
2014.06.14 22:50:33 1: DEBUG>sign: 1 dw: dt: 10800S t= 10800
2014.06.14 22:50:33 1: DEBUG>sign: 1 dw: dt: 2H t= 7200
2014.06.14 22:50:34 1: DEBUG>sign: 1 dw: dt: 5400S t= 5400
2014.06.14 22:50:34 1: DEBUG>sign: 1 dw: dt: 21600S t= 21600
2014.06.14 22:50:34 1: DEBUG>sign: 1 dw: dt: 55800S t= 55800
2014.06.14 22:50:34 1: DEBUG>sign: 1 dw: dt: 27000S t= 27000
Ich habe leider keinen Eintrag wo eine Kombination von Stunden/Minuten/Sekunden drin ist.
Aber ich denke das wird funktionieren.
Wenn ich die Änderung richtig verstehe dann hat die alte Suche nicht funktioniert weil die Kennzeichen H,M und S nicht alle
gleichzeitig im zu durchsuchenden String vorhanden waren ?
Bei einem update kommt nur noch für fast jeden eingelesenen Eintrag eine Meckermeldung der Art :
Use of uninitialized value in numeric ne (!=) at ./FHEM/57_Calendar.pm line 704.
Leider kann ich aber das Debug in der Zeile davor nicht einschalten, denn dann stürzt FHEM mit dieser Meldung komplett ab :
Undefined subroutine &Calendar::Events::ts called at ./FHEM/57_Calendar.pm line 702.
Ich vermute allerdings das das Problem daran liegt, das nicht alle meiner Kalender-Einträge einen "LAST-MODIFIED"-Eintrag haben.
Und die ohne "LAST-MODIFIED" erzeugen dann die Meckermeldung da das in der internen Tabelle dann undefiniert ist.
Allerdings ist die Zeile "DTSTAMP" zwar was anderes aber wohl zwingend immer vorhanden.
Aus diesem Grund habe ich mal Zeile 349 so geändert :
if(defined($vevent->value("LAST-MODIFIED"))) {
$self->{lastModified}= tm($vevent->value("LAST-MODIFIED"));
#main::Debug "LAST-MOD: $self->{lastModified} ";
} else {
$self->{lastModified}= tm($vevent->value("DTSTAMP"));
#main::Debug "DTSTAMP: $self->{lastModified} ";
}
Damit ist die Meckermeldung weg.
Allerdings weiß ich nicht ob es noch irgendwelche anderen Nebenwirkungen hat.
Gruß Ronald
Super! Danke für Deine Mithilfe.
Ich habe die korrigierte Auswertung von DURATION und die alternative Verwendung der Erstellungszeit bei nicht vorhandener Änderungszeit eines Kalenderereignisses soeben eingecheckt.
Viele Grüße
Boris