Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [Gelöst] Wie eine Json Tabelle um einen String ergänzen

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    [Gelöst] Wie eine Json Tabelle um einen String ergänzen

    This topic has been deleted. Only users with topic management privileges can see it.
    • Peoples
      Peoples last edited by

      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]

      1 Reply Last reply Reply Quote 0
      • D
        dwm last edited by

        …

        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.

        1 Reply Last reply Reply Quote 0
        • Peoples
          Peoples last edited by

          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?

          1 Reply Last reply Reply Quote 0
          • paul53
            paul53 last edited by

            @peoples:

            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);
            

            @peoples:

            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 ?

            1 Reply Last reply Reply Quote 0
            • Peoples
              Peoples last edited by

              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

              1 Reply Last reply Reply Quote 0
              • Peoples
                Peoples last edited by

                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

                1 Reply Last reply Reply Quote 0
                • First post
                  Last post

                Support us

                ioBroker
                Community Adapters
                Donate

                770
                Online

                31.7k
                Users

                79.8k
                Topics

                1.3m
                Posts

                3
                6
                1426
                Loading More Posts
                • Oldest to Newest
                • Newest to Oldest
                • Most Votes
                Reply
                • Reply as topic
                Log in to reply
                Community
                Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                The ioBroker Community 2014-2023
                logo