Hallo zusammen,
um zukünftige iCals von Feiertagen oder/und Ferien einzubinden (vorausgesetzt, sie sind an der entsprechenden URL zu finden), habe ich mir folgende at-Definitionen gebastelt:
define Neuer_Ferien_Kalender_Check at *10:00 {if ((strftime "%d-%m",localtime) eq "30-12"){fhem ("define Ferien".((strftime "%Y",localtime)+1)." Calendar ical url http://www.schulferien.org/iCal/Ferien/icals/Ferien_Rheinland_Pfalz_".((strftime "%Y",localtime)+1).".ics");; fhem("save")}}
define Neuer_Feiertags_Kalender_Check at *10:00 {if ((strftime "%d-%m",localtime) eq "30-12"){fhem ("define Feiertage".((strftime "%Y",localtime)+1)." Calendar ical url http://www.schulferien.org/iCal/Feiertage/icals/Feiertage_Rheinland_Pfalz_".((strftime "%Y",localtime)+1).".ics");; fhem("save")}}
Damit wird erreicht, dass jeden Tag um 10 Uhr geprüft wird, ob wir den 30.12. haben (at oder DOIF unterstützen bis jetzt keine Datums-Definitionen). Ist dies der Fall, wird ein neues Calendar-Device mit Namen Ferien20xy bzw. Feiertage20xy angelegt - allerdings ohne entsprechende Prüfung, wir gehen einfach aus, dass der Link bzw. das iCal-File existiert!
Die Auswertung bezüglich eines tatsächlichen Ferien- oder Feiertages läuft dann angelehnt an Wiki wie folgt:
define Feiertag dummy
define Feiertag_Check notify Feiertage[0-9]*:modeStart.* {ReadingsVal("Feiertage".(strftime "%Y",localtime), "modeStart", "") =~ "schulferien"? fhem("set Feiertag 1"): fhem("set Feiertag 0")}
define Ferientag dummy
define Ferientag_Check notify Ferien[0-9]*:modeStart.* {ReadingsVal("Ferien".(strftime "%Y",localtime), "modeStart", "") =~ "schulferien"? fhem("set Ferientag 1"): fhem("set Ferientag 0")}
Hi Ralli,
danke, dass du den Code hier veröffentlichst!
Für die Faulen: das aktuelle Jahr wird erstellt mit
{fhem ("define Feiertage".((strftime "%Y",localtime))." Calendar ical url http://www.schulferien.org/iCal/Feiertage/icals/Feiertage_Sachsen_Anhalt_".((strftime "%Y",localtime)).".ics")}
in der Kommandozeile oben + SAVE nicht vergessen.
Übrigens sind schon jetzt die Feiertag ics Dateien für die nächsten hundert Jahre verfügbar :)
Hm, dieses Codebeispiel hat den Nachteil, dass in jedem Jahr ein neues Calendar-Device aufgemacht wird. Das bedeutet, dass alle weiteren Routinen umgeschrieben werden müssen.
Also besser: Am 30.12. das alte löschen. Dann neu anlegen mit den Daten vom kommenden Jahr.
Auch erschließt sich mir nicht der Sinn eines getrennten Dummy für Feiertage und Ferientage, die jeweils nur einen booleschen Wert haben. M.E: besser, eine Funktion "getDayStatus()" einzuführen, die Werte "Feiertag", "Ferientag" etc. liefern kann und ggf. auch als Argument ein beliebiges Datum bekommt.
Zweite Schwäche: so wird jede Stunde der gesamte Kram geholt...
LG
pah
Nein, es muss keine Routine umgeschrieben werden, da der von mir verwendete Notify auf Events in den Readings modeStart aller dem Suchmuster entsprechenden Kalender reagiert, dabei das aktuelle Jahr allerdings für die Readingsabfrage verwendet, um dann entweder Ferientag oder Feiertag zu setzen.
Der zweite "Nachteil" ist auch nicht vorhanden, da Du im jeweiligen Calendar-Device das Poll-Intervall variieren kannst.
Ich habe mich doch eigentlich klar ausgedrückt: Erstens geht es nicht um den kleinen notify oben - sondern in einer komplexen FHEM-Installation greifen sicher mehr Routinen auf den Kalender zu.
Zweitens ist es unprofessionell, Mengen von alten Daten (etwa die Feiertage des abgelaufenen Jahres...) vorzuhalten (sogar in der Konfigurationsdatei steht davon noch etwas). _Wenn_ man das schon unbedingt in einem FHEM-Skript statt in einer ordentlichen und viel besser wartbaren Perl-Subroutine abhandeln will, sollte deshalb das andere Device mindestens deaktiviert, besser komplett gelöscht werden.
Drittens habe ich keinerlei Verständnis für das automatische Anlegen von Devices, wenn diese hinterher noch manuell bearbeitet werden müssen, um ihre Abfragefrequenz zu reduzieren.
Damit ich nicht nur kritisiere, sondern auch hier etwas Positives beitrage:
1. Zu Jahresbeginn wird (einmal, aber durchaus wiederholbar) der aktuelle Ferien- und Feiertagskalender geholt.
2. Diese beiden Dateien werden im FHEM-Verzeichnis abgelegt, können von dort aus einmal pro Tag überprüft und ggf. neu geladen werden.
Einen entsprechende Code werde ich in den nächsten Tagen mal hier posten.
LG
pah
Ich habe mich genau so klar ausgedrückt. Du musst den Code nicht nehmen und nicht professionell finden - das ist aber egal. Denn jeder kann ihn für sich selbst entweder so nehmen oder umschreiben.
Hallo Zusammen,
@Ralli , danke !
mir hat das für meine Thematik schon etwas geholfen. Habe die Feier- und Ferientage in meine eigene
owncloud importiert und trage dann bei Bedarf z.b. schulfreien Tage per Hand dazu (okay nicht soooo elegant).
Den Kalender lese ich (zylisch) ein und prüfe ob da ein String "ferien" vorkommt , fülle ein dummy (0 ider 1)
und benutze das dann für weitere Aufgaben (z.B. Jalousiesteuerung) ....leider tut´s noch nicht wirklich ::)
@pah
ZitatEinen entsprechende Code werde ich in den nächsten Tagen mal hier posten.
würde mich interessieren !
klaus
Mach ich doch glatt.
In myUtils.pm:
sub getCalendar(){
my $ret;
my $year=strftime("%Y",localtime);
$ret = system("wget -O feiertage.ics http://www.schulferien.org/iCal/Feiertage/icals/Feiertage_Baden_Wuerttemberg_".$year.".ics");
$ret = system("wget -O ferien.ics http://www.schulferien.org/iCal/Ferien/icals/Ferien_Baden_Wuerttemberg_".$year.".ics");
};
sub getDayStatus(){
my $ret;
my $msg;
my @lines;
my $date;
my $desc;
#strftime "%d-%m",localtime
$ret = fhem("get Feiertage text modeAlarmOrStart");
if( $ret ne ""){
@lines = split('\n',$ret);
$date = substr($lines[0],0,8);
$desc = substr($lines[0],15);
$msg = "$desc $date";
fhem("set Tagesstatus $desc");
fhem("set Tagesmode Feiertag");
}else{
$ret = fhem("get Ferien text modeAlarmOrStart");
if( $ret ne ""){
@lines = split('\n',$ret);
$date = substr($lines[0],0,8);
$desc = substr($lines[0],15);
$msg = "$desc $date";
fhem("set Tagesstatus $desc");
fhem("set Tagesmode Ferien");
}else{
if( strftime("%u",localtime) > 5 ){
$msg = "Wochenende";
fhem("set Tagesstatus $msg");
fhem("set Tagesmode $msg");
}else{
$msg = "Arbeitstag";
fhem("set Tagesstatus $msg");
fhem("set Tagesmode $msg");
}
}
}
return $msg;
}
sub checkCalendars($){
my ($period) = @_;
#-- Start oder Alarm stündlich
if( ($period eq 'hour') || ($period eq '') ){
my $text;
my $hash = $defs{'Termin'};
$text = fhem("get Muell text modeAlarmOrStart");
$text = "--" if (!$text);
$text = "--" if ($text eq "");
#fhem("set Termin ".$text);
return $text;
#-- Vorschau täglich oder wenn neu gestartet
}elsif( ($period eq 'day') || (ReadingsVal("Termin","today",0) eq "today") ){
my $stoday = strftime('%2d.%2m.%2y', localtime(time));
my $stomorrow = strftime('%2d.%2m.%2y', localtime(time+86400));
my $stwodays = strftime('%2d.%2m.%2y', localtime(time+2*86400));
my @today = ();
my @tomorrow = ();
my @twodays = ();
my (@lines,$line,@linarr);
@lines = split('\n',fhem("get Muell text modeAlarmOrStart"));
foreach $line (@lines){
#-- line looks as
# 18.05.15 07:00 Restmüllabfuhr
chomp($line);
@linarr = split(' ',$line);
if( $linarr[0] eq $stoday ){
push(@today,$linarr[1]." ".$linarr[2]);
}elsif( $linarr[0] eq $stomorrow ){
push(@tomorrow,$linarr[1]." ".$linarr[2]);
}elsif( $linarr[0] eq $stwodays ){
push(@twodays,$linarr[1]." ".$linarr[2]);
}
}
@lines = split('\n',fhem("get Muell text modeUpcoming"));
foreach $line (@lines){
#-- line looks as
# 18.05.15 07:00 Restmüllabfuhr
chomp($line);
@linarr = split(' ',$line);
if( $linarr[0] eq $stoday ){
push(@today,$linarr[1]." ".$linarr[2]);
}elsif( $linarr[0] eq $stomorrow ){
push(@tomorrow,$linarr[1]." ".$linarr[2]);
}elsif( $linarr[0] eq $stwodays ){
push(@twodays,$linarr[1]." ".$linarr[2]);
}
}
$defs{'Termin'}{READINGS}{'today'}{VAL} = join(" ",@today);
$defs{'Termin'}{READINGS}{'tomorrow'}{VAL} = join(" ",@tomorrow);
$defs{'Termin'}{READINGS}{'twodays'}{VAL} = join(" ",@twodays);
return "today: ".join(" ",@today)."\ntomorrow: ".join(" ",@tomorrow)."\ntwodays: ".join(" ",@twodays);
}
}
Die erste Routine wird einmal zu Jahresbeginn gerufen, holt die Ferienkalender. Eine Datei muell.ics wird manuall erzeugt oder sonstwie generiert.
Dann gibt es in den Konfigurationsdateien noch folgende Einträge:
define I.L.morning at *05:00:00 set OWLCD backlight on;;set RixowTab screenBrightness 255;;set Archos7Tab screenBrightness 255;;{getDayStatus()};;
attr I.L.morning group timer
attr I.L.morning room Kontrollraum
define I.L.daybreak at *00:00:10 {checkCalendars('day')}
attr I.L.daybreak group timer
attr I.L.daybreak room Kontrollraum
define I.L.hour at +*01:00:00 set Termin %EVENT
attr I.L.hour alignTime 00:00
attr I.L.hour group timer
attr I.L.hour room Kontrollraum
define Tagesstatus dummy
attr Tagesstatus group Calendar
attr Tagesstatus room Kontrollraum
define Feiertage Calendar ical file feiertage.ics 86400
attr Feiertage room Kontrollraum
define Ferien Calendar ical file ferien.ics 86400
attr Ferien room Kontrollraum
define Tagesmode dummy
attr Tagesmode group Calendar
attr Tagesmode room Kontrollraum
define Muell Calendar ical file muell.ics
attr Muell group Calendar
attr Muell room Kontrollraum
define Termin dummy
attr Termin group Calendar
attr Termin room Kontrollraum
attr Termin stateFormat active
attr Termin userReadings active {checkCalendars('hour')},today:none {'today'},tomorrow:none {'tomorrow'},twodays:none {'twodays'}
attr Termin verbose 1
define Ticker notify Termin:.* {fhem("set RixowTab tickerMessage ".Value('Termin'));;;;fhem("set Archos7Tab tickerMessage ".Value('Termin'))}
attr Ticker group Calendar
attr Ticker room Kontrollraum
Bewirkt, dass einmal zu Tagesbeginn der Tagesstatus gesetzt wird (10 Sekunden nach Mitternacht) sowie einmal zu jeder vollen Stunde auf einen anstehenden Termin überprüft wird.
Die Anzeig ein FHEM ist nicht sehr komfortabel, das läuft bei mir auf einem Tablet an der Wand, das auf einen separaten Apache Web Server zugreift. Dieser hängt (per imagemagick) an ein generiertes Bild ein nettes kleines Icon an - je nachdem entweder eine kleine farbige Mülltonne (je nach Art der Müllabholung), oder so wie hier eine kleine grüne Kiste mit Altpapier ...
(http://oberfl.png)
LG
pah
@pah , vielen Dank, werd ich mir mal sehen ...
Wer kann mir kurz auf die Sprünge helfen...
im meinem Kalender "BLN_Ferien" steht im reading "modeStart" für heute der Text "ferien" (bzw fe659ee8cf)
über
define BLN_Ferientag dummy
define BLN_Ferien_notify notify BLN_Ferien { fhem "set BLN_Ferientag " . (ReadingsVal("BLN_Ferien", "modeStart", "") =~ "ferien" ? 1: 0) }
soll nun bei der Erkennung des strings "ferien" das dummy auf 0 oder 1 gesetzt werden ! Tut´s aber nicht :'(
auch das ....
define FBLN_Ferien_notify notify BLN_Ferien:modeStart.* {ReadingsVal("BLN_Ferien", "modeStart", "") =~ "ferien"? fhem("set Ferientag 1"): fhem("set Ferientag 0")}
geht leider nicht ! Wer kann mir kurz helfen ?
Danke vorab !
Was ist die Ausgabe, wenn Du
{ fhem "set BLN_Ferientag " . (ReadingsVal("BLN_Ferien", "modeStart", "") =~ "ferien" ? 1: 0) }
bzw. nur mal
{ReadingsVal("BLN_Ferien", "modeStart", "") =~ "ferien" ? 1: 0}
einfach mal in die Eingabe vom Web-Frontend eingibst? Steht nichts im Log?
Hallo Ralli,
leider in beiden Fällen garnix !
klaus
weiterer Test, wenn ich im Web-Frontend ...
{ReadingsVal("BLN_Ferien", "modeStart", "")}
eingebe , erhalte ich 1ccee3dd23
Über das Calendar-Device ... ergibt das mittels
get BLN_Ferien text 1ccee3dd23
dann folgendes ... 31.05.15 00:00 ferien
hier geht dann (vermutlich) der Vergleich (=~ "ferien") nicht, weil das ReadingsVal nicht des String (31.05.15 00:00) liefert , sondern 1ccee3dd23 ... oder ?
Was kann ich tun !?
klaus
Da ja nur Ferientage in dem Kalender sein dürften, kannst Du die Abfrage einfach umdrehen. Wenn nichts im Reading modeStart drin steht, ist auch kein Ferientag.
{ fhem "set BLN_Ferientag " . (ReadingsVal("BLN_Ferien", "modeStart", "") ne "" ? 1: 0) }
wenn ich das so angeben
define BLN_Ferien_notify notify BLN_Ferien:modeStart:.* { fhem "set BLN_Ferientag " . (ReadingsVal("BLN_Ferien", "modeStart", "") =~ "1ccee3dd23" ? 1: 0) }
wird das dummy "BLN_Ferientag" auf 1 gesetzt !
Problem ist nur das sich dies ja immer ändert ... , auch bei gleichen Einträgen ..
also im Kalender gelöscht , gleichen Eintrag wiederholt ..... jetzt steht da 40af736c3c
klaus
Hallo Ralli,
Zitat von: Ralli am 31 Mai 2015, 20:54:18
Da ja nur Ferientage in dem Kalender sein dürften, kannst Du die Abfrage einfach umdrehen. Wenn nichts im Reading modeStart drin steht, ist auch kein Ferientag.
{ fhem "set BLN_Ferientag " . (ReadingsVal("BLN_Ferien", "modeStart", "") ne "" ? 1: 0) }
super das geht und man kann sogar "irgendwas" reinschreiben ohne auf den korrekten Text ("ferien") zu achten. Ein Plus für WAF ;)
Danke nochmal für die Hilfe ...!
Gruss
Klaus
Ich habe letztes Jahr einen Ferienkalender unter Anleitung durch das Wiki erstellt, der auch eine ganze Zeit lang funktioniert hat. Heute bei einer Überprüfung liefert er nur noch Schrott zurück. Irgendetwas muss sich da wohl verändert haben
Die Definition sieht so aus:
# Schulferien
define Bayern_Ferien Calendar ical file ./Daten/Ferien_Bayern.ics
attr Bayern_Ferien room Kalender
define Bayern_Ferientag dummy
attr Bayern_Ferientag alias Schulferien
attr Bayern_Ferientag devStateIcon 0:FS20.off 1:FS20.on
attr Bayern_Ferientag room Kalender
define Bayern_Ferien.notify notify Bayern_Ferien { fhem "set Bayern_Ferientag " . (ReadingsVal("Bayern_Ferien", "modeStart", "") =~ "schulferien" ? 1: 0) }
Ich kann den Fehler einfach nicht finden
Das Reading:
Internals:
DEF ical file ./Daten/Ferien_Bayern.ics
NAME Bayern_Ferien
NR 589
STATE Active
TYPE Calendar
Readings:
2015-12-23 13:17:43 all F_2015_6170schulferienorg
2015-12-23 13:17:43 lastCheck 2015-12-23 13:17:43
2015-12-23 13:17:43 lastUpdate 2015-12-23 13:17:43
2015-12-23 13:17:43 modeAlarm
2015-12-23 13:17:43 modeAlarmOrStart
2015-12-23 13:17:43 modeAlarmed
2015-12-23 13:17:43 modeChanged
2015-12-23 13:17:43 modeEnd
2015-12-23 13:17:43 modeEnded
2015-12-23 13:17:43 modeStart
2015-12-23 13:17:43 modeStarted
2015-12-23 13:17:43 modeUpcoming F_2015_6170schulferienorg
2015-12-23 13:17:43 stateChanged
2015-12-23 13:17:43 stateDeleted
2015-12-23 13:17:43 stateNew
2015-12-23 13:17:43 stateUpdated
Fhem:
interval 3600
lastCheck 2015-12-23 13:17:43
lastChkTs 1450873063.85793
lastUpdate 2015-12-23 13:17:43
lstUpdtTs 1450873063.85802
nextCheck 2015-12-23 14:17:43
nextChkTs 1450876663.85802
nextUpdate 2015-12-23 14:17:43
nxtUpdtTs 1450876663.85802
type file
url ./Daten/Ferien_Bayern.ics
Attributes:
room Kalender
Auf den Werten Blick ist da nix falsch...
Ich habe allerdings irgendwann mal die regexp umgedreht....
BLN_Ferien:modeStart:.* { fhem "set BLN_Ferientag " . (ReadingsVal("BLN_Ferien", "modeStart", "") ne "" ? 1: 0) }
Diese Definition geht nicht mehr, oder? schulferien.org scheint die Links nicht mehr freizugeben, man muss da Captcha eintragen.
Zitat von: andies am 10 April 2017, 22:19:48
Diese Definition geht nicht mehr, oder? schulferien.org scheint die Links nicht mehr freizugeben, man muss da Captcha eintragen.
Ups, ist mir noch garnicht aufgefallen, muss ich mal testen
Leider sind die ics bei schulferien.org nur noch mit temporären Links zu bekommen. Darum klappen die Automatismen in der Tat so nicht mehr.
Was ist von der Idee zu halten, dass wir ein eigenes Modul entwickeln und einer von uns (wir sind so viele, da findet sich einer) einmal pro Jahr die neuen Daten per Hand in das Modul einspielt und fertig ist die Laube?
Für das "einmal pro Jahr" verstehe ich den Benefit nicht. Da kannst Du doch auch bei schulferien.org die ical-Datei herunterladen und manuell in fhem einbinden.
Zitat von: Ralli am 17 April 2017, 12:28:31
Für das "einmal pro Jahr" verstehe ich den Benefit nicht. Da kannst Du doch auch bei schulferien.org die ical-Datei herunterladen und manuell in fhem einbinden.
Ja, das ist schon klar. Ich dachte daran, dass sonst "einer von uns" einmal die Datei herunterlädt und die anderen free rider sind. Nach Deinem Vorschlag müssen wir alle die Datei einmal herunterladen.
PS Wie binde ich die ical ein? Mit welchem Modul (ich bin neu hier).
https://wiki.fhem.de/wiki/Calendar
@andies: "Ich bin neu hier" ===> Anfängerdoku lesen, Commandref lesen. Und bitte keine Vorschläge für neue Module...
LG
pah
Zitat von: Ralli am 17 April 2017, 12:28:31
Für das "einmal pro Jahr" verstehe ich den Benefit nicht. Da kannst Du doch auch bei schulferien.org die ical-Datei herunterladen und manuell in fhem einbinden.
genau so mache ich das mittlerweile auch, bzw. importieren mir die ical-Datei in meine owncloud !
Und wie aktualisierst Du dann die Daten? In der http-Version wird ja täglich heruntergeladen und dadurch das notify ausgelöst. Wenn die in der cloud liegen, lädst Du doch nicht die Datei täglich neu herunter, oder doch?
<EDIT> define my_trigger at 17:00:00 usw. Oder?
Nein, da hast Du das bzw. die Notify(s) nicht verstanden.
Es wurde jeden Tag geprüft, ob es der 30.12. ist. Und wenn ja, dann wurde die neue ical-Datei heruntergeladen. Für eine Aktualisierung der Kalenderdaten sorgte das Modul Calendar selbst im eingestellten Abstand.
Ich meinte etwas anderes: Wie prüfst Du (täglich), ob ein Ferientag vorliegt?
In dem Du Dein Kalendermodul abfragst. Du findest Lösungen dafür im Wiki.
Ich habe ja eine Lösung (siehe mein edit oben). Aber nur mal als Hinweis, weil ich das an anderer Stelle moniert hatte: gerade der Wiki-Eintrag bei Calendar ist diesbezüglich außerordentlich dürftig. Wer nicht weiß, wie es geht, findet da nicht mal einen Link...
Gesendet von iPhone mit Tapatalk Pro
Aber jetzt weißst Du wie es geht? Dann wäre es schön wenn Du den Wikieintrag aktualisierst/ergänzt.
Danke Dir
Grüße
Ja, das habe ich bei Signalduino auch gemacht. Bei Calendar übersteigt es leider meine Fähigkeiten (meine Lösung war am Ende ein Dirty copy-paste). Aber sobald ich es kapiert habe, mache ich das. Das ist nur eine größere Baustelle.
Gesendet von iPhone mit Tapatalk Pro
Ich habe die ical Datei im übrigen einfach in einen Googlekalender importiert. Da hat man dann Ruhe für 1-2 Jahre. Den Googlekalender dann in FHEM einbinden mit dem Kalendermodul und schick ist. Da kann man dann auch gleich noch Feiertage und/oder Schichtplan abfragen wenn man das auch in einem Googlekalender hat.
Bei mir hat die Einbindung des Google-Kalenders in FHEM über 10 Minuten gedauert (ich habe Termine seit 2006) und daher habe ich das abgebrochen. Ist so eine Einlese-Zeit normal?
Gesendet von iPhone mit Tapatalk Pro
Zitat von: CoolTux am 19 April 2017, 08:06:35
Ich habe die ical Datei im übrigen einfach in einen Googlekalender importiert. Da hat man dann Ruhe für 1-2 Jahre. Den Googlekalender dann in FHEM einbinden mit dem Kalendermodul und schick ist. Da kann man dann auch gleich noch Feiertage und/oder Schichtplan abfragen wenn man das auch in einem Googlekalender hat.
genau so, nur owncloud, läuft es bei mir !
und dann damit
https://forum.fhem.de/index.php/topic,36244.msg299701.html#msg299701 (https://forum.fhem.de/index.php/topic,36244.msg299701.html#msg299701)
Wenn als nix im Kalender steht ist Kein FT oder keine Ferien oder nix besonderes
Zitat von: andies am 19 April 2017, 08:08:34
Bei mir hat die Einbindung des Google-Kalenders in FHEM über 10 Minuten gedauert (ich habe Termine seit 2006) und daher habe ich das abgebrochen. Ist so eine Einlese-Zeit normal?
Gesendet von iPhone mit Tapatalk Pro
Keine Ahnung. Aber ich würde da einen extra Kalender nehmen. Also einen für Feiertage, einen für Ferien und einen für Schichtarbeit.
Zitat von: Prof. Dr. Peter Henning am 31 Mai 2015, 17:56:05
sub getCalendar(){
my $ret;
my $year=strftime("%Y",localtime);
$ret = system("wget -O feiertage.ics http://www.schulferien.org/iCal/Feiertage/icals/Feiertage_Baden_Wuerttemberg_".$year.".ics");
$ret = system("wget -O ferien.ics http://www.schulferien.org/iCal/Ferien/icals/Ferien_Baden_Wuerttemberg_".$year.".ics");
};
Kannst Du den Codeschnipsel für den einmaligen Aufruf pro Jahr hierfür auch noch posten?
Außerdem bekomme ich bei der Ausführung folgende Fehler, die lokalen ICS-Dateien werden nicht befüllt:
--2017-05-01 14:13:59-- http://www.schulferien.org/iCal/Feiertage/icals/Feiertage_Baden_Wuerttemberg_2017.ics
Resolving www.schulferien.org (www.schulferien.org)... 193.149.38.41
Connecting to www.schulferien.org (www.schulferien.org)|193.149.38.41|:80... connected.
HTTP request sent, awaiting response... 410 Gone
2017-05-01 14:13:59 ERROR 410: Gone.
--2017-05-01 14:13:59-- http://www.schulferien.org/iCal/Ferien/icals/Ferien_Baden_Wuerttemberg_2017.ics
Resolving www.schulferien.org (www.schulferien.org)... 193.149.38.41
Connecting to www.schulferien.org (www.schulferien.org)|193.149.38.41|:80... connected.
HTTP request sent, awaiting response... 410 Gone
2017-05-01 14:13:59 ERROR 410: Gone.
Liegt das an dem Captcha-Verfahren auf schulferien.org?
VG Yil
Zitat von: Yil am 01 Mai 2017, 13:48:35
Außerdem bekomme ich bei der Ausführung folgende Fehler, die lokalen ICS-Dateien werden nicht befüllt:
Man muss beim Anruf ein Captcha händisch ausfüllen, deshalb geht das mW nicht. Oder übersehe ich da was?
Zitat von: andies am 01 Mai 2017, 14:20:43
Man muss beim Anruf ein Captcha händisch ausfüllen, deshalb geht das mW nicht. Oder übersehe ich da was?
Nach dem Ausfüllen des Captchas bekommt man einen Link. Der funktioniert bei mir seit Anfsng des (Schul-) Jahres einwandfrei...
Mein Download-Link sieht so aus:
http://www.schulferien.org/media/ical/deutschland/ferien_baden-wuerttemberg_2017.ics?k=Vna5OrNUOsZAn8yByQlS-2kEVrG7-LdAPbW0Urc3yQdfeUmStMJ2F_mf9roqlJhM1W4eLSyro7BEMmQalRznWO04MYi2uwzYdAy6HsiN1YE (http://www.schulferien.org/media/ical/deutschland/ferien_baden-wuerttemberg_2017.ics?k=Vna5OrNUOsZAn8yByQlS-2kEVrG7-LdAPbW0Urc3yQdfeUmStMJ2F_mf9roqlJhM1W4eLSyro7BEMmQalRznWO04MYi2uwzYdAy6HsiN1YE)
Aber gerade das wollte ich ja nicht, sondern einen Zugang so, dass automatisch 1x im Jahr der Kalender aktualisiert wurden, so wie pah das oben beschrieben hat. Was nutzt ein Automatismus, wenn ich den Link jedes Jahr händisch anpassen muss ::)
Leute. Das klappt so nicht mehr. Die Links, die man bei schulferien.org bekommt, sind temporäre Links. Die Gültigkeit dieser bei jedem Aufruf sich ändernden Links ist also begrenzt. Und um einen solchen temporären Link zu bekommen, bedarf es eines Captcha.
Also ist jeglicher Automatismus, um 1) neue ics-Dateien zu bekommen und 2) bei bereits eingebundenen ics-Dateien diese bei Aktualisierung auch im eigenen System automatisch aktualisiert zu bekommen, so nicht mehr möglich. Egal ob per Script in der myUtils oder als Codeschnipsel in einem Notify, at, DOIF oder ...
Ich habe das so gelöst, dass ich mir eine E-Mail am 1. Januar schicke und dann die neue Datei mit dem Schulferien herunterlade und unter einem festen Namen in FHEM speichere. Sooo aufwendig ist das nun nicht.
Ich habe aktuell ein Problem mit dem Wiki Eintrag: https://wiki.fhem.de/wiki/Wochenende,_Feiertage_und_Schulferien (https://wiki.fhem.de/wiki/Wochenende,_Feiertage_und_Schulferien)
Unabhängig davon daß da zwei Bundesländer verwurschtelt wurden taugt dieser Kalender leider nicht für Feiertage.
Denn laut dieser Seite sind heute keine Schulferien obwohl heute ja ein Feiertag ist.
Ich kann mir ja von Google direkt und automatisch und für alle Ewigkeit gültig den Feiertags Kalender für "mein" Bundesland einpflegen.
Aber auf welches "Zauberwort" soll der Dummy dann schalten?
Laut Wiki sieht es ja so aus:
define NRW_Ferien.notify notify NRW_Ferien { \
fhem "set BW_Ferientag " . (ReadingsVal("BW_Ferien", "modeStart", "") =~ "schulferien" ? 1: 0) }
Kann man nicht einfach auf "irgend einen Text" triggern? Wenn ja, wie?
Ist $we nicht der Feiertag plus Wochenende? Sonst
defmod berlin holiday
(damit noch ein drittes Bundesland ins Spiel kommt) und dann steht da
Readings
state Tag der Arbeit 2017-05-01 15:33:17
tomorrow none 2017-05-01 15:33:17
yesterday none 2017-05-01 15:33:17
Den Wikieintrag ändere ich gleich mal.
Hallo Zusammen,
ich muss dieses alte Thema einmal hervor holen.
Ich habe die Routine getDayStatus zu übernommen und es funktioniert auch alles problemlos. Nun habe ich ein komplettes System Update gemacht. Der Ferienkalender wird anscheinend immer noch richtig verarbeitet.
Nur wird mir jetzt angezeigt, dass heute ein Feiertag ist, weil heute Neujahr 01-01-1017 ist ?!
Was haut da nicht hin ?
sub getCalendar(){
my $ret;
my $year=strftime("%Y",localtime);
$ret = system("wget -O ferien.ics https://www.ferienwiki.de/exports/ferien/".$year."/de/niedersachsen");
$ret = system("wget -O feiertage.ics https://www.ferienwiki.de/exports/feiertage/".$year."/de/niedersachsen");
}
# Der Tagesstatus (Text des Ereignisses) und der Tagesmode (Ferien, Feiertag, Wochenende, Wochentag)
# wird aus den Kalendern ermittelt. Aufruf aus FHEM um 03:15 --> TagesstatusCheck_at
sub getDayStatus(){
my $ret;
my $msg;
my @lines;
my $date;
my $desc;
#strftime "%d-%m",localtime
$ret = fhem("get Ferien_cal text modeAlarmOrStart");
if( $ret ne ""){
@lines = split('\n',$ret);
$date = substr($lines[0],0,8);
$desc = substr($lines[0],15);
$msg = "$desc $date";
fhem("set Tagesstatus_du $desc");
fhem("set Tagesmode_du Ferien");
}else{
$ret = fhem("get Feiertage_cal text modeAlarmOrStart");
if( $ret ne ""){
@lines = split('\n',$ret);
$date = substr($lines[0],0,8);
$desc = substr($lines[0],15);
$msg = "$desc $date";
fhem("set Tagesstatus_du $desc");
fhem("set Tagesmode_du Feiertag");
}else{
if( strftime("%u",localtime) > 5 ){
$msg = "Wochenende";
fhem("set Tagesstatus_du $msg");
fhem("set Tagesmode_du $msg");
}else{
$msg = "Wochentag";
fhem("set Tagesstatus_du $msg");
fhem("set Tagesmode_du $msg");
}
}
}
return $msg;
}
Der Auszug aus der fhem.cfg
define Ferien_cal Calendar ical file ferien.ics 86400
attr Ferien_cal event-on-change-reading modeStarted,modeEnded,modeChanged,modeUpcoming
attr Ferien_cal group Kalender
attr Ferien_cal hideOlderThan 1
attr Ferien_cal room 9.4_Kalendar
attr Ferien_cal verbose 5
define Feiertage_cal Calendar ical file feiertage.ics 86400
attr Feiertage_cal event-on-change-reading modeStarted,modeEnded,modeChanged,modeUpcoming
attr Feiertage_cal group Kalender
attr Feiertage_cal hideOlderThan 1
attr Feiertage_cal room 9.4_Kalendar
attr Feiertage_cal verbose 5
define TagesstatusCheck_at at *03:15:00 {getDayStatus()};;
attr TagesstatusCheck_at group Kalender
attr TagesstatusCheck_at room 9.4_Kalendar
define Tagesstatus_du dummy
attr Tagesstatus_du group Kalender
attr Tagesstatus_du room 9.4_Kalendar
define Tagesmode_du dummy
attr Tagesmode_du group Kalender
attr Tagesmode_du room 9.4_Kalendar
Hat sich erledigt. Der Fehler lag in der ical Datei. Die Feiertage hatten dort keinen End-Termin eingetragen. Also war der 01.01. immer noch ein gestarteter aktueller Termin.
Hallo Zusammen,
ich muss dieses Thema auch noch einmal hervor holen.
Habe das gleiche Problem, die Feiertage haben keinen End-Termin und der 01.01. steht noch als aktueller Termin.
Nur der Feiertagskalender macht Probleme, der Ferienkalender funktioniert...
Ein herumspielen mit den attr hideOlderThan usw. brachte nichts.
Habt ihr eine andere Kalenderquelle eingesetzt ? bzw.
Welche Lösung setzt ihr ein???
MfG Uwe
Selbst mit XSLT generierte ical-Dateien. Garantiert fehlerfrei.
LG
pah
Hallo pah,
Danke für Deine Antwort, ich werde mich mal damit beschäftigen...
Mit dem "Garantiert fehlerfrei" ist so eine Sache,
da der Fehler40 immer 40cm vor dem Ding sitzt ;-)
Habe vorerst eine andere Quelle für den Feiertagskalender eingesetzt:
"wget -O feiertage.ics http://www.ifeiertage.de/sn-.ics"
dann in der Datei mal von Hand den 1.5. auf 8.4. geändert, und siehe da
... Hurra heute ist "Feiertag" ....
und ich geh jetzt in den Garten.
MfG
Uwe
ZitatMit dem "Garantiert fehlerfrei" ist so eine Sache,
da der Fehler40 immer 40cm vor dem Ding sitzt ;-)
Sicher nicht.
pah
Zitat von: my-engel am 07 April 2018, 13:37:21
Habe das gleiche Problem, die Feiertage haben keinen End-Termin und der 01.01. steht noch als aktueller Termin.
Nur der Feiertagskalender macht Probleme, der Ferienkalender funktioniert...
beim letzten calendar update sollte das eigentlich kein problem mehr sein (also fehlende end-zeiten bei den terminen)
dieses forum hier ist eigentlich nur für code-schnipsel gedacht :)
guck einfach mal dort:
https://forum.fhem.de/index.php/board,85.0.html
Zitat von: Prof. Dr. Peter Henning am 31 Mai 2015, 17:56:05
Die erste Routine wird einmal zu Jahresbeginn gerufen, holt die Ferienkalender. Eine Datei muell.ics wird manuall erzeugt oder sonstwie generiert.
LG
pah
Vielen Dank für den Code und die Idee den Kalender nur einmal im Jahr zu holen.
Das finde ich aus mehreren Gründen als beste Idee.
Nun habe ich kleine Wissenslücken:
Wohin werden die Kalender denn gespeichert?
Wohin muss ich den Kalender Müll.ics speichern?
Ich habe schon auf dem Raps gesucht, aber nichts gefunden.
Gruß
Ralf
Edit:
Ich habe die .ics Dateien in den Ordner /opt/fhem kopiert.
Dort werden sie dann gefunden wenn man set Feiertage reload eingibt.
Hallo,
Seit dem letzten Update von 57_Calendar.pm funktionieren die Abfragen wie
get Ferienkalender text modeAlarmOrStart
standardmässig nicht mehr.
Lösung vorerst:
Im zugehörigen Kalender dann das Attribut
hasModeReadings
auf 1 setzen
So wie ich es verstanden habe sollte man aber auf Abfragen wie
get Ferienkalender events limit:when=today
get Ferienkalender events limit:when=0
umbauen.
Hat dieses evtl. schon jemand getan und könnte dies kurz mitteilen?
VG
Uwe