Autor Thema: Übergabe von Zeichenketten mit Leerzeichen an get-Befehle  (Gelesen 2308 mal)

Offline Loredo

  • Developer
  • Hero Member
  • ****
  • Beiträge: 2734
  • ~ Challenging Innovation ~
Antw:Übergabe von Zeichenketten mit Leerzeichen an get-Befehle
« Antwort #30 am: 15 Mai 2016, 15:31:39 »
Ok, alles klar.


By modify existiert ein $hash->{OLDDEF}


Thnx, again what learned  ;D


Hab mir jetzt erstmal so beholfen:



    if ( $hash->{OLDDEF} && ( !defined( @$a[1] ) || @$a[1] ne "ONKYO_AVR" ) ) {
        unshift @$a, @$a[0];
        @$a[1] = "ONKYO_AVR";
    }
FHEM-Module: ENIGMA2, GEOFANCY, ONKYO_AVR, PHTV, RESIDENTS, ROOMMATE, GUEST, HP1000, powerMap, Pushover, THINKINGCLEANER, Wunderground | FHEM-Befehl: msg

FHEM 5.9dev auf Intel NUC mit Proxmox VE
Homematic via HMCCU, Hue Color Bulbs
ONKYO TX-NR626, Philips 55" PFL8008S, Sonos 1xS1, 1xS3, 2xS5

Offline justme1968

  • Developer
  • Hero Member
  • ****
  • Beiträge: 16017
Antw:Übergabe von Zeichenketten mit Leerzeichen an get-Befehle
« Antwort #31 am: 15 Mai 2016, 17:24:03 »
so sollte es wieder passen.

Index: fhem.pl
===================================================================
--- fhem.pl (revision 11443)
+++ fhem.pl (working copy)
@@ -1802,8 +1802,9 @@
   $hash->{OLDDEF} = $hash->{DEF};
   $hash->{DEF} = $a[1];
   my $ret = CallFn($a[0], "DefFn", $hash,
-                    $modules{$hash->{TYPE}}->{parseParams} ? parseParams($def) :
-                      "$a[0] $hash->{TYPE}".(defined($a[1]) ? " $a[1]" : ""));
+                    $modules{$hash->{TYPE}}->{parseParams}
+                      ? parseParams("$a[0] $hash->{TYPE}".(defined($a[1]) ? " $a[1]" : ""))
+                      : "$a[0] $hash->{TYPE}".(defined($a[1]) ? " $a[1]" : ""));
   if($ret) {
     $hash->{DEF} = $hash->{OLDDEF};
   } else {

etwas wie unshift um direkt im aufruf $hash->{TYPE} an den anfang von $def zu hängen wäre zwar schöner aber ich habe keine idee ob und wie man das ohne temporäre variable verwenden kann.
FHEM5.4,DS1512+,2xCULv3,DS9490R,HMLAN,2xRasPi
CUL_HM:HM-LC-Bl1PBU-FM,HM-LC-Sw1PBU-FM,HM-SEC-MDIR,HM-SEC-RHS
HUEBridge,HUEDevice:LCT001,LLC001,LLC006,LWL001
OWDevice:DS1420,DS18B20,DS2406,DS2423
FS20:fs20as4,fs20bs,fs20di
AKCP:THS01,WS15
CUL_WS:S300TH

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 16049
Antw:Übergabe von Zeichenketten mit Leerzeichen an get-Befehle
« Antwort #32 am: 15 Mai 2016, 21:34:09 »
Habs eingecheckt.

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 16049
Antw:Übergabe von Zeichenketten mit Leerzeichen an get-Befehle
« Antwort #33 am: 23 Februar 2017, 21:25:21 »
Aus aktuellen Anlass habe ich perlSyntaxCheck wieder getestet, und dabei ist mir aufgefallen, dass folgender String akzeptiert wird:
{ $defs{$k}{MSGCNT}=0 } }Nach etwas debugging: parseParams($exec, ';') aufgerufen aus perlSyntaxCheck liefert ein leeres Array zurueck.
Andre: kannst du bitte danach schauen?

Ich habe erstmal einen Workaround in perlSyntaxCheck eingebaut.

Offline justme1968

  • Developer
  • Hero Member
  • ****
  • Beiträge: 16017
Antw:Übergabe von Zeichenketten mit Leerzeichen an get-Befehle
« Antwort #34 am: 23 Februar 2017, 21:55:24 »
mit der folgenden änderung wird es korrekt als (falscher) perl ausdruck erkannt:Index: fhem.pl
===================================================================
--- fhem.pl (revision 13496)
+++ fhem.pl (working copy)
@@ -4844,6 +4844,9 @@
     if( !defined( $value ) ) {
       $value = $key;
       $key = undef;
+    } elsif( $key =~ m/^\s*{/ ) { # the key can not start with a { -> it must be a perl expression
+      $value = "$key = $value";
+      $key = undef;
     }

     #collect all parts until the closing ' or "
FHEM5.4,DS1512+,2xCULv3,DS9490R,HMLAN,2xRasPi
CUL_HM:HM-LC-Bl1PBU-FM,HM-LC-Sw1PBU-FM,HM-SEC-MDIR,HM-SEC-RHS
HUEBridge,HUEDevice:LCT001,LLC001,LLC006,LWL001
OWDevice:DS1420,DS18B20,DS2406,DS2423
FS20:fs20as4,fs20bs,fs20di
AKCP:THS01,WS15
CUL_WS:S300TH

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 16049
Antw:Übergabe von Zeichenketten mit Leerzeichen an get-Befehle
« Antwort #35 am: 24 Februar 2017, 08:54:57 »
Danke, habs eingecheckt.

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 16049
Antw:Übergabe von Zeichenketten mit Leerzeichen an get-Befehle
« Antwort #36 am: 24 Februar 2017, 10:18:33 »
Ist immer noch madig:
{ fhem "set alarm off" if($mday==9 && $month==9) }meldet
syntax error at (eval 36) line 1, near "= ="weil parseParams daraus:
{ fhem "set alarm off" if($mday = =9 && $month==9) }macht.

Offline justme1968

  • Developer
  • Hero Member
  • ****
  • Beiträge: 16017
Antw:Übergabe von Zeichenketten mit Leerzeichen an get-Befehle
« Antwort #37 am: 24 Februar 2017, 10:26:38 »
war natürlich blödsinn den gesplitteten parameter von hand wieder zusammen zu setzen statt gleich das original zu verwenden...

so geht es:--- fhem.pl (revision 13496)
+++ fhem.pl (working copy)
@@ -4844,6 +4844,9 @@
     if( !defined( $value ) ) {
       $value = $kIndex: fhem.pl
===================================================================
--- fhem.pl (revision 13500)
+++ fhem.pl (working copy)
@@ -4851,7 +4851,7 @@

     # the key can not start with a { -> it must be a perl expression
     } elsif( $key =~ m/^\s*{/ ) {
-      $value = "$key = $value";
+      $value = $param;
       $key = undef;
     }
FHEM5.4,DS1512+,2xCULv3,DS9490R,HMLAN,2xRasPi
CUL_HM:HM-LC-Bl1PBU-FM,HM-LC-Sw1PBU-FM,HM-SEC-MDIR,HM-SEC-RHS
HUEBridge,HUEDevice:LCT001,LLC001,LLC006,LWL001
OWDevice:DS1420,DS18B20,DS2406,DS2423
FS20:fs20as4,fs20bs,fs20di
AKCP:THS01,WS15
CUL_WS:S300TH

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 16049
Antw:Übergabe von Zeichenketten mit Leerzeichen an get-Befehle
« Antwort #38 am: 24 Februar 2017, 10:39:11 »
Eingecheckt.

Offline justme1968

  • Developer
  • Hero Member
  • ****
  • Beiträge: 16017
Antw:Übergabe von Zeichenketten mit Leerzeichen an get-Befehle
« Antwort #39 am: 05 März 2017, 22:08:38 »
@rudi: da ich nicht weiss ob du das hier: https://forum.fhem.de/index.php/topic,68517.msg599846.html#msg599846 gesehen hast...

mit dem folgenden patch wird das behoben. hilft auch gleich gegen tabs vor dem öffnenden {.

Index: fhem.pl
===================================================================
--- fhem.pl (revision 13580)
+++ fhem.pl (working copy)
@@ -4871,7 +4871,7 @@
     }

     #collect all parts until opening { and closing } are matched
-    if( $value =~ m/^{/ ) { # } for match
+    if( $value =~ m/^\s*{/ ) { # } for match
       my $count = 0;
       for my $i (0..length($value)-1) {
         my $c = substr($value, $i, 1);
FHEM5.4,DS1512+,2xCULv3,DS9490R,HMLAN,2xRasPi
CUL_HM:HM-LC-Bl1PBU-FM,HM-LC-Sw1PBU-FM,HM-SEC-MDIR,HM-SEC-RHS
HUEBridge,HUEDevice:LCT001,LLC001,LLC006,LWL001
OWDevice:DS1420,DS18B20,DS2406,DS2423
FS20:fs20as4,fs20bs,fs20di
AKCP:THS01,WS15
CUL_WS:S300TH

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 16049
Antw:Übergabe von Zeichenketten mit Leerzeichen an get-Befehle
« Antwort #40 am: 05 März 2017, 22:37:50 »
Habs eingecheckt.

Offline justme1968

  • Developer
  • Hero Member
  • ****
  • Beiträge: 16017
Antw:Übergabe von Zeichenketten mit Leerzeichen an get-Befehle
« Antwort #41 am: 05 März 2017, 22:44:13 »
@rudi: mein patch oben behebt nur den fehler beim parsen mit parseParams. damit es auch zur laufzeit geht muss vermutlich mindestens das hier:Index: fhem.pl
===================================================================
--- fhem.pl (revision 13580)
+++ fhem.pl (working copy)
@@ -1045,7 +1045,7 @@
   Log 5, "Cmd: >$cmd<";
   return undef if(!$cmd);

-  if($cmd =~ m/^{.*}$/s) {              # Perl code
+  if($cmd =~ m/^\s*{.*}$/s) {              # Perl code
     return AnalyzePerlCommand($cl, $cmd, 1);
   }

auch noch geändert werden. das gleiche in SemicolonEscape. und ReplaceEventMap. kann es aber gerade nicht selber testen.
FHEM5.4,DS1512+,2xCULv3,DS9490R,HMLAN,2xRasPi
CUL_HM:HM-LC-Bl1PBU-FM,HM-LC-Sw1PBU-FM,HM-SEC-MDIR,HM-SEC-RHS
HUEBridge,HUEDevice:LCT001,LLC001,LLC006,LWL001
OWDevice:DS1420,DS18B20,DS2406,DS2423
FS20:fs20as4,fs20bs,fs20di
AKCP:THS01,WS15
CUL_WS:S300TH

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 16049
Antw:Übergabe von Zeichenketten mit Leerzeichen an get-Befehle
« Antwort #42 am: 05 März 2017, 22:47:06 »
Dann warte ich.

Offline justme1968

  • Developer
  • Hero Member
  • ****
  • Beiträge: 16017
Antw:Übergabe von Zeichenketten mit Leerzeichen an get-Befehle
« Antwort #43 am: 05 März 2017, 23:05:07 »
ok... weil du es bist :)

AnalyzeCommand, SemicolonEscape und ReplaceEventMap können bleiben wie sie sind aber wenn man im notify die öffnende { nicht nur in der ersten sondern auch in der zweiten zeile erlauben will muss man das splitten im define z.b. so ändern:Index: 91_notify.pm
===================================================================
--- 91_notify.pm (revision 13580)
+++ 91_notify.pm (working copy)
@@ -28,7 +28,7 @@
 notify_Define($$)
 {
   my ($hash, $def) = @_;
-  my ($name, $type, $re, $command) = split("[ \t]+", $def, 4);
+  my ($name, $type, $re, $command) = split("[ \t\n]+", $def, 4);

   if(!$command) {
     if($hash->{OLDDEF}) { # Called from modify, where command is optional

für at gilt vermutlich ähnliches.
« Letzte Änderung: 05 März 2017, 23:15:48 von justme1968 »
FHEM5.4,DS1512+,2xCULv3,DS9490R,HMLAN,2xRasPi
CUL_HM:HM-LC-Bl1PBU-FM,HM-LC-Sw1PBU-FM,HM-SEC-MDIR,HM-SEC-RHS
HUEBridge,HUEDevice:LCT001,LLC001,LLC006,LWL001
OWDevice:DS1420,DS18B20,DS2406,DS2423
FS20:fs20as4,fs20bs,fs20di
AKCP:THS01,WS15
CUL_WS:S300TH

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 16049
Antw:Übergabe von Zeichenketten mit Leerzeichen an get-Befehle
« Antwort #44 am: 05 März 2017, 23:30:01 »
Bin nicht sicher, ob ich diese Syntax fuer gut finde, habe aber nicht genug Argumente dagegen, habs also eingecheckt.