FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: mumpitzstuff am 15 Juni 2020, 00:44:48

Titel: Encoding im init {} Block ist anders als im standard Perl Block?!?
Beitrag von: mumpitzstuff am 15 Juni 2020, 00:44:48
Ich bin jetzt schon seit Stunden auf der Suche nach einem ganz dubiosen Problem. Ich habe folgenden Code (gekürzt):

init
{
  set_Exec('init_next', 300, 'startParse("$SELF", "next")');
}
{
  if ([+00:15])
  {
    startParse("$SELF", 'next');
  }
}


Innerhalb der startParse Funktion werden irgendwann Strings um gewisse Sonderzeichen bereinigt:

  sub filterText($)
  {
    my $text = shift;

    #$text =~ s/[\x22\x60\x3b\x27"`;\'\r]//g;
    $text =~ s/["`;\'\r]//g;
    $text =~ s/[\n]/<br>/g;

    return $text;
  }


Passiert das mit dem Timer im init Block, dann findet aus mir unerklärlichen Gründen kein Match statt und die Sonderzeichen werden nicht gefiltert. Im Standard Block darunter hingegen, werden die Sonderzeichen gefiltert. Ich vermute dahinter einen ganz dubiosen encoding Effekt, kann es aber nicht genau eingrenzen.

Ich werde versuchen ein kleines DOIF zu kreieren, um das Problem vielleicht isoliert zu bekommen. Ich kann aber nicht versprechen das es klappt.
Titel: Antw:Encoding im init {} Block ist anders als im standard Perl Block?!?
Beitrag von: amenomade am 15 Juni 2020, 00:58:03
Liegt das nicht an der Interpolation von $SELF zwischen single quotes im init Block?
Titel: Antw:Encoding im init {} Block ist anders als im standard Perl Block?!?
Beitrag von: mumpitzstuff am 15 Juni 2020, 02:23:13
Die Readings werden innerhalb der aufgerufenen Funktion im richtigen Device erzeugt, der Name wird also in beiden Fällen richtig übergeben. Im ersten Fall kriege ich allerdings Fehler wegen unterminierter Strings, weil das Zeichen ' nicht entfernt wurde. Die verarbeiteten Daten sind in beiden Fällen ebenfalls gleich.
Titel: Antw:Encoding im init {} Block ist anders als im standard Perl Block?!?
Beitrag von: Damian am 15 Juni 2020, 10:26:18
Was das Modul aus der Definition macht, kannst du unter condition im List sehen:

ZitatInternals:
   CFGFN     
   DEF        init
{
  set_Exec('init_next', 300, 'startParse("$SELF", "next")');
}
{
 if ([+00:15])
  {
    startParse("$SELF", 'next');
  }
}
   FUUID      5ee72fc1-f33f-c0d4-08c5-dc978fab7cb692d7
   MODEL      Perl
   NAME       di_init
   NOTIFYDEV  global
   NR         1365
   NTFY_ORDER 50-di_init
   STATE      initialized
   TYPE       DOIF
   VERSION    21979 2020-05-20 08:36:23
   READINGS:
     2020-06-15 10:22:34   block_init      executed
     2020-06-15 10:22:34   mode            enabled
     2020-06-15 10:22:25   state           initialized
     2020-06-15 10:22:34   timer_01_c02    15.06.2020 10:37:34
     2020-06-15 10:22:34   timer_init_next 15.06.2020 10:27:34
   Regex:
     accu:
   condition:
     0         
  set_Exec('init_next', 300, 'startParse("di_init", "next")');

     1         
  if (::DOIF_time_once($hash,0,$wday))
  {
    startParse("di_init", 'next');
  }

...

Ich sehe da kein Problem.
Titel: Antw:Encoding im init {} Block ist anders als im standard Perl Block?!?
Beitrag von: mumpitzstuff am 15 Juni 2020, 11:21:24
Ich hatte schon im DOIF Modul geschaut und konnte ebenfalls nichts entdecken. Deshalb bin ich daher auch etwas ratlos was da genau passiert. Ich muss da wahrscheinlich weitere debug Meldungen einbauen, wobei Encoding Probleme immer extrem schwierig zu finden sind...
Titel: Antw:Encoding im init {} Block ist anders als im standard Perl Block?!?
Beitrag von: Damian am 15 Juni 2020, 13:05:32
Zitat von: mumpitzstuff am 15 Juni 2020, 11:21:24
Ich hatte schon im DOIF Modul geschaut und konnte ebenfalls nichts entdecken. Deshalb bin ich daher auch etwas ratlos was da genau passiert. Ich muss da wahrscheinlich weitere debug Meldungen einbauen, wobei Encoding Probleme immer extrem schwierig zu finden sind...

Was ich sagen kann ist: Das, was im jeweiligen condition-Block zu sehen ist, wird einfach ohne Änderung per eval ausgeführt.