FHEM Forum

FHEM => Sonstiges => Thema gestartet von: ThomasDr am 20 Juli 2025, 08:59:47

Titel: Semikolon maskieren?
Beitrag von: ThomasDr am 20 Juli 2025, 08:59:47
Hallo,

Ich möchte mit einen notify eine csv Datei erstellen und ein Semikolon als Trennzeichen benutzen, habe aber noch keine Möglichkeit gefunden das Semikolon zu maskieren.
Mittlerweile benutze ich ein anderes Trennzeichen und würde einfach aus Interesse gerne wissen wie man das mit dem Semikolon macht.

Schöne Grüße
ThomasD
Titel: Aw: Semikolon maskieren?
Beitrag von: betateilchen am 20 Juli 2025, 10:09:43
Poste doch mal den Code, den Du dafür verwendest.
Titel: Aw: Semikolon maskieren?
Beitrag von: ThomasDr am 20 Juli 2025, 10:47:21
Hallo,

So funktionierte es nicht mit Semikolon:
my $trenner = ',';
my $zeitformat = strftime '%H:%M', localtime();
my $dateformat = strftime '%d-%m-%Y', localtime();
$csvline = $dateformat.$trenner.$zeitformat.$trenner.$daten;
system("echo $csvline >> /opt/fhem-log/daten.csv");

Chatgpt hat mir dann aber ein paar Lösungen vorgeschlagen, eine mit system und eine mit open, diese sollte eine bessere Wahl sein:
my $zeitformat = strftime '%H:%M', localtime();
my $dateformat = strftime '%d-%m-%Y', localtime();
my $trenner = ";";
$csvline = "$dateformat$trenner$zeitformat$trenner$daten\n";
open(my $fh, '>>', '/opt/fhem-log/daten.csv');
print $fh $csvline;
close($fh);

Schöne Grüße
ThomasD
Titel: Aw: Semikolon maskieren?
Beitrag von: betateilchen am 20 Juli 2025, 11:09:39
Zitat von: ThomasDr am 20 Juli 2025, 10:47:21Chatgpt hat mir dann aber ein paar Lösungen vorgeschlagen

Manchmal kommt man mit menschlicher Intelligenz und FHEM-Bordmitteln schneller ans Ziel.

sub xx {
my $daten = "Testdaten";
my $out   = strftime('%d-%m-%Y;%H:%M;', localtime()).$daten;
FileWrite("/opt/fhem/log/daten.csv",$out);
}

liefert als Ergebnis in der Datei /opt/fhem/log/daten.csv:

20-07-2025;11:07;Testdaten
Titel: Aw: Semikolon maskieren?
Beitrag von: Otto123 am 20 Juli 2025, 11:18:20
Unabhängig von besseren Lösungen und so ganz allgemein für FHEM:
wenn der Code in der Kommandozeile von FHEM ausgeführt wird, bzw. so in der DEF steht, muss ein semikolon verdoppelt werden, damit es erhalten bleibt. Sonst wertet es FHEM als Befehlstrenner.

Beispiel analog zu Deinem Code:
{system("echo 'Satz ;; mit semikolon' >>test.txt")}ergibt
ZitatSatz ; mit semikolon
Titel: Aw: Semikolon maskieren?
Beitrag von: rudolfkoenig am 20 Juli 2025, 11:25:31
Zitatsystem("echo $csvline >> /opt/fhem-log/daten.csv");
Wenn $csvline Semikolons enthaelt, dann sind das fuer den Shell (wg. system) mehrere Befehle.
Fix:
system("echo '$csvline' >> /opt/fhem-log/daten.csv");Abgesehen davon ist diese Loesung ineffizient, da ein Prozess gestartet wird, um eine Zeile zu schreiben.

ChatGPTs Vorschlag ist effizienter.
betateilchens auch, zusaetzlich "FHEM-Konform" wg. FileWrite, und wegen sub in 99_myUtils.pm besser pflegbar.
Titel: Aw: Semikolon maskieren?
Beitrag von: rudolfkoenig am 20 Juli 2025, 11:31:48
Zitatwenn der Code in der Kommandozeile von FHEM ausgeführt wird, bzw. so in der DEF steht, muss ein semikolon verdoppelt werden, damit es erhalten bleibt. Sonst wertet es FHEM als Befehlstrenner.
Das ist richtig, wenn man fhem.cfg direkt editiert, oder die Modifikation in "Raw definition" im Detailansicht stattfindet.
Der Editor, was mit Click auf "DEF" geoeffnet wird, und per "modify XX" gespeichert wird, fuehrt die Strichpunkt-Doppelung automatisch durch.
Ja, ist etwas verwirrend. Einer der Gruende, warum man laengeren Code in 99_myUtils auslagern sollte.
Titel: Aw: Semikolon maskieren?
Beitrag von: betateilchen am 20 Juli 2025, 11:34:27
Zitat von: rudolfkoenig am 20 Juli 2025, 11:25:31Wenn $csvline Semikolons enthaelt, dann sind das fuer den Shell (wg. system) mehrere Befehle.

Und das Ergebnis (Fehlermeldungen) sieht man auch schön, wenn man danach ins FHEM Log schaut - spaßeshalber hatte ich den Originalcode mit system() vorhin auch getestet. Da sieht man schön, dass auf der Shell die Semikolon verschwinden und der Text in drei Befehle aufgeteilt wird:

20-07-2025
sh: 1: 11:01: not found
sh: 1: Testdaten: not found
Titel: Aw: Semikolon maskieren?
Beitrag von: ThomasDr am 20 Juli 2025, 12:08:26
Dann scheint mir die FileWrite Variante in fhem die beste zu sein, die Formatierung kann ich dann beibehalten.