Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. ioBroker Allgemein
    4. Frage zu ESPHome - Pulse Counter Sensor

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    Frage zu ESPHome - Pulse Counter Sensor

    This topic has been deleted. Only users with topic management privileges can see it.
    • K
      klassisch Most Active @paul53 last edited by klassisch

      @paul53 sagte in Frage zu ESPHome - Pulse Counter Sensor:

      Schau mal den Adapter Sourceanalytix an.

      Hat der sowas integriert, incl. fortlaufender Summierung auf dem ESP? Dann wäre das natürlich der Königsweg. Die fortlaufende Summierung über die Zeitscheiben hinweg (Total) auf dem ESP halte ich für wichtig, weil man den ioBroker doch ab und an mal updatet. Die Totalisierung auf dem ESP vermeidet dann Lücken und Zählerabweichungen.

      @claus1993

      Hast du mal ein Beispiel?

      Einige Snippets aus einem funktionierenden Skript. Das Skript macht aber auch Statistik, was man heutzutege ja mit dem o.g. Adapter macht und verwendet dazu auch noch eine sehr praktische aber nicht mehr erwünschte Datenstruktur. Deshalb nur Snippets mit den Kernfunktionen. Und sicher auch kein beispielhafter Programmierstil. Zumindest nicht im positiven Sinne 🙂

      
      
      /* S0-counter converter for heating electical energy
         increments ticks
         calculates energy
         calculates power                      
         
         The Energy Counter of Eltaco (similar to WSZ15DE-32A) can count up to 
      	999999,9 dan has 2000 ticks per kWh. That means we need for "Interger" Variables max
      	1999999800  IEEE-754 coding allows "intergers up to
      	9007199254740992 which oviously is more than we need here.
      	if in doubt: To assure Interger use Math.round(inputVariable);
          
          To minimize numerical errors, energy is always calculated on base of tickSum
          
          total ticks are calculated according
             ticksSum = ticksOffset + ESPTicksSum;  
      	
          ticksSum multiplied with counter constant delivers energy 
      
          Starting the script for the first time your counter in general ist not equal zero
          So the offset has to be aligned. Same, if the S0 pulse counter was offline
      
          To do so, pleas follow these directions:
      
         New Init
          1 Script must be running
          2 readout the meter in kWh
          3 inpot the reading in the energy object defined in const energyId, e.g. '0_userdata.0.heating.Heizraum.Electricity.Energy'
      	Skript will detect that the input was done manually (origin from system.adapter.admin.0 
      
      
          In the Script ESP is a synomyme for the S0 pulse counter
      
         */
      	
      	const timeBaseESP = 60; //seconds to be aligned with ESP settings for Watchdog 
      	const ticksPerKWhOfCounter = 2000; // 2000 ticks per kWh for Eltaco S0 counter
      	const kWhPerTick = 1/ticksPerKWhOfCounter;  // 
      	const ESPTimeoutFactor = 2.5 // * timebaseESP
      
          const ticksId = 'mqtt.0.Heizraum-Energy.Heizraum-Energy-S0.ticks'/*Heizraum-Energy/Heizraum-Energy-S0/ticks*/;
      	const ticksSumId = '0_userdata.0.heating.Heizraum.Electricity.ticksSum'/*ticksSum*/; 
          const ticksOffsetId = '0_userdata.0.heating.Heizraum.Electricity.ticksOffset'/*ticksOffset*/; 
      	const energyId = '0_userdata.0.heating.Heizraum.Electricity.Energy'/*Energy*/;
      	const powerId = '0_userdata.0.heating.Heizraum.Electricity.Power'/*Power*/;
          const ESPTicksSumId = 'mqtt.0.Heizraum-Energy.Heizraum-Energy-S0.Total';
      
      
      
          
          const manualInputSource= 'system.adapter.admin.0';
      
      const debugLogOn = true;
      const emailActive = true;
      const telegramActive = true;
      
      
      const nameOfThisScript = name.split('.')[name.split('.').length - 1];
      
      
      
      
      // start subscriptions  	
      on({id: ESPTicksSumId, change: "any" }, 
       function (dp) { //ESP delivered new data
      // get values
      	 ESPTicksSum = dp.state.val; // needed for energy
      	 ESPTicksSumTimestamp =dp.state.ts; //needed for timebase for power
           ESPPreviousTicksSum = dp.oldState.val; // needed for power and when ESP restarted
           ESPPreviousTicksSumTimestamp = dp.oldState.ts // needed for power
           timeBase = (ESPTicksSumTimestamp - ESPPreviousTicksSumTimestamp) / 1000
      
        // now the watchdog to monitor the ESP
         if(watchdogESPtimer) clearTimeout(watchdogESPtimer);       // running Timer stopped
            watchdogESPtimer = setTimeout(function() {      // restart Timer
            let emailText = 'Timeout ESPEasy for S0  (61). Watchdog constant settings [sec]: timeBaseESP: ' + timeBaseESP + ' ESPTimeoutFactor: ' +  ESPTimeoutFactor + ' measured timeBase: ' + timeBase + ': ESPTimeout ' + ESPTimeout/1000 + ' seconds';
      //       sendMessage( globalEmailFrom,  globalEmailTo,  '!!HotWater ESP Timeout',  emailText);  
         }, ESPTimeout);  // as predefined;  in ms
        // end watchdog to monitor the ESP
          if (ESPTicksSum >= ESPPreviousTicksSum){ // normal run, ESP did not boot
             // first calculating Energy, that is easy
      	   ticksSum = ticksOffset + ESPTicksSum;  
      	   energy = ticksSum * kWhPerTick; 
      	   // console.log ('Energy: ' + energy);
         	   setState(energyId, Math.round(1000*energy)/1000);
             // start calculating power
             var ticksDelta = ESPTicksSumTimestamp - ESPPreviousTicksSumTimestamp 
             if (ticksDelta > 0) { // calulate power
               var energyDelta = (ESPTicksSum - ESPPreviousTicksSum) * kWhPerTick ;
               power =  3600000 * (energyDelta)/ticksDelta // 3600 seconds in 1h and ticksDelta is in ms
               setState(powerId,power);
                 // console.log('power: ' + power +' kW');
              } else { // timebase 0 or negative. Maybe the first run and the data not initialized
                console.log('time difference 0 or negative. No power calculated this time. Difference: ' + ticksDelta)
              } // end else neg time difference e.g. first run
          } else { // ESP has rebooted. rearrange ticksOffset but do not calculate powerthis time
            // here to rearrange ticksOffset
            ticksOffset = ticksOffset + ESPPreviousTicksSum; // new offset calculated
            setState(ticksOffsetId , ticksOffset); // new offset stored
         	  // calcukate energy
             ticksSum = ticksOffset + ESPTicksSum;  
      	   energy = ticksSum * kWhPerTick; 
      	   setState(energyId, Math.round(1000*energy)/1000);
             console.log ('ESP has rebootetd. This time no power calculation this cycle. Energy: ' + energy);
      	   console.error ('S0 Pulse Counter has rebooted; some counts may be missing. Please check and realign ticksOffset ');
             // do not calculate power this time. wait for the next cycle
          }  // end else ESP has rebooted
       });
      			
      on({id: energyId, change: "any"}, function(dp) {
         if (dp.state.from == manualInputSource){ // manual Input -> correct offset, so that values are fitting
           // use formula: ticksOffest = energy * ticksPerKWhOfCounter - ESPSum
           // round afterwards to the closest integer to remain in integer with ticksSum
           energy = dp.state.val;
      	 ticksOffset = Math.round(energy * ticksPerKWhOfCounter - ESPTicksSum);
           setState(ticksOffsetId, ticksOffset);	 
           console.log ('Energy adjusted by manual input to: ' + energy + ' kWh');
         }
       });
      

      Als Zähler verwende ich in dieser Anwendung aus historischen Gründen noch ESPEasy via MQTT.
      e4e0d914-5cec-492f-94ce-929c85f1ded8-grafik.png

      Aber es müßte mittlerweile auch mit ESPHome gehen mit folgendem yaml. Das yaml hat noch einige Digitaleingänge, die man hier aber nicht braucht. Das yaml übersetzt bei mir, der ESP zählt und totalisiert. Zur Anbindung an ioBroker empfehle ich den ESPHome Adapter von @Dutchman .

      esphome:
        name: pulse-counter
        platform: ESP8266
        board: d1_mini
      
      
      #       ESP8266        ESP32
      #i2c:
      #  sda: D2    GPIO4    21    
      #  scl: D1    GPIO5    22   
      #
      #uart:
      #  rx_pin: D6 GPIO12   GPIO16
      #  tx_pin: D7 GPIO13   GPIO17
      
      
        
      
      status_led:
      #  pin: GPIO2
         pin:
           number: D4
           inverted: true
      
      <<: !include includes.yaml
      
      
      captive_portal:
      
      # Enable logging
      logger:
      
      # Enable Home Assistant API
      # done in the common includes.yaml file
      
      # Example configuration entry
      
      
      binary_sensor:
       
      
        - platform: gpio
          name: "Dig-Input-1"
          pin: 
            number: GPIO5
            mode: INPUT_PULLUP
            inverted: true
          device_class: motion
      
          
        - platform: gpio
          name: "Dig-Input-2"
          pin: 
            number: GPIO12
            mode: INPUT_PULLUP
            inverted: true
          device_class: motion
      
          
      
        - platform: gpio  
          name: "Dig-Input-3"
          pin: 
            number: GPIO13
            mode: INPUT_PULLUP
            inverted: true
          device_class: motion
      
      sensor:
        - platform: uptime
          name: Uptime Sensor
      
        - platform: pulse_counter
          name: "S0-heating-delta"
          pin: 
            number: GPIO4
            mode: INPUT_PULLUP
            inverted: false
          count_mode:
            rising_edge: disable
      #      rising_edge: increment
      # rising edge increment used for water meter star wheel
            falling_edge: increment 
      #    device_class: motion
          update_interval: 60s
          total:
              name: S0-heating-total
      
      
      
      
      #RSSI
        - platform: wifi_signal
          name: "WiFi Signal Sensor"
          update_interval: 10min
      
      
          
      ota:
        safe_mode: false
        port: 8266 
        #3232 for ESP32
        #8266 for ESP8266
      
      

      und für die credentials

      # Standards and Secrets for ESPHome
      wifi:
        ssid: "MySSID"
        password: "MyTopSecrectWifiPWD"
        domain: .
      # domain . may be not correct, but works with firtzbox
      # the domain is to support mDNS for flashing and logging
      #  domain: .fritz.box
      # .fritz.box worked for me, the default .local did not   
        
      
      
        # Enable fallback hotspot (captive portal) in case wifi connection fails
        ap:
         ssid: "ESPHomeBackup"
         password: "jbjzgj87ttr"
      
      # Example configuration entry
      web_server:
        port: 80
      
        # Example configuration entry
      time:
        - platform: sntp
          id: sntp_time
          servers: "191.168.178.1"
          timezone: DE
          # display time
          #it.strftime(0, 0, id(font), "%Y-%m-%d %H:%M", id(time).now());  
      
      
      # api for use with MQTT and/or ioBroker. For ioBroker use the adapter of @Dutchman
      api:
          password: 'ohhVerySecret'
      
      # Attention: When logged Incorrect Password: enter PWD do not stre but terminate instance and start again https://forum.iobroker.net/post/621511
      
      
          # Example configuration entry
      #mqtt:
      #  broker: 192.168.178.99
      
      
      1 Reply Last reply Reply Quote 0
      • C
        claus1993 @paul53 last edited by

        @paul53 said in Frage zu ESPHome - Pulse Counter Sensor:

        @claus1993 sagte: Hast du mal ein Beispiel

        Bei mir geht es eher um einen Regenmengenmesser welcher pro Impuls 0,2794 Liter misst. Wie kann ich hieraus eine Menge in l/h (Liter pro Stunde) sowie eine Menge in l/d (Liter pro Tag) berechnen.

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

          @claus1993 sagte: Wie kann ich hieraus eine Menge in l/h (Liter pro Stunde) sowie eine Menge in l/d (Liter pro Tag) berechnen.

          Was liefert ESPHome an ioBroker? Impulse? Zählwerte?
          Bei l/h: Die Regenmenge der letzten Stunde oder die aktuelle Regenstärke?

          Falls Impuls und Regenstärke:

          Bild_2021-08-16_172713.png

          K 1 Reply Last reply Reply Quote 1
          • K
            klassisch Most Active @paul53 last edited by klassisch

            @paul53 Das ESPHome-yaml, das ich oben angehängt habe liefert beides: Impulse total oder Impulse/60 Sekunden. Wobei man die Zeitbasis (hier 60 Sekunden) auch anders einstellen kann.

            Man kann aber auch die Zeitdifferenz zwischen 2 Wippenschlägen im ioBroker auswerten. Ist aber etwas komplizierter.

            Edit: das yaml stellt auch binäre Eingänge bereit, so daß man das Blockly von @paul53 nutzen kann, welches die Zeitdifferenz zwischen 2 Wippenschlägen auswertet.
            Nach Informationen von @Homoran wird der neue Tag bei den Regenmessern um 07:30 gestarte.
            Was mir auch nicht klar ist, wie die Regenintensität im Blockly wieder abklingt, wenn der Regen aufgehört hat. Ich habe das bei mir nach 20min ohne weiteren Impuls einfach wieder auf 0 gesetzt. Nicht schön aber einfach.

            Homoran 1 Reply Last reply Reply Quote 0
            • Homoran
              Homoran Global Moderator Administrators @klassisch last edited by

              @klassisch sagte in Frage zu ESPHome - Pulse Counter Sensor:

              Nach Informationen von @Homoran wird der neue Tag bei den Regenmessern um 07:30 gestarte.

              so hatte ich das irgendwo im Hinterkopf (und denke so wäre es auch in der HomeMatic Wetterstation implementiert:
              Regen-Morgen.png
              Dort wird um 07:30 die Tagesmenge zurückgesetzt

              Auf der Suche nach einer belastbaren Quelle bin ich gerade auf das LANUV NRW gestoßen:
              https://www.lanuv.nrw.de/umwelt/wasser/niederschlag

              Dort steht allerdings

              Der Niederschlagstag beginnt dabei um 7:00 Uhr und endet um 7:00 Uhr des Folgetages.

              😞

              K paul53 2 Replies Last reply Reply Quote 0
              • K
                klassisch Most Active @Homoran last edited by

                @homoran Dann ist 07:30 wohl die Indische Variante... 🙂

                Homoran 1 Reply Last reply Reply Quote 0
                • Homoran
                  Homoran Global Moderator Administrators @klassisch last edited by

                  @klassisch Ich habe aber auch keine andere Stelle gefunden in denen der Beginn und das Ende eines "Niederschlagtages" beschrieben wird.
                  Ich erinnere mich noch an die Wasserstandsmeldungen im Radio der 60er Jahre die immer begannen mit "der Neckar bei Plochingen" und dem Satz "von gestern früh bis heute früh fielen...."

                  Aber ich finde nichts mehr dazu

                  1 Reply Last reply Reply Quote 0
                  • K
                    klassisch Most Active last edited by

                    @Homoran bin ja auch kein Meterologe. Und auf die 30 min kommt es mir nicht wirklich an. Vielleicht findet sich irgendwann man ein gelernter Wetterfrosch....

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

                      @homoran sagte: Dort steht allerdings

                      Weiter:

                      Der Niederschlagstag beginnt dabei um 7:00 Uhr und endet um 7:00 Uhr des Folgetages. Die Zeitabgaben erfolgen in Mitteleuropäische Zeit (MEZ) ohne Umstellung auf Sommerzeit.

                      Dann ist 7:30 Uhr anscheinend der Kompromiss zwischen MEZ und MESZ, wobei das Problem bleibt, dass 2 Tage im Jahr keine 24 h haben. Das hat sich hoffentlich bald erledigt.

                      1 Reply Last reply Reply Quote 0
                      • K
                        klassisch Most Active last edited by klassisch

                        DWD schreibt zum Thema Tageswerte in https://www.dwd.de/DE/leistungen/klimadatendeutschland/beschreibung_tagesmonatswerte.html :

                        "nur der Niederschlag des Vortages wird morgens um 05:50 UTC gemessen"

                        Dort wird auch die Berechnung der Tagesmittelwerte definiert:

                        • Ab dem 01.04.2001 wurde der Standard wie folgt geändert:

                          • Berechnung der Tagesmittel aus 24 Stundenwerten
                          • Wenn mehr als 3 Stundenwerte fehlen -> Berechnung aus den 4 Hauptterminen (00, 06, 12, 18 UTC
                          • Bezugszeit für einen Tag i.d.R. 23:51 UTC des Vortages bis 23:50 UTC

                        Man beachte UTC und die Anmerkung dazu:

                        "Hierbei werden die Beobachtungstermine auf die global genutzte Zeit in Greenwich (GMT oder UTC) bezogen. Die Beobachtungszeit ist jeweils 10 Minuten vor dem Bezugstermin (daher die krummen Zeitangaben). Diese Umstellung war erforderlich, nachdem das Stationsnetz weitgehend automatisiert wurde."

                        Ist das jetzt "amtlich"?

                        Und es stellt sich die Frage, ob die ioBroker schedule Funktion auch einfach UTC kann?

                        ChatGPT schlägt vor eine eigene Funktion scheduleUTC zu schreiben, die auf UTC umrechnet und dann mit setTimeout weiter arbeitet. Könnte funktionieren. Was passiert aber, wenn der ioBroker in der Zwischenzeit neu gestartet wird? Eher nicht. ChatGPT schlägt deshalb auf Nachfrage vor, node-schedule zu verwenden. Edit: "node-schedule" funktioniert. Ob einen Restart überlebt, habe ich noch nicht getestet.

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

                        Support us

                        ioBroker
                        Community Adapters
                        Donate
                        FAQ Cloud / IOT
                        HowTo: Node.js-Update
                        HowTo: Backup/Restore
                        Downloads
                        BLOG

                        774
                        Online

                        31.7k
                        Users

                        79.9k
                        Topics

                        1.3m
                        Posts

                        5
                        14
                        3367
                        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