NEWS
[Gelöst] Wie eine Json Tabelle um einen String ergänzen
-
Hi Leute,
ich möchte die tägliche Regenmenge meiner Wetterstation in eine Tabelle schreiben welche zyklisch jeden Tag um das aktuelle Datum ergänzt wird.
Ich habe in einem anderen Beitrag ein Script gefunden das ich für meine Wünsche benutzen kann um die Tabelle zu erstellen. Jedoch schaffe ich es nicht die bereits vorhandenen Werte einzulesen und diese dann um den aktuellen Tag zu ergänzen.
Hier mal das Script:
! ```
var logging = false; // Logging on/off var instanz = 'javascript.0'; instanz = instanz + '.'; // // var pfad0 = 'Wetterstation'; pfad0 = pfad0 + '.'; // Pfad ! // ----------------------------------------------------------------------------- // Objekte // ----------------------------------------------------------------------------- // Datenpunkt createState(pfad0 + 'Regen_Historie', {def:'', type: 'string', name: 'Regen_Historie als JSON Objekt'}); ! function strToJson(str) { str = str.split(/\d:Datum:| Regenmenge:/); tabelle = []; ! for (i=1; i<=str.length-1; i=i+2) { //log(str[i] + " . " + str[i+1]); tabelle.push({ "Nr" : Math.floor((i+2)/2), "Datum" : str[i], "Regenmenge": str[i+1], }); } return JSON.stringify(tabelle); } ! function main() { var str = "1:Datum:11.08.2017 Regenmenge:6.79mm 2:Datum:12.08.2017 Regenmenge:10.62mm"; setState(pfad0 + 'Regen_Historie',strToJson(str)); } ! main();
! Kann mir einer von euch sagen wie ich den Datenpunkt einlesen muss um Ihn bspw. um "Datum:11.09.2017 Regenmenge:6.79mm" als dritten Wert zu erweitern?
! Hoffe ich habe mich verständlich ausgedrückt
! Gruß
! Peoples[/i][/i] -
…
Du erzeugst mit strToJson einen (EINEN) neuen Eintrag.
Hol einfach vorher die Tabelle mit getState(), dann parsen (JSON.parse), dann push, dann mit setState zurückschreiben.
Warum ich das jetzt nicht genauer ausformuliere ist, weil ich's für keine gute Idee halte
Das Ding wird immer größer und größer ...
Warum aktivierst Du nicht einfach den History Adapter auf dem Datenpunkt und schreibst einfach den letzten Eintrag (von mir aus auch als JSON)?? ... das ganze Anhängen und Verwalten macht dann der History Adapter.
-
Zum einen fehlt mir da die Verständniss hab da schon einige Male rumgespielt aber wirklich ein brauchbares Ergebnis kam nie raus.
Zum anderen möchte ich diesen Wert "nur" einmal um 23:59Uhr loggen und das kann man wie ich es verstanden habe nicht einstellen oder?
-
möchte ich diesen Wert "nur" einmal um 23:59Uhr loggen und das kann man wie ich es verstanden habe nicht einstellen oder? `
Doch, das macht man mit https://github.com/ioBroker/ioBroker.javascript#schedule.var logging = false; // Logging on/off var pfad0 = 'Wetterstation.'; // Pfad // Datenpunkt createState(pfad0 + 'Regen_Historie', {def:'', type: 'string', name: 'Regen_Historie als JSON Objekt'}); function strToJson(str) { var json = getState(pfad0 + 'Regen_Historie').val; var tabelle = []; if(json != "") tabelle = JSON.parse(json); tabelle.push(str); return JSON.stringify(tabelle); } function logRegen() { var str = 'Datum: ' + formatDate(new Date(), 'DD.MM.YYYY') + ' Regenmenge: ' + getState('ID des DP mit täglicher Regenmenge').val + ' mm'; setState(pfad0 + 'Regen_Historie', strToJson(str)); } schedule('59 23 * * *', logRegen);
möchte die tägliche Regenmenge meiner Wetterstation `
Dann musst Du eine Datenpunkt mit dem Wert für die tägliche Regenmenge haben. Wo wird der Wert eingelesen ? -
Das war genau die Lösung!
Der Datenpunkt kommt von der HM-Wetterstation:
function logRegen() { var str = 'Datum: ' + formatDate(new Date(), 'DD.MM.YYYY') + ' Regenmenge: ' + getState("hm-rpc.0.xxxxxxxxx.1.RAIN_COUNTER").val + ' mm'; setState(pfad0 + 'Regen_Historie', strToJson(str)); log('durchlauf'); }
Tausend Dank!
Peoples
-
Der Vollständigkeit halber hier nochmal das ganze Script, da es noch einen Fehler hatte falls es doch jemand mal braucht.
// Regenmenge in Variable schreiben function strToJson(str) { str = str.split(/Datum:| Regenmenge:/); var json = getState(pfad0 + 'Regen_Historie').val; var tabelle = []; if(json !== "") tabelle = JSON.parse(json); tabelle.push({ "Datum" : str[1], "Regenmenge": str[2], }); return JSON.stringify(tabelle); } function logRegen(regenmenge) { var datum = new Date(); var str = 'Datum: ' + formatDate(new Date().setDate(new Date().getDate()-1), 'DD.MM.YYYY') + ' Regenmenge: ' + regenmenge + ' l/qm'; setState(pfad0 + 'Regen_Historie', strToJson(str)); log('durchlauf'); } on("hm-rega.0.xxxx"/*${sysVarRainYesterday}*/, function (dp) { logRegen(dp.state.val); });
Gruß
Steffen