NEWS
History Adapter CSV versenden
-
Hallo zusammen,
gibt es eine Möglichkeit, aus dem History Adapter die generierte CSV Datei automatisch an eine Mailadresse zu versenden? Dafür benötige ich wohl den E-Mail Adapter. Finde aber keine Möglichkeit, die CSV Datei automatisch zu generieren und zu speichern. Am besten wäre eine Lösung mit Blockly, da ich mit Javascript noch nicht zu Recht komme.
VG
Sören -
@sören sagte in History Adapter CSV versenden:
Am besten wäre eine Lösung mit Blockly, da ich mit Javascript noch nicht zu Recht komme.
Für die
getHistory
Funktion gibt es keinen Blockly-Baustein soweit ich weiß. Daher wird das nichts ohne JavaScript.Wie genau soll die CSV-Datei denn aufgebaut sein?
Siehe https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#gethistory
-
@haus-automatisierung Danke für die schnelle Reaktion. Eigentlich reicht mir die manuell generierte CSV Datei im Datenpunkt völlig aus. Diese soll einfach automatisch an eine E-Mailadresse versendet werden, damit ich nicht immer im Datenpunkt nachsehen muss. Es muss nur der Timestamp und der Wert des Datenpunktes aufgeführt sein.
-
@sören sagte in History Adapter CSV versenden:
Es muss nur der Timestamp und der Wert des Datenpunktes aufgeführt sein.
Über welchen Zeitraum? Jeden Tag eine Mail mit dem Inhalt der letzten 24 Stunden?
-
@haus-automatisierung 1 Mal pro Woche die Daten der letzten Woche. Der Datenpunkt wird nur ca. 4 mal am Tag aktualisiert.
-
@sören sagte in History Adapter CSV versenden:
@haus-automatisierung 1 Mal pro Woche die Daten der letzten Woche. Der Datenpunkt wird nur ca. 4 mal am Tag aktualisiert.
Dann bitte mal so testen
- objId muss den Datenpunkt enthalten, für welchen History aktiviert ist
- Bitte deine Mailadresse und Absender anpassen
Das Ganze startet ein Cron, welcher Montags um 00:00 läuft und die Mail sendet.
Die Mail-Funktion habe ich nur aus der Doku so abgetippt - nicht getestet
const objId = 'yr.0.forecastHourly.0h.air_temperature'; const fileName = `${objId}.csv`; const filePath = `/opt/iobroker/iobroker-data/${fileName}`; var fs = require('fs'); schedule("0 0 * * 1", async () => { const end = new Date().getTime(); const start = end - (60 * 60 * 24 * 7 * 1000); // letzte 7 Tage; getHistory('history.0', { id: objId, start: start, end: end, aggregate: 'none', timeout: 2000 }, (err, result) => { if (err) { console.error(`Unable to get history of ${objId}: ${err}`); } else if (result) { let csvData = ['timestamp;value']; for (var i = 0; i < result.length; i++) { csvData.push(`${new Date(result[i].ts).toISOString()};${result[i].val}`); } fs.writeFileSync(filePath, csvData.join("\n")); sendTo('email.0', { from: 'iobroker@mydomain.com', to: 'yourmail@mydomain.com', subject: `History-Daten von ${objId}`, text: `Hier sind die History-Daten von ${start.toLocaleString()} bis ${end.toLocaleString()}`, attachments: [ { path: filePath } ] }, (err, result) => { if (err) { console.error(`Unable to send email: ${err}`); } fs.unlinkSync(filePath); }); } }); });
-
@haus-automatisierung Super, vielen Dank das probiere ich mal aus.
-
@haus-automatisierung Habe nun ja meine erste Mail erhalten. Dies hat auch gut funktioniert. Die CSV Datei ist im Anhang. LEider haben die Timestamps einen Versatz von -2 Stunden. In der Tabelle im ioBroker werden die Zeiten richtig angezeigt. Weißt du wo der Fehler liegen könnte? SOnst finde ich das schon irgendwie raus,
Danke nochmal!
-
@sören Ja, ich habe die als ISO-String (UTC) ausgegeben im CSV. Siehe
new Date(result[i].ts).toISOString()
. Wie genau möchtest Du die Daten denn weiter verarbeiten? -
@haus-automatisierung ich möchte dir in ein Tool importieren. Klappt auch nur der Zeitversatz von zwei Stunden war mir aufgefallen. Aber wenn das leicht anzupassen wäre? Funktioniert alles.
-
@sören sagte in History Adapter CSV versenden:
ich möchte dir in ein Tool importieren
Jetzt müsste ich also raten, in welchem Format das Tool gerne das Datum hätte. Wir machen das so: Hier gibt es ein angepasstes Script, und Du kannst das Format für das Datum selbst bestimmen.
const objId = 'yr.0.forecastHourly.0h.air_temperature'; const csvDateFormat = 'DD.MM.YYYY hh:mm:ss'; const fileName = `${objId}.csv`; const filePath = `/opt/iobroker/iobroker-data/${fileName}`; var fs = require('fs'); schedule("0 0 * * 1", async () => { const end = new Date().getTime(); const start = end - (60 * 60 * 24 * 7 * 1000); // letzte 7 Tage; getHistory('history.0', { id: objId, start: start, end: end, aggregate: 'none', timeout: 2000 }, (err, result) => { if (err) { console.error(`Unable to get history of ${objId}: ${err}`); } else if (result) { let csvData = ['timestamp;value']; for (var i = 0; i < result.length; i++) { csvData.push(`${formatDate(new Date(result[i].ts), csvDateFormat)};${result[i].val}`); } fs.writeFileSync(filePath, csvData.join("\n")); sendTo('email.0', { from: 'iobroker@mydomain.com', to: 'yourmail@mydomain.com', subject: `History-Daten von ${objId}`, text: `Hier sind die History-Daten von ${formatDate(new Date(start), csvDateFormat)} bis ${formatDate(new Date(end), csvDateFormat)}`, attachments: [ { path: filePath } ] }, (err, result) => { if (err) { console.error(`Unable to send email: ${err}`); } fs.unlinkSync(filePath); }); } }); });
-
@haus-automatisierung klasse, danke für deine tolle Unterstützung. Ja das Tool ist nicht von mir sondern von meiner Firma. Weiß das also auch nicht so genau. Ich probiere das nochmal aus und melde mich.
-
@haus-automatisierung Habe gestern die neue Mail erhalten. Das Datumsformat ist korrekt, allerdings wird immernoch ein Versatz von 2 Stunden ausgegeben. Wie kann ich hier die richtige Zeitzone einstellen? In der Ausgabe des History Adapters wird die korrekte Zeit für den Timestamp angezeigt.
Besten Dank
Sören -
@sören sagte in History Adapter CSV versenden:
Wie kann ich hier die richtige Zeitzone einstellen?
Ich habe das gerade noch einmal getestet. Bei mir stimmt das Datum / Uhrzeit. Hast Du auf dem System die richtige Zeitzone konfiguriert?
sudo timedatectl set-timezone Europe/Berlin