Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Wie Regenmenge ermitteln (Wetterstation)

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Wie Regenmenge ermitteln (Wetterstation)

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

      Hallo

      aktuell habe ich meine Regensensor eingebunden.

      Der Zähler steht zz auf 1844.3

      Wie bekomme ich nun am einfachsten folgende Werte angezeigt

      Regenrate aktuell = ? mm/h

      Regen heute = ? mm

      Regenrate heute max = ? mm/h

      Regen gestern

      Vielleicht hat einer ja auch schon ne Wettertstation eingerichtet.

      Gruß

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

        melde mich, besser spät als nie, habe es beim googeln gefunden

        Ich habe es so gelöst

        Unter Objekte einen Datenpunkt als "Zahl" erstellt, ihr Name ist "variablen.0.Regenzaehler"

        Dieser wird bei mir auf dem NAS in der sql Datenbank abgelegt. (gehe jetzt dazu mal nicht mehr ein)

        Dann folgendes skript:

        var alterstand;
        alterstand=getState("hm-rpc.0.JEXXX.1.RAIN_COUNTER").val;
        
        schedule("/3 * * * *",function () {
        if (getState("hm-rpc.0.JEXXX.1.RAIN_COUNTER".val > alterstand)){
            setState("variablen.0.Regenzaehler", getState("hm-rpc.0.JEXXX.1.RAIN_COUNTER").val-alterstand);
            alterstand=getState("hm-rpc.0.JEXXX.1.RAIN_COUNTER").val;}
            else {setState("variablen.0.Regenzaehler", 0);}});
        
        

        so holt er alle 3 Minuten (ist der Intervallzeitraum der HM Wetterstadion) die Daten ab und speichert sie in meiner SQL Tabelle.

        zum Auswerten dann, kann ich das hier nur so empfehlen 😉

        http://forum.iobroker.net/viewtopic.php?t=2364

        ich hole so alle Temparatur und Feuchtigkeitsdaten meiner Thermometer.

        Das einzige wo ich noch nicht habe ist die Totale Regenmenge vom Zeitraum x bis y.

        So brauche ich meine Homematic Min/Max anzeige pro Thermometer in den letzten 2 Tagen gar nicht mehr

        zum Abfragen

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

          @noxx:

          Regenrate aktuell = ? mm/h `
          Prinzip:

          var max = 0;
          
          on(idZaehler, function(dp) {
              var val = dp.state.val;
              var lastVal = dp.oldState.val;
              var now = dp.state.lc;
              var lastTime = dp.oldState.lc;
              var aktuell = 3600000 * (val - lastVal) / (now - lastTime);
              setState(idAktuell, aktuell, true);
              if(aktuell > max) max = aktuell;
          });
          

          @noxx:

          Regen heute = ? mm

          Regenrate heute max = ? mm/h

          Regen gestern `

          schedule('0 0 * * *', function() {  // Mitternacht
              var zaehler = getState(idZaehler).val;
              var zaehlergestern = getState(idZaehlerGestern).val;
              setState(idZaehlerGestern, zaehler, true);
              var gestern = getState(idHeute).val;
              setState(idGestern, gestern, true);
              var heute = zaehler - zaehlergestern;
              setState(idHeute, heute, true);
              setState(idMaxHeute, max, true);
              max = 0;
          });
          

          EDIT: Faktor für Umrechnung ms –> h ergänzt.

          1 Reply Last reply Reply Quote 0
          • N
            noxx last edited by

            danke euch beiden

            ich lasse das script mal durchlaufen und gucke was passiert

            ! ````
            var max = 0;
            idZaehler = "rflink.0.channels.Cresta_2.RAIN"/Cresta_ 2 Total rain level/;
            ! on(idZaehler, function(dp) {
            var val = dp.state.val;
            var lastVal = dp.oldState.val;
            var now = dp.state.lc;
            var lastTime = dp.oldState.lc;
            var aktuell = (val - lastVal) / (now - lastTime);
            setState(idAktuell, aktuell, true);
            if(aktuell > max) max = aktuell;
            });
            ! schedule('0 0 * * *', function() { // Mitternacht
            var zaehler = getState(idZaehler).val;
            var zaehlergestern = getState(idZaehlerGestern).val;
            setState(idZaehlerGestern, zaehler, true);
            var gestern = getState(idHeute).val
            setState(idGestern, gestern, true);
            var heute = zaehler - zaehlergestern;
            setState(idHeute, heute, true);
            setState(idMaxHeute, max, true);
            max = 0;
            });

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

              @noxx:

              ich lasse das script mal durchlaufen und gucke was passiert `
              Du musst noch die Datenpunkte vom Typ Zahl erzeugen und die IDs deklarieren für:

              • idAktuell

              • idZaehlerGestern

              • idHeute

              • idGestern

              • idMaxHeute

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

                Habe Dein Skript noch etwas angepasst, wobei Du noch die Datenpunkt-IDs zuweisen musst.

                ! ````
                var max = 0;
                var idZaehler = "rflink.0.channels.Cresta_2.RAIN"/Cresta_ 2 Total rain level/;
                var idAktuell = ;
                var idMaxHeute = ;
                var idZaehlerGestern = ;
                var idHeute = ;
                var idGestern = ;
                ! on(idZaehler, function(dp) {
                var val = dp.state.val;
                var lastVal = dp.oldState.val;
                var now = dp.state.lc;
                var lastTime = dp.oldState.lc;
                var aktuell = 3600000 * (val - lastVal) / (now - lastTime);
                setState(idAktuell, aktuell, true);
                if(aktuell > max) {
                max = aktuell;
                setState(idMaxHeute, max, true);
                }
                });
                ! schedule('0 0 * * *', function() { // Mitternacht
                var zaehler = getState(idZaehler).val;
                var zaehlergestern = getState(idZaehlerGestern).val;
                setState(idZaehlerGestern, zaehler, true);
                var gestern = getState(idHeute).val
                setState(idGestern, gestern, true);
                var heute = zaehler - zaehlergestern;
                setState(idHeute, heute, true);
                max = 0;
                });

                1 Reply Last reply Reply Quote 0
                • N
                  noxx last edited by

                  danke, hoffe das war so gemeint.

                  ! ````
                  var max = 0;
                  var idZaehler = "rflink.0.channels.Cresta_2.RAIN"/Cresta_ 2 Total rain level/;
                  var idAktuell = "rflink.0.channels.Cresta_2.RegenAktuell"/RegenAktuell/;
                  var idMaxHeute = "rflink.0.channels.Cresta_2.RegenMaxHeute"/RegenMaxHeute/;
                  var idZaehlerGestern = "rflink.0.channels.Cresta_2.RegenZaehlerGestern"/RegenZaehlerGestern/;
                  var idHeute = "rflink.0.channels.Cresta_2.RegenHeute"/RegenHeute/;
                  var idGestern = "rflink.0.channels.Cresta_2.RegenGestern"/RegenGestern/;
                  ! on(idZaehler, function(dp) {
                  var val = dp.state.val;
                  var lastVal = dp.oldState.val;
                  var now = dp.state.lc;
                  var lastTime = dp.oldState.lc;
                  var aktuell = 3600000 * (val - lastVal) / (now - lastTime);
                  setState(idAktuell, aktuell, true);
                  if(aktuell > max) {
                  max = aktuell;
                  setState(idMaxHeute, max, true);
                  }
                  });
                  ! schedule('0 0 * * *', function() { // Mitternacht
                  var zaehler = getState(idZaehler).val;
                  var zaehlergestern = getState(idZaehlerGestern).val;
                  setState(idZaehlerGestern, zaehler, true);
                  var gestern = getState(idHeute).val
                  setState(idGestern, gestern, true);
                  var heute = zaehler - zaehlergestern;
                  setState(idHeute, heute, true);
                  max = 0;
                  });

                  
                  Gruß
                  [2880_1.png](/assets/uploads/files/2880_1.png)
                  1 Reply Last reply Reply Quote 0
                  • paul53
                    paul53 last edited by

                    @noxx:

                    hoffe das war so gemeint. `
                    Ja. RegenMaxHeute hat die falsche Masseinheit.

                    Und bei RegenZaehlerGestern trag mal per Hand einen sinnvollen Wert ein (z.B. 2150), sonst entstehen um Mitternacht unsinnige Werte.

                    1 Reply Last reply Reply Quote 0
                    • N
                      noxx last edited by

                      Nochmal ne Frage, muss noch einen Korrekturfaktor einbauen.

                      ! Grund ist, das die Auffanggrösse des Regenmessers mit einem
                      ! Trichter vergrössert habe. Dadurch wird natürlich mehr Regen aufgefangen,
                      ! der Regenmesser selber weiß natürlich nicht, das die Auffanggrösse sich
                      ! geändert hat. Die neue Fläche ist ca 5x grösser. Also, wenn der Regensensor
                      ! 10mm anzeigt, dann hat es in Wirklichkeit nur 2mm geregnet.
                      ! Sieht in etwa so aus:
                      ! http://www.nikolaus-lueneburg.de/wp-con … ichter.jpg
                      ! Hierdurch habe ich eine genauere Abtastung. Normal reagiert der Sensor nur alle ~0,7mm, nun bei ~0,15mm.

                      Kann ich direkt am Sensorwert korrigieren?

                      var max = 0;
                      //var korrektur = 0.227 ;
                      
                      var idZaehler = "rflink.0.channels.Cresta_2.RAIN" * 0.227 /*Cresta_ 2 Total rain level*/;
                      var idAktuell = "rflink.0.channels.Cresta_2.RegenAktuell"/*RegenAktuell*/;
                      var idMaxHeute = "rflink.0.channels.Cresta_2.RegenMaxHeute"/*RegenMaxHeute*/;
                      var idZaehlerGestern = "rflink.0.channels.Cresta_2.RegenZaehlerGestern"/*RegenZaehlerGestern*/;
                      var idHeute = "rflink.0.channels.Cresta_2.RegenHeute"/*RegenHeute*/;
                      var idGestern = "rflink.0.channels.Cresta_2.RegenGestern"/*RegenGestern*/;
                      
                      on(idZaehler, function(dp) {
                          var val = dp.state.val;
                          var lastVal = dp.oldState.val;
                          var now = dp.state.lc;
                          var lastTime = dp.oldState.lc;
                          var aktuell = 3600000 * (val - lastVal) / (now - lastTime);
                          setState(idAktuell, aktuell, true);
                          if(aktuell > max) {
                              max = aktuell;
                              setState(idMaxHeute, max, true);
                          } 
                      });
                      
                      schedule('0 0 * * *', function() {  // Mitternacht
                          var zaehler = getState(idZaehler).val;
                          var zaehlergestern = getState(idZaehlerGestern).val;
                          setState(idZaehlerGestern, zaehler, true);
                          var gestern = getState(idHeute).val
                          setState(idGestern, gestern, true);
                          var heute = zaehler - zaehlergestern;
                          setState(idHeute, heute, true);
                          max = 0;
                      })
                      
                      1 Reply Last reply Reply Quote 0
                      • paul53
                        paul53 last edited by

                        @noxx:

                        Kann ich direkt am Sensorwert korrigieren? `
                        Ja, am Wert - nicht an der ID.

                        ...
                            var aktuell = 3600000 * korrektur * (val - lastVal) / (now - lastTime);
                        ...
                            var zaehler = korrektur * getState(idZaehler).val;
                        ...
                        
                        1 Reply Last reply Reply Quote 0
                        • paul53
                          paul53 last edited by

                          Damit die Zählerstände (aktuell / gestern) vergleichbar sind, solltest du einen zusätzlichen Datenpunkt anlegen:

                          ! ````
                          var max = 0;
                          var korrektur = 0.227 ;
                          ! var idZaehler = "rflink.0.channels.Cresta_2.RAIN" * 0.227 /Cresta_ 2 Total rain level/;
                          var idZaehlerAktuell = "rflink.0.channels.Cresta_2.RegenZaehlerAktuell"/RegenZaehlerAktuell/;
                          var idAktuell = "rflink.0.channels.Cresta_2.RegenAktuell"/RegenAktuell/;
                          var idMaxHeute = "rflink.0.channels.Cresta_2.RegenMaxHeute"/RegenMaxHeute/;
                          var idZaehlerGestern = "rflink.0.channels.Cresta_2.RegenZaehlerGestern"/RegenZaehlerGestern/;
                          var idHeute = "rflink.0.channels.Cresta_2.RegenHeute"/RegenHeute/;
                          var idGestern = "rflink.0.channels.Cresta_2.RegenGestern"/RegenGestern/;
                          ! on(idZaehler, function(dp) {
                          var val = korrektur * dp.state.val;
                          setState(idZaehlerAktuell, val, true);
                          var lastVal = korrektur * dp.oldState.val;
                          var now = dp.state.lc;
                          var lastTime = dp.oldState.lc;
                          var aktuell = 3600000 * (val - lastVal) / (now - lastTime);
                          setState(idAktuell, aktuell, true);
                          if(aktuell > max) {
                          max = aktuell;
                          setState(idMaxHeute, max, true);
                          }
                          });
                          ! schedule('0 0 * * *', function() { // Mitternacht
                          var zaehler = getState(idZaehlerAktuell).val;
                          var zaehlergestern = getState(idZaehlerGestern).val;
                          setState(idZaehlerGestern, zaehler, true);
                          var gestern = getState(idHeute).val
                          setState(idGestern, gestern, true);
                          var heute = zaehler - zaehlergestern;
                          setState(idHeute, heute, true);
                          max = 0;
                          setState(idMaxHeute, 0, true);
                          })

                          1 Reply Last reply Reply Quote 0
                          • N
                            noxx last edited by

                            angelegt (ZaehlerAktuell). Danke für deine Mühe.

                            lasse es mal einen Tag laufen, und gucke dann, was mir meine

                            bisherige Wettersoftware (weewx) ausspuckt (Vergleichswerte).

                            Gruß

                            1 Reply Last reply Reply Quote 0
                            • N
                              noxx last edited by

                              Bei Regen Aktuell (Regenrate) muss ein kl. Fehler drin sein. Der zeigt die gleichen Werte an, wie RegenMaxHeute.

                              Es regnet aber gerade nicht, Regen Aktuell müsste dann doch 0 sein?!?

                              Noch ne Frage, wie ändere ich die Werte auf 2 Nachkommastellen?

                              ! ````
                              var max = 0;
                              var korrektur = 0.227 ;
                              ! //Regensensor
                              var idZaehler = "rflink.0.channels.Cresta_2.RAIN"/Cresta_ 2 Total rain level/;
                              ! //Benutzerdefiniert
                              var idZaehlerAktuell = "rflink.0.channels.Cresta_2.ZaehlerAktuell"/ZaehlerAktuell/
                              var idAktuell = "rflink.0.channels.Cresta_2.RegenAktuell"/RegenAktuell/;
                              var idMaxHeute = "rflink.0.channels.Cresta_2.RegenMaxHeute"/RegenMaxHeute/;
                              var idZaehlerGestern = "rflink.0.channels.Cresta_2.RegenZaehlerGestern"/RegenZaehlerGestern/;
                              var idHeute = "rflink.0.channels.Cresta_2.RegenHeute"/RegenHeute/;
                              var idGestern = "rflink.0.channels.Cresta_2.RegenGestern"/RegenGestern/;
                              ! on(idZaehler, function(dp) {
                              var val = korrektur * dp.state.val;
                              setState(idZaehlerAktuell, val, true);
                              var lastVal = korrektur * dp.oldState.val;
                              var now = dp.state.lc;
                              var lastTime = dp.oldState.lc;
                              var aktuell = 3600000 * (val - lastVal) / (now - lastTime);
                              setState(idAktuell, aktuell, true);
                              if(aktuell > max) {
                              max = aktuell;
                              setState(idMaxHeute, max, true);
                              }
                              });
                              ! schedule('0 0 * * *', function() { // Mitternacht
                              var zaehler = getState(idZaehlerAktuell).val;
                              var zaehlergestern = getState(idZaehlerGestern).val;
                              setState(idZaehlerGestern, zaehler, true);
                              var gestern = getState(idHeute).val
                              setState(idGestern, gestern, true);
                              var heute = zaehler - zaehlergestern;
                              setState(idHeute, heute, true);
                              max = 0;
                              setState(idMaxHeute, 0, true);
                              })

                              Gruß
                              [2880_1.png](/assets/uploads/files/2880_1.png)
                              1 Reply Last reply Reply Quote 0
                              • paul53
                                paul53 last edited by

                                @noxx:

                                Es regnet aber gerade nicht, Regen Aktuell müsste dann doch 0 sein?!? `
                                Regen aktuell ändert sich nur, wenn sich der Zähler ändert. Wenn es nicht regnet, ändert er sich natürlich nicht. Hast Du einen Regensensor, über den Du Regen aktuell zurück setzen kannst ? Wenn nicht, müsste man den Wert nach einer bestimmten Zeitspanne ohne Zähler-Änderung zurück setzen. Nur wie groß die Zeitspanne sein muss, weiß ich nicht.
                                @noxx:

                                Noch ne Frage, wie ändere ich die Werte auf 2 Nachkommastellen? `
                                Beispiel:

                                    setState(idAktuell, 0.01 * Math.round(100 * aktuell), true);
                                
                                

                                Anmerkung: Ganz am Ende (schedule) fehlt ein Semikolon. Damit ZaehlerAktuell bei Skriptstart gesetzt wird (und nicht erst wenn es regnet), solltest Du am Skriptende (hinter allen Funktionen) noch ergänzen

                                
                                setState(idZaehlerAktuell, korrektur * getState(idZaehler).val, true);
                                
                                1 Reply Last reply Reply Quote 0
                                • paul53
                                  paul53 last edited by

                                  Thema: Regen Aktuell zurücksetzen ohne Regensensor:

                                  Hat der Zähler eine Auflösung von 1 mm und sollen noch 0,1 mm/h erkannt werden (hier beginnt laut Wikipedia leichter Regen), dann muss die Dauer bis zum Rücksetzen 2,27 h betragen, was eine ganz schön lange Zeit ist.

                                  1 Reply Last reply Reply Quote 0
                                  • N
                                    noxx last edited by

                                    der Regensensor überträgt alle 33 Sekunden einen Wert. Evtl müsste

                                    man den Wert alle 33 Sekunden (oder ein vielfaches davon) auslesen und dann auf 1h extrapolieren.

                                    denke das macht ne Wettersoftware auch nicht anders

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

                                      @noxx:

                                      der Regensensor überträgt alle 33 Sekunden einen Wert. Evtl müsste

                                      man den Wert alle 33 Sekunden (oder ein vielfaches davon) auslesen und dann auf 1h extrapolieren. `
                                      Dann schwankt bei leichtem Regen der Wert für RegenAktuell ständig zwischen 0 und 11 mm/h. Das möchtest Du sicherlich nicht haben. Die Auflösung zu nutzen, ist sinnvoller.

                                      Hat der Regenmesser nicht eine Auflösung von 0,1 mm ? Dann kann die Zeit bis zum Zurücksetzen ca. 14 Minuten betragen. Vorher kann man ohnehin nicht sicher sein, ob der Regen aufgehört hat.

                                      var timer = null;
                                      
                                      on(idZaehler, function(dp) {
                                          var val = korrektur * dp.state.val;
                                          setState(idZaehlerAktuell, 0.01 * Math.round(100 * val), true);
                                          var lastVal = korrektur * dp.oldState.val;
                                          var now = dp.state.lc;
                                          var lastTime = dp.oldState.lc;
                                          var aktuell = 3600000 * (val - lastVal) / (now - lastTime);
                                          aktuell = 0.01 * Math.round(100 * aktuell);
                                          setState(idAktuell, aktuell, true);
                                          if(aktuell > max) {
                                              max = aktuell;
                                              setState(idMaxHeute, max, true);
                                          }
                                          if(timer) clearTimeout(timer);
                                          timer = setTimeout(function() {
                                              setState(idAktuell, 0, true);
                                          }, korrektur * 3600000);  // 0,227 Stunden
                                      });
                                      
                                      

                                      EDIT: Wert für ZaehlerAktuell auf 2 Nachkommastellen gerundet

                                      1 Reply Last reply Reply Quote 0
                                      • N
                                        noxx last edited by

                                        Teste ich. Der Sensor hat eine Auflösung von 0.15mm

                                        Gruss

                                        Gesendet von meinem GT-I9195 mit Tapatalk

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

                                          @noxx:

                                          Der Sensor hat eine Auflösung von 0.15mm `
                                          Bei einer Verzögerung von ca. 14 Minuten bis zum Zurücksetzen werden dann 0,15 mm/h und mehr als Regen erkannt; oder die Zeit wird auf das 1,5 fache hochgesetzt.

                                          1 Reply Last reply Reply Quote 0
                                          • N
                                            noxx last edited by

                                            danke. das script muss ich nun erstmal begreifen 😉

                                            gruß

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            499
                                            Online

                                            31.7k
                                            Users

                                            79.8k
                                            Topics

                                            1.3m
                                            Posts

                                            3
                                            20
                                            3708
                                            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