NEWS
Schreiben und Lesen von Dateien
-
Hallo zusammen,
ich möchte einige Datenpunkte in regelmäßigen Abständen per Blockly in eine Datei schreiben, so, dass eine Logdatei entsteht. Dazu habe ich für die Appendfunktion die ich dafür benötige ein Beispiel aus dem Netz für mich angepasst. Das funktioniert auch und sieht folgendemaßen aus:

Wenn ich nun aus der Datei Zaehler_log.csv von den villeicht 100 vorhandenen Zeilen die ersten 50 Zeilen lösche (mit einem Texteditor), dann sind diese gelöschten 50 Zeilen nach dem nächsten Schreibvorgang von Blockly wieder da und die Datei ist wieder 100 Zeilen lang. Ich möchte aber gerne von Zeit zu Zeit händisch Einträge aus der Datei entfrenen. Was läuft da falsch? -
Hallo zusammen,
ich möchte einige Datenpunkte in regelmäßigen Abständen per Blockly in eine Datei schreiben, so, dass eine Logdatei entsteht. Dazu habe ich für die Appendfunktion die ich dafür benötige ein Beispiel aus dem Netz für mich angepasst. Das funktioniert auch und sieht folgendemaßen aus:

Wenn ich nun aus der Datei Zaehler_log.csv von den villeicht 100 vorhandenen Zeilen die ersten 50 Zeilen lösche (mit einem Texteditor), dann sind diese gelöschten 50 Zeilen nach dem nächsten Schreibvorgang von Blockly wieder da und die Datei ist wieder 100 Zeilen lang. Ich möchte aber gerne von Zeit zu Zeit händisch Einträge aus der Datei entfrenen. Was läuft da falsch? -
Hallo zusammen,
ich möchte einige Datenpunkte in regelmäßigen Abständen per Blockly in eine Datei schreiben, so, dass eine Logdatei entsteht. Dazu habe ich für die Appendfunktion die ich dafür benötige ein Beispiel aus dem Netz für mich angepasst. Das funktioniert auch und sieht folgendemaßen aus:

Wenn ich nun aus der Datei Zaehler_log.csv von den villeicht 100 vorhandenen Zeilen die ersten 50 Zeilen lösche (mit einem Texteditor), dann sind diese gelöschten 50 Zeilen nach dem nächsten Schreibvorgang von Blockly wieder da und die Datei ist wieder 100 Zeilen lang. Ich möchte aber gerne von Zeit zu Zeit händisch Einträge aus der Datei entfrenen. Was läuft da falsch?warum nutzt du nicht den history adapter?
dort kann man die daten auch als csv exportieren (über oberfläche),
aber auch mit javascript. mit blockly weiß ich jetzt nicht so genau, aber
den sendtobefehl gibt es ja dort auchwenn do die datenpunkt history nutzt kannst du die auch noch flexibler auswerten und visualisieren (bspw mit echarts)
-
So macht man das nicht gerne ...
Der Zeitplan sorgt minütlich für "Bewegung" in der Datei. Da ist die "Kollisionsgefahr" mit Deinen Editierversuchen groß ...
50 Zeilen löschen wäre das Logging von 50 Minuten.
Würde den Dateinamen mit Datum/Uhrzeit kombinieren, z. B. "Zaehler_log_2026_04_01_18_00.csv"
Stündlich oder täglich eine neue Log-Datei anfangen.
Automatisches oder händisches Housekeeping über den Dateinamen, oder das Dateialter. -
-
Die Dateioperationen aus Blockly nutzen soweit ich weiß NICHT die Betriebssystem-Funktionen.
Dateien innerhalb des iobroker-ökosystems sollte man nicht "von außen" z. B. mit einem Text-Editor schreibend anpacken.Dafür gibt es z. B. die iobroker - kommandozeilen-Kommandos.
https://github.com/ioBroker/ioBroker.docs/blob/master/docs/de/config/cli.md
Ein Kochrezept wäre
- Kopie des Files anlegen
iobroker file read /vis.0/main/imgZaehler_log.csv /tmp/Zaehler_log.csv-
Editieren der Kopie des Files in /tmp/Zaehler_log.csv
-
Geänderte Kopie des Files zurückschreiben
iobroker file write /tmp/Zaehler_log.csv /vis.0/main/imgZaehler_log.csv -
@homoran
Für das Markieren und Löschen der Zeilen sowie das anschließende Speichern benötige ich ca 15 Sekunden. -
Skript wurde nicht angehalten
Dann kannst du in die Asynchronfalle geraten, dass das Skript die Änderung überschreibt, aber...
Bearbeitung der Datei direkt auf dem Raspi.
Das "geht nicht".
Das wird nicht als geänderte Datei markiert.
Dazu muss sie neu mittels writeFile geschrieben, oder manuell über die GUI hochgeladen werden. -
@A250-Fan ja
-
Ich würde das ja versuchen anders aufzuziehen.
Schreib doch von vorneherein nur plausible Werte in die Datei. Dann musste dich auch nicht so umständlich wieder herausklamüsern. -
Vielleicht solltest du zunächst mal genauer definieren, was du als Ziel hast.
Du willst nur die letzten x Messwerte haben?
Oder willst du händisch Einträge löschen? Nach welchen Kriterien? -
Wenn du die Datei doch eh auf ein Netzlaufwerk haben willst, dann kannst du sie auch direkt dorthin schreiben. So mache ich das z.B. mit diversen Listen. Da wird der neue Text immer nur als Zeile darunter gesetzt.
Ich habe das folgende Blockly damals hier im Forum gefunden, weiß nur nicht mehr wo.

Die JS-Funktion enthält:
const fs = require('fs'); switch(mode) { case 'r': return fs.readFileSync(Dateiname, 'utf8'); case 'w': return fs.writeFileSync(Dateiname, Daten); case 'a': return fs.appendFileSync(Dateiname, Daten); default: return 'Parameter mode muss "r", "w" oder "a" sein'; }Oder hier das Blockly als Export:
<xml xmlns="https://developers.google.com/blockly/xml"> <variables> <variable id="[-H^4u[bLNKmNjJW5uP2">Dateiname</variable> <variable id="B@!nDrO;Ag4]/Ns]5`VT">Daten</variable> <variable id="Nw,T]ZGil{Kmm.Tfd=8`">mode</variable> <variable id="@`{2Tshq:9^uF$%i]pMW">Ergebnis</variable> </variables> <block type="schedule" id=",/z9[bkm:Mx.Xz)_WV}C" x="63" y="-12"> <field name="SCHEDULE">0 12 * * *</field> <statement name="STATEMENT"> <block type="variables_set" id="toixTd-7I(w?Pn.u`a?n"> <field name="VAR" id="[-H^4u[bLNKmNjJW5uP2">Dateiname</field> <value name="VALUE"> <block type="text" id="?(6$X5B~AZEV{a([vl[@"> <field name="TEXT">/opt/iobroker/Test.txt</field> </block> </value> <next> <block type="comment" id="E=!qQw-l-tNwXd3eE2{K"> <field name="COMMENT">schreibe Daten</field> <next> <block type="variables_set" id="OOlava!O!gwl*p7jMH{$"> <field name="VAR" id="@`{2Tshq:9^uF$%i]pMW">Ergebnis</field> <value name="VALUE"> <block type="procedures_callcustomreturn" id="#C-F-T.#.ZD80^Pn[:f}" inline="false"> <mutation name="Datei"> <arg name="Dateiname"></arg> <arg name="Daten"></arg> <arg name="mode"></arg> </mutation> <value name="ARG0"> <block type="variables_get" id="#%2(}]P4^Jg4JwKdoO0^"> <field name="VAR" id="[-H^4u[bLNKmNjJW5uP2">Dateiname</field> </block> </value> <value name="ARG1"> <block type="text_join" id="$s-gtsey+o{l3}RQF^uK"> <mutation items="6"></mutation> <value name="ADD0"> <block type="text_newline" id="cDYlllvQ1RZl;+$EdmU1"> <field name="Type">\n</field> </block> </value> <value name="ADD1"> <block type="time_get" id="|^_IZ6r;?Uk`wi{`![?8"> <mutation xmlns="http://www.w3.org/1999/xhtml" format="false" language="false"></mutation> <field name="OPTION">YYYY.MM.DD</field> </block> </value> <value name="ADD2"> <block type="text" id="/yr|qtO+29$HOSt`J$5t"> <field name="TEXT">;</field> </block> </value> <value name="ADD3"> <block type="time_get" id="leJ5uWCm;,j-I2A]Bi`V"> <mutation xmlns="http://www.w3.org/1999/xhtml" format="false" language="false"></mutation> <field name="OPTION">hh:mm:ss</field> </block> </value> <value name="ADD4"> <block type="text" id="=J#lQk)K7uCMaJghmU^;"> <field name="TEXT">;</field> </block> </value> <value name="ADD5"> <block type="get_value" id="f!OZs64Riw}U2PQFJ^Q8"> <field name="ATTR">val</field> <field name="OID">ID auswählen</field> </block> </value> </block> </value> <value name="ARG2"> <block type="text" id="3up}TP81c9Wp-96*F,5@"> <field name="TEXT">a</field> </block> </value> </block> </value> </block> </next> </block> </next> </block> </statement> </block> <block type="procedures_defcustomreturn" id="y8r,:{{HHSZ8(K/J*Z%." x="588" y="13"> <mutation statements="false"> <arg name="Dateiname" varid="[-H^4u[bLNKmNjJW5uP2"></arg> <arg name="Daten" varid="B@!nDrO;Ag4]/Ns]5`VT"></arg> <arg name="mode" varid="Nw,T]ZGil{Kmm.Tfd=8`"></arg> </mutation> <field name="NAME">Datei</field> <field name="SCRIPT">Y29uc3QgZnMgPSByZXF1aXJlKCdmcycpOw0Kc3dpdGNoKG1vZGUpIHsNCiAgICBjYXNlICdyJzogcmV0dXJuIGZzLnJlYWRGaWxlU3luYyhEYXRlaW5hbWUsICd1dGY4Jyk7DQogICAgY2FzZSAndyc6IHJldHVybiBmcy53cml0ZUZpbGVTeW5jKERhdGVpbmFtZSwgRGF0ZW4pOw0KICAgIGNhc2UgJ2EnOiByZXR1cm4gZnMuYXBwZW5kRmlsZVN5bmMoRGF0ZWluYW1lLCBEYXRlbik7DQogICAgZGVmYXVsdDogcmV0dXJuICdQYXJhbWV0ZXIgbW9kZSBtdXNzICJyIiwgInciIG9kZXIgImEiIHNlaW4nOw0KfQ==</field> <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment> </block> </xml>Gruß, Johannes
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden