FHEM Forum

FHEM - Entwicklung => FHEM Development => Thema gestartet von: Damian am 21 August 2018, 20:17:02

Titel: FHEM-Befehl bis zum non word character
Beitrag von: Damian am 21 August 2018, 20:17:02
Ausgehend von dieser Diskussion:

https://forum.fhem.de/index.php/topic,90416.msg828997.html#msg828997

Wäre das vielleicht das eine mögliche Lösung:

in AnalyzeCommand:

statt:

  my ($fn, $param) = split("[ \t][ \t]*", $cmd, 2);


my ($fn, $param) = split('[\W]', $cmd, 2);

Es funktioniert natürlich nur, wenn ein FHEM-Befehl nur ein word \w darstellt.

Titel: Antw:FHEM-Befehl bis zum non word character
Beitrag von: Dr. Boris Neubert am 21 August 2018, 20:25:48
Hallo,

45 Module nutzen AnalyzeCommand():

0_DFPlayerMini.pm
00_FHZ.pm
01_FHEMWEB.pm
02_FTUISRV.pm
10_CUL_IR.pm
10_EnOcean.pm
10_ZWave.pm
22_HOMEMODE.pm
31_LightScene.pm
32_yowsup.pm
39_alexa.pm
39_Talk2Fhem.pm
49_TBot_List.pm
50_TelegramBot.pm
67_ECMDDevice.pm
73_AMADCommBridge.pm
73_PRESENCE.pm
76_msgDialog.pm
88_HMCCU.pm
90_at.pm
91_notify.pm
91_watchdog.pm
92_FileLog.pm
93_DbRep.pm
95_FLOORPLAN.pm
98_archetype.pm
98_autocreate.pm
98_cmdalias.pm
98_DOIF.pm
98_freezemon.pm
98_HMinfo.pm
98_Hyperion.pm
98_IF.pm
98_monitoring.pm
98_RandomTimer.pm
98_Siro.pm
98_structure.pm
98_SVG.pm
98_telnet.pm
98_template.pm
98_THRESHOLD.pm
98_update.pm
98_WeekdayTimer.pm
98_WOL.pm
SetExtensions.pm


Wie lassen sich Nebenfeffekte Deines Vorschlags ausschließen?

Viele Grüße
Boris
Titel: Antw:FHEM-Befehl bis zum non word character
Beitrag von: Damian am 21 August 2018, 20:39:51
Die erste Frage ist: Darf ein FHEM-Befehl Sonderzeichen beinhalten?

Wenn man sie nicht eindeutig beantworten kann, dann hat sich das erledigt.
Titel: Antw:FHEM-Befehl bis zum non word character
Beitrag von: rudolfkoenig am 22 August 2018, 09:11:49
ZitatDarf ein FHEM-Befehl Sonderzeichen beinhalten?
Nein, aber es wird bisher nicht geprueft.

Dein Vorschlag gefaellt mir zwar besser als die bisherige Loesung, allerdings hilft es im verlinkten Beispiel nicht:fhem> IF($hour >= 7 and [HomeStatus:state] != 4 ) ( set HomeStatus 1 )
IF: no left bracket: hour >= 7 and [HomeStatus:state] != 4 ) ( set HomeStatus 1 )


Da das Problem der Nebeneffekte nicht auszuschliessen ist, wuerde ich erstmal nichts aendern wollen.
Es sei denn es gibt neben "schoener" weitere Argumente fuer die Aenderung.
Titel: Antw:FHEM-Befehl bis zum non word character
Beitrag von: Damian am 22 August 2018, 14:25:34
Zitat von: rudolfkoenig am 22 August 2018, 09:11:49
Nein, aber es wird bisher nicht geprueft.

Dein Vorschlag gefaellt mir zwar besser als die bisherige Loesung, allerdings hilft es im verlinkten Beispiel nicht:fhem> IF($hour >= 7 and [HomeStatus:state] != 4 ) ( set HomeStatus 1 )
IF: no left bracket: hour >= 7 and [HomeStatus:state] != 4 ) ( set HomeStatus 1 )



ja, das ist mir auch schon aufgefallen. Es darf eigentlich kein Trennzeichen geben und damit kein split, denn das vermeintliche Trennzeichen ist ja dann schon der Anfang des Parameters.

Folgender code (statt split) würde das zwar umsetzen, allerdings ist irgendwo eine Inkomatibilität zu split

my $fn;
my $param;

if ($cmd =~ /^(\w*)[ \t]*(.*)$/) {
  $fn=$1;
  $param=$2 ;
}


denn auch

if ($cmd =~ /^([^ ^\t]*)[ \t]*(.*)$/) ... ist irgendwie nicht das Gleiche wie

my ($fn, $param) = split("[ \t][ \t]*", $cmd, 2);

FHEM läuft dann nicht vollständig.



Titel: Antw:FHEM-Befehl bis zum non word character
Beitrag von: Dr. Boris Neubert am 22 August 2018, 14:43:06
https://metacpan.org/pod/Parse::RecDescent (https://metacpan.org/pod/Parse::RecDescent) ist nach wie vor mein Favorit. Gesucht wird ein Modulautor, der diesen Parser mal in seinem Modul austestet. Bisher sind die Bordmittel von FHEM immer ausreichend gewesen (AnalyzeCommand, Parse).
Titel: Antw:FHEM-Befehl bis zum non word character
Beitrag von: betateilchen am 22 August 2018, 17:39:06
Zitat von: Dr. Boris Neubert am 22 August 2018, 14:43:06
https://metacpan.org/pod/Parse::RecDescent (https://metacpan.org/pod/Parse::RecDescent) ist nach wie vor mein Favorit

ich versteh schon die Beschreibung nicht  8)
Titel: Antw:FHEM-Befehl bis zum non word character
Beitrag von: Damian am 23 August 2018, 19:04:35
Ich wollte doch noch herausfinden, wo das Problem war - es lag an Zeilenumbrüchen.

Diese Lösung scheint kompatibel zu sein:


...
  #my ($fn, $param) = split("[ \t][ \t]*", $cmd, 2);
  my $fn;
  my $param;
  if ($cmd =~ /^(\w*)[ \t]*((?:.|\n)*)/) {
    $fn=$1;
    $param=$2 ;
  }
  return undef if(!$fn);
...


Damit läuft FHEM bei mir wieder ;)