FHEM-Befehl bis zum non word character

Begonnen von Damian, 21 August 2018, 20:17:02

Vorheriges Thema - Nächstes Thema

Damian

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.

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Dr. Boris Neubert

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
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Damian

Die erste Frage ist: Darf ein FHEM-Befehl Sonderzeichen beinhalten?

Wenn man sie nicht eindeutig beantworten kann, dann hat sich das erledigt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

rudolfkoenig

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.

Damian

#4
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.



Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Dr. Boris Neubert

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).
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

betateilchen

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Damian

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 ;)

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF