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.
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
Die erste Frage ist: Darf ein FHEM-Befehl Sonderzeichen beinhalten?
Wenn man sie nicht eindeutig beantworten kann, dann hat sich das erledigt.
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.
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.
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).
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)
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 ;)