57_Calendar.pm und umlaute in windows

Begonnen von the ratman, 07 Januar 2026, 16:29:30

Vorheriges Thema - Nächstes Thema

the ratman

grüß euch,
im zuge meines umzugs von fhem auf win11pro mit strawberry perl ist ein problem mit den umlauten in ics-dateien aufgetreten.
selbige umlaute bringen fehler nach der art:2026.01.07 14:44:54 1: PERL WARNING: UTF-8 "\xF6" does not map to Unicode at c:/fhem/fhem.pl line 5795, <$FH> line 101.
2026.01.07 14:44:54 1: PERL WARNING: UTF-8 "\xFC" does not map to Unicode at c:/fhem/fhem.pl line 5795, <$FH> line 134.
im fhem log. die umlaute werden dann natürlich auch nicht korrekt angezeigt.

ein bekannter hätte dafür eine lösung gefunden:
im modul 57_Calendar.pm würden folgende zeilen in zeile 2721 abhilfe schaffen:<<< if(open(ICSFILE, $url)) {
>>> if(open(ICSFILE, '<:encoding(UTF-8)', $url)) {

könnte da was gemacht werden?
→do↑p!dnʇs↓shit←

betateilchen

Noch einfacher wäre es vermutlich, die von FHEM selbst bereitgestellte Funktion FileRead() zum Einlesen zu verwenden. Dabei wird automatisch das korrekte encoding berücksichtigt.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

the ratman

soll ich irgendwo irgendwas tun, den herrn doktor ansprechen, oder geht alles automatisch seiner wege?
→do↑p!dnʇs↓shit←

betateilchen

Einfach Geduld haben.
Boris liest das sicher irgendwann.
Bis dahin kannst Du doch den von Dir vorgeschlagenen Workaround bei Dir nutzen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

the ratman

gutti, thx
ich hab's ned eilig - ist ja nur für meine zukünftige nas ... wollte nur ned wieder an der falschen ecke was gemeldet haben und keiner kriegt's mit *g*
→do↑p!dnʇs↓shit←

betateilchen

Du könntest den Thread allerdings eine Stufe tiefer in den Bereich "Kalendermodule" verschieben.
Den Button dazu findest Du unten auf der Seite.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

#6
Zitat von: betateilchen am 07 Januar 2026, 16:56:13Noch einfacher wäre es vermutlich, die von FHEM selbst bereitgestellte Funktion FileRead() zum Einlesen zu verwenden. Dabei wird automatisch das korrekte encoding berücksichtigt.

Die Verwendung von FileRead() hätte den Charme, dass man mit überschaubarem Aufwand auch meine lange im Hinterkopf rumschwirrende Idee umsetzen könnte, eine Kalenderdatei auch aus der configDB lesen zu können.

Da werde ich mich wohl mal hinsetzen und einen patch vorbereiten...

Index: /opt/fhem/FHEM/57_Calendar.pm
===================================================================
--- /opt/fhem/FHEM/57_Calendar.pm       (revision 30692)
+++ /opt/fhem/FHEM/57_Calendar.pm       (working copy)
@@ -1825,8 +1825,9 @@
   my @a = split("[ \t][ \t]*", $def);
 
   return "syntax: define <name> Calendar ical url <URL> [interval]\n".\
-         "        define <name> Calendar ical file <FILENAME> [interval]"
-    if(($#a < 4 && $#a > 5) || ($a[2] ne 'ical') || (($a[3] ne 'url') && ($a[3] ne 'file')));
+         "        define <name> Calendar ical file <FILENAME> [interval]\n".\
+         "        define <name> Calendar ical configdb <FILENAME> [interval]"
+    if(($#a < 4 && $#a > 5) || ($a[2] ne 'ical') || !contains_string($a[3],('url','file','configdb')));
 
   $hash->{NOTIFYDEV} = "global";
   readingsSingleUpdate($hash, "state", "initialized", 1);
@@ -2715,15 +2716,18 @@
     });
     Log3 $hash, 4, "Calendar $name: Getting data from URL <hidden>"; # $url
 
-  } elsif($type eq "file") {
+  } elsif($type eq "file" || $type eq "configdb") {
 
-    Log3 $hash, 4, "Calendar $name: Getting data from file $url";
-    if(open(ICSFILE, $url)) {
-      while(<ICSFILE>) {
-        $ics .= $_;
-      }
-      close(ICSFILE);
+    Log3 $hash, 4, "Calendar $name: Getting data from $type $url";
+    my %f = ('FileName' => $url,'ForceType' => ($type eq 'file')?'file':'configdb');
+    my ($err,@content) = FileRead({%f});
 
+    if ($err) {
+      Log3 $hash, 1, "Calendar $name: $err";
+      readingsSingleUpdate($hash, "state", "error ($err)", 1);
+      return 0;
+    } else {
+      $ics = join("\n",@content);
       my $paramhash;
       $paramhash->{hash} = $hash;
       $paramhash->{removeall} = $removeall;
@@ -2731,11 +2735,6 @@
       $paramhash->{type} = 'caldata';
       Calendar_ProcessUpdate($paramhash, '', $ics);
       return undef;
-
-    } else {
-      Log3 $hash, 1, "Calendar $name: Could not open file $url";
-      readingsSingleUpdate($hash, "state", "error (could not open file)", 1);
-      return 0;
     }
   } else {
     # this case never happens by virtue of _Define, so just
@@ -2787,7 +2786,7 @@
         readingsBulkUpdate($hash, "state", "retrieved");
                readingsBulkUpdate($hash, 'lastResponse', 'OK');
       }
-    } elsif($type eq "file") {
+    } elsif($type eq "file" || $type eq "configdb") {
       Log3 $name, 5, "Calendar $name: file retrieval successful";
       readingsBulkUpdate($hash, "state", "retrieved");
       readingsBulkUpdate($hash, 'lastResponse', 'OK');
@@ -3462,6 +3461,7 @@
   <ul>
     <code>define &lt;name&gt; Calendar ical url &lt;URL&gt; [&lt;interval&gt;]</code><br>
     <code>define &lt;name&gt; Calendar ical file &lt;FILENAME&gt; [&lt;interval&gt;]</code><br>
+    <code>define &lt;name&gt; Calendar ical configdb &lt;FILENAME&gt; [&lt;interval&gt;]</code><br>
     <br>
     Defines a calendar device.<br><br>
 
@@ -4200,6 +4200,7 @@
   <ul>
     <code>define &lt;name&gt; Calendar ical url &lt;URL&gt; [&lt;interval&gt;]</code><br>
     <code>define &lt;name&gt; Calendar ical file &lt;FILENAME&gt; [&lt;interval&gt;]</code><br>
+    <code>define &lt;name&gt; Calendar ical configdb &lt;FILENAME&gt; [&lt;interval&gt;]</code><br>
     <br>
     Definiert ein Kalender-Device.<br><br>
 
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

the ratman

falls ich irgendwas probieren soll ... bin ja bekannt für meine fatale fehlerfinderei *g*
aber bitte bedenken: "idiot inside"
→do↑p!dnʇs↓shit←

Dr. Boris Neubert

Ich werde mich kümmern.

Einen Patch von Udo nehme ich gerne!
FHEM-Developer seit 2007, Mitgründer und Förder-Mitglied des FHEM e.V.
Bitte keine unaufgeforderten privaten Nachrichten!

betateilchen

Zitat von: Dr. Boris Neubert am 08 Januar 2026, 18:59:24Einen Patch von Udo nehme ich gerne!

Der patch, den ich oben vorgeschlagenen habe

  • sollte das Windows-Umlaute-Problem lösen - mangels fhem@windows kann ich das nicht testen
  • erfüllt meine Idee, auch aus configdb lesen zu können
  • wurde von mir sowohl für "ical file" als auch "ical configdb" erfolgreich getestet
  • enthält die Ergänzung für commandref
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

the ratman

Zitat von: betateilchen am 08 Januar 2026, 20:04:06sollte das Windows-Umlaute-Problem lösen - mangels fhem@windows kann ich das nicht testen
also ich kenn da zufällig jemanden ...
→do↑p!dnʇs↓shit←