NEWS
[Frage] Data Logging in Textdadei [gelöst]
-
Hallo zusammen,
ich habe zur Zeit einen Raum, den ich entfeuchten muss. Dazu möchte ich temporär für ein Paar Tage jede 15 Minuten die
aktuelle Temperatur und Luftfeuchte, kommagetrennt in eine Textdatei schreiben.
Könnte mir jemand bei dem Script helfen?
Dies hier sind die beiden Datenpunkte
"hm-rpc.0.MEQ1571251.1.HUMIDITY" "hm-rpc.0.MEQ1571251.1.TEMPERATURE"
Gruss.
ToBo
-
Du suchst bestimmt das http://forum.iobroker.net/viewtopic.php?t=3907
-
Also ich habe mir das nun mal angesehen. Da gibt es ein Paar Sachen die ich nicht verstehe.
var fs = require('fs');
Diesen Befehl verstehe ich nicht
var fn = "/opt/iobroker/iobroker-data/scripts.log";
Hier wird der Dateiname festgelegt
function flog(txt) { var ts = new Date(); var ms = ts.getMilliseconds(); if (ms < 10) { ms = "00" + ms; } else if (ms > 9 && ms < 100) { ms = "0" + ms; }
Hier werden meiner Meinung nach lediglich die Millisekunden formatiert
ts = formatDate(ts, "YYYY-MM-DD hh:mm:ss.") + ms + " \t";
Hier wird das Datum formatiert und die Millisekunden angeängt, Wobei ich "\t" auch nicht verstehe
fs.appendFileSync(fn, ts + txt + "\n");
Hier wird alles in die Datei geschrieben, bzw. angehängt. Was steht aber in der "txt" steht weiss ich auch nicht.
Ich sehe nur ein Datum und Zeitangabe, aber keine Daten und keine Kommatrennung.
Ich habe mir das nun mal so gedacht.
var fs = require('fs'); var fn = "/opt/iobroker/iobroker-data/entfeuchtung.log"; function flog() { var ts = new Date(); ts = formatDate(ts, "YYYY-MM-DD hh:mm:ss.") + " \t"; fs.appendFileSync(fn, ts + "," + "hm-rpc.0.MEQ1571251.1.HUMIDITY".val + "," + "hm-rpc.0.MEQ1571251.1.TEMPERATURE".val + "\n"); }
Ich brauche keine Millisekunden. Deswegen habe ich den Teil entfernt. Falls das funktionieren sollte, müsste man die Funktion nur noch alle 15 Minuten ausführen.
-
Diesen Befehl verstehe ich nicht `
Siehe https://nodejs.org/api/fs.html von Node.js.
@TOBO:Wobei ich "\t" auch nicht verstehe `
Es wird ein Tabulator angehängt.
@TOBO:Was steht aber in der "txt" steht weiss ich auch nicht. `
Das wird vom aufrufenden Programm an die Funktion übergeben. Bei mir sieht die Datei so aus:!
2016-04-27 13:00:05.356 Netzspannung ausgefallen 2016-04-27 15:58:25.375 Akku kurz vor Shutdown: 36.48 % 2016-04-27 16:01:30.554 Netzspannung vorhanden 2017-08-01 17:52:56.180 Schlafen.WT-UNREACH: true 2017-08-01 17:53:09.150 Bad.UNREACH: true 2017-08-01 17:55:16.610 Wohnen.WT-UNREACH: true 2017-08-01 17:55:18.417 Aussen.UNREACH: true 2017-08-01 18:42:40.637 Wohnen.WT-UNREACH: false 2017-08-01 18:43:07.351 Schlafen.WT-UNREACH: false 2017-08-01 18:43:28.368 Aussen.UNREACH: false 2017-08-01 18:43:52.517 Bad.UNREACH: false 2017-08-01 21:57:50.560 Wohnen.WT-CONFIG_PENDING: true 2017-08-01 21:58:19.252 Wohnen.WT-CONFIG_PENDING: false 2017-08-01 21:58:27.976 Schlafen.WT-CONFIG_PENDUNG: true 2017-08-01 21:59:33.951 Schlafen.WT-CONFIG_PENDUNG: false 2017-09-07 11:27:24.403 Aussen.CONFIG_PENDING: true 2017-09-07 11:27:31.981 Aussen.CONFIG_PENDING: false 2017-09-09 23:00:04.412 Bad.UNREACH: true 2017-09-09 23:01:47.834 Bad.UNREACH: false 2017-09-16 04:34:37.045 Bad.UNREACH: true 2017-09-16 04:35:14.344 Bad.UNREACH: false 2017-09-17 10:00:04.413 Bad.UNREACH: true 2017-09-17 10:01:21.148 Bad.UNREACH: false 2017-09-22 06:00:04.345 Bad.UNREACH: true 2017-09-22 06:01:02.994 Bad.UNREACH: false !
Und aus diesem Skript wird die Funktion aufgerufen:on(/\.UNREACH|LOWBAT|CONFIG_PENDING|FAULT_REPORTING$/, function(dp) { var val = dp.state.val; var old = dp.oldState.val; if (val != old) { if(dp.common.name) flog(dp.common.name + ": " + val); else flog(dp.id + ": " + val); } });
fs.appendFileSync(fn, ts + "," + "hm-rpc.0.MEQ1571251.1.HUMIDITY".val + "," + "hm-rpc.0.MEQ1571251.1.TEMPERATURE".val + "\n"); ```` `
–>
fs.appendFileSync(fn, ts + "," + getState("hm-rpc.0.MEQ1571251.1.HUMIDITY").val + "," + getState("hm-rpc.0.MEQ1571251.1.TEMPERATURE").val + "\n");
-
Also würde das so funktionieren ?
var fs = require('fs'); var fn = "/opt/iobroker/iobroker-data/entfeuchtung.log"; function flog() { var ts = new Date(); ts = formatDate(ts, "YYYY-MM-DD hh:mm:ss.") + " \t"; fs.appendFileSync(fn, ts + "," + getState("hm-rpc.0.MEQ1571251.1.HUMIDITY").val + "," + getState("hm-rpc.0.MEQ1571251.1.TEMPERATURE").val + "\n"); }
Dann fehlt mir nur noch der Teil, der diese Function alle 15 Minuten startet.
-
Dann fehlt mir nur noch der Teil, der diese Function alle 15 Minuten startet. `
Am Ende:schedule('*/15 * * * *', flog);
-
Ich habe es jetzt mal so gemacht. Scheint auch zu funktionieren.
// Logging in Datei /opt/iobroker/iobroker-data/feuchte.log var fs = require('fs'); var fn = "/opt/iobroker/iobroker-data/feuchte.log"; var Feuchte = "hm-rpc.0.MEQ1571251.1.HUMIDITY" var Temperatur = "hm-rpc.0.MEQ1571251.1.TEMPERATURE" function flog(Daten) { var Zeitstempel = new Date(); var ms = Zeitstempel.getMilliseconds(); if (ms < 10) { ms = "00" + ms; } else if (ms > 9 && ms < 100) { ms = "0" + ms; } Datum = formatDate(Zeitstempel, "YYYY-MM-DD") + " \t"; Zeit = formatDate(Zeitstempel, "hh:mm:ss.") + ms + " \t"; fs.appendFileSync(fn, Datum + Zeit + Daten + "\n"); } schedule('*/15 * * * *', flog(getState("hm-rpc.0.MEQ1571251.1.HUMIDITY").val + " \t" + getState("hm-rpc.0.MEQ1571251.1.TEMPERATURE").val + " \t"));
PS: Ich weiss nicht was ich gemacht habe, aber wenn ich das Script jetzt starte kommt dieser Fehler
javascript.0 script.js.common.LogWerkstattFeuchte: schedule callback missing
Nachdem ich das Script starte, werden die aktuellen Daten in die Datei geschrieben, aber das "schedule" scheint nicht zu funktionieren.
-
Wenn Daten an die Callback-Funktion von schedule() übergeben werden, muss sie als anonyme Funktion aufgeführt werden.
schedule('*/15 * * * *', function() { flog(getState("hm-rpc.0.MEQ1571251.1.HUMIDITY").val + " \t" + getState("hm-rpc.0.MEQ1571251.1.TEMPERATURE").val ); });
-
Übrigens kann formatDate() mittlerweile auch ms:
var Zeitstempel = new Date(); Datum = formatDate(Zeitstempel, "YYYY-MM-DD") + " \t"; Zeit = formatDate(Zeitstempel, "hh:mm:ss.sss") + " \t";
oder als Einzeiler
Zeit = formatDate(new Date(), "YYYY-MM-DD \thh:mm:ss.sss \t");