[GELÖST!] Pluszeichen (+) verschwindet aus String

Begonnen von DocCyber, 28 Juni 2022, 16:54:07

Vorheriges Thema - Nächstes Thema

DocCyber

Hallo zusammen,

hat jemand eine Idee, warum das Pluszeichen (hinter at) im nachfolgenden Ausdruck (Teil eines Perl-Codes) ignoriert wird?

  ...
  my $t = sprintf("%02d", ReadingsVal("settings","timeout","0"));
  my $cmd = "define myTimer at +00:" . $t . ":00 set myDevice locked 0";
  ...


Ausgabe für $cmd für settings:timeout = 3 Minuten

  define myTimer at  00:03:00 set myDevice locked 0


Das Pluszeichen wurde durch ein Leerzeichen ersetzt. Damit ist der Ausdruck für mich wertlos.
Ich weiß nicht, wie ich das verhindern kann.


Es ist übrigens interessant, dass das nicht passiert, wenn man den Ausdruck durch die fhem-Befehlszeile auswerten lässt.
Behandle die Menschen so, als wären sie, was sie sein sollten. Dadurch hilfst du ihnen zu werden, was sie sein können. (Goethe)


RPi-4B mit HM-CFG-LAN und viele weitere HM Komponenten, diverse Shellys, Tuya-Geräte, SMA und Solis Wechselrichter, Elgris EnergyManager, go-e Wallbox

Beta-User

Meine Idee: "Quotes in Perl"...
Es wir vermutlich extrapoliert, da du nur "doppelte Quotes" verwendest. Und dann wird das ggf. als Rechenoperation aufgefasst.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

DocCyber

#2
Naja, das stimmt - aber wie sollte ich das in diesem Fall anders machen?
Das Ergebnis ändert sich nicht, wenn ich single quotes verwende.

Edit: Backslash vor dem Pluszeichen hilft auch nichts.
Behandle die Menschen so, als wären sie, was sie sein sollten. Dadurch hilfst du ihnen zu werden, was sie sein können. (Goethe)


RPi-4B mit HM-CFG-LAN und viele weitere HM Komponenten, diverse Shellys, Tuya-Geräte, SMA und Solis Wechselrichter, Elgris EnergyManager, go-e Wallbox

betateilchen

In der FHEM Befehlszeile eingegeben:

{my $t = "03";; my $cmd = "define myTimer at +00:" . $t . ":00 set myDevice locked 0";; return $cmd}

erhalte ich folgendes Ergebnis:

define myTimer at +00:03:00 set myDevice locked 0
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Beta-User

Zitat von: DocCyber am 28 Juni 2022, 17:08:56
Naja, das stimmt - aber wie sollte ich das in diesem Fall anders machen?
Das Ergebnis ändert sich nicht, wenn ich single quotes verwende.

Also hattest du getestet:
my $cmd = 'define myTimer at +00:' . $t . ':00 set myDevice locked 0';

Oder auch sowas:
my $cmd = qq{define myTimer at +00:$t:00 set myDevice locked 0};
bzw.
my $cmd = q{define myTimer at +00:};
$cmd .= $t;
$cmd .= ':00 set myDevice locked 0';


@betateilchen:
Zitat von: DocCyber am 28 Juni 2022, 16:54:07
Es ist übrigens interessant, dass das nicht passiert, wenn man den Ausdruck durch die fhem-Befehlszeile auswerten lässt.

Daher stellt sich die Frage, was @DocCyber danach mit dem String noch anstellt...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

betateilchen

An welcher Stelle besteht denn das Problem?


sub test {
  my $t = "03";
  my $cmd = "define myTimer at +00:" . $t . ":00 set myDevice locked 0";
  return $cmd;
}


liefert auch das korrekte Ergebnis.

Mich würde interessieren, wie der Code


  ...
  my $t = sprintf("%02d", ReadingsVal("settings","timeout","0"));
  my $cmd = "define myTimer at +00:" . $t . ":00 set myDevice locked 0";
  ...


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

DocCyber

Zitat von: betateilchen am 28 Juni 2022, 17:17:18
In der FHEM Befehlszeile eingegeben:

{my $t = "03";; my $cmd = "define myTimer at +00:" . $t . ":00 set myDevice locked 0";; return $cmd}

erhalte ich folgendes Ergebnis:

define myTimer at +00:03:00 set myDevice locked 0

Ja, das stimmt - hatte ich ja auch geschrieben. Aber der Perl-Code ersetzt das Pluszeichen durch ein Blank.
Behandle die Menschen so, als wären sie, was sie sein sollten. Dadurch hilfst du ihnen zu werden, was sie sein können. (Goethe)


RPi-4B mit HM-CFG-LAN und viele weitere HM Komponenten, diverse Shellys, Tuya-Geräte, SMA und Solis Wechselrichter, Elgris EnergyManager, go-e Wallbox

betateilchen

Zitat von: DocCyber am 28 Juni 2022, 17:27:13
Ja, das stimmt - hatte ich ja auch geschrieben.

ja, das habe ich inzwischen auch gelesen.

Zitat von: DocCyber am 28 Juni 2022, 17:27:13
Aber der Perl-Code ersetzt das Pluszeichen durch ein Blank.

Dann zeig doch mal den Perl Code, der das Deiner Meinung nach tut.
Die beiden von Dir genannten zwei Zeilen ersetzen jedenfalls nichts.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

DocCyber

#8
Zitat von: betateilchen am 28 Juni 2022, 17:26:02


  ...
  my $t = sprintf("%02d", ReadingsVal("settings","timeout","0"));
  my $cmd = "define myTimer at +00:" . $t . ":00 set myDevice locked 0";
  ...


weitergeht.

Ich hatte hier (für's Forum) den Code etwas vereinfacht, um auf den Punkt zu kommen.
Tatsächlich sieht der Code nicht wesentlich komplizierter aus:

sub lockWallbox() {
# Zweck:          blockiert das Setzen einer anderen Ladestromstärke für einen bestimmten Zeitraum
# Aufruf durch:   notify n_wallboxLocked
  my $t = sprintf("%02d", ReadingsVal("wallboxSettings","timeout","5"));
  my $cmd = "define timer at +00:" . $t . ":00 setreading wallboxSettings locked 0";
  debug("lockWallbox", $cmd);
  fhem("setreading wallboxSettings locked 1");
  fhem($cmd);
}


der debug-Aufruf zeigt im Eventmonitor den Wert von $cmd, und dort fehlt das Pluszeichen.
Das wäre mir ja noch egal, wenn das at trotzdem korrrekt gesetzt würde...
EDIT: at wird tatsächlich korrekt gesetzt (hab's übersehen  :-[) - aber debug() zeigt es nicht richtig an. Damit besteht das Anzeigeproblem zwar weiter (kein Ahnung, warum) , aber das Wichtigste funktioniert.

Danke, @betateilchen.

Zur Info:

sub debug($$) {
  my $func = shift;   # Name der aufrufenden sub
  my $msg = shift;   # Meldung
  my $txt = "[$func] $msg";
  fhem("set DBG $txt");
}


Ich hatte zwischenzeitlich auch mit Backslash experimentiert. Nutzt nichts, der Backslash wird dann ebenfalls durch ein Blank ersetzt.
Behandle die Menschen so, als wären sie, was sie sein sollten. Dadurch hilfst du ihnen zu werden, was sie sein können. (Goethe)


RPi-4B mit HM-CFG-LAN und viele weitere HM Komponenten, diverse Shellys, Tuya-Geräte, SMA und Solis Wechselrichter, Elgris EnergyManager, go-e Wallbox

betateilchen

Wo kommt denn die Funktion debug() her und was steht da drin?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

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

DocCyber

Zitat von: betateilchen am 28 Juni 2022, 17:38:19
Wo kommt denn die Funktion debug() her und was steht da drin?

s. EDIT weiter oben.

Popcorn: süß oder salzig?  ;)
Wohl bekomm's
Behandle die Menschen so, als wären sie, was sie sein sollten. Dadurch hilfst du ihnen zu werden, was sie sein können. (Goethe)


RPi-4B mit HM-CFG-LAN und viele weitere HM Komponenten, diverse Shellys, Tuya-Geräte, SMA und Solis Wechselrichter, Elgris EnergyManager, go-e Wallbox

betateilchen

Verwende doch einfach Debug $cmd; dann findest Du die korrekte Ausgabe im Logfile.

So wirklich kooperativ bist Du hier nicht.
Das nachträgliche Editieren Deiner Beiträge nervt maßlos.

Wenn Du eine Antwort auf eine Frage geben möchtest, dann tu das bitte als Antwort und nicht als Edit.

Over & Out.


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

DocCyber


Ich wollte nicht unkooperativ sein.
Sorry wenn es anders rpbergekommen ist.

Danke für den Tipp mit Debug - kannte ich nicht, deshalb hab ich mir selbst was geschrieben.
Behandle die Menschen so, als wären sie, was sie sein sollten. Dadurch hilfst du ihnen zu werden, was sie sein können. (Goethe)


RPi-4B mit HM-CFG-LAN und viele weitere HM Komponenten, diverse Shellys, Tuya-Geräte, SMA und Solis Wechselrichter, Elgris EnergyManager, go-e Wallbox