Änderungsrate vom (Regensensor) Ecowitt

Moin Leute,

Ich stehe gerade etwas auf dem Schlauch und vielleicht kann mir jemand von euch dabei helfen?!

Folgendes Problem:
Ich betreibe eine Ecowitt Wetterstation mit externem Bodenfeuchte-Sensor und noch einem “Blattfeuchtesensor”. Diesen will ich zweckentfremden als Regensensor. In einer Amazon-Bewertung habe ich folgendes von einem User gefunden:

I have Home Assistant look at the rate of change of the moisture reading, and when it is above 0.2%/second, that means it is sensing rain. Morning dew doesn’t form that fast, so it doesn’t trigger my system.

Er schaut halt darauf, ob sich der Wert des Sensors schneller als 0,2% die Sekunde anhebt. Wenn der Sensor das tut, dann bedeutet das Regen, denn bei Morgentau würde sich der Wert wohl langsamer verändern. Dies kann ich auch an den Rohdaten des Sensors sehen.

Jetzt ist die Frage wir ich einen Sensor oder Helfer konfiguriere, der wenn sich der Wert schneller als 0,2% die Sekunde ändert, mir sagt, dass es regnet…

Hat ggf. jemand eine Lösund oder einen Lösungsansatz für mich?

Vielen Dank schon mal

Hi,

ich weiß nicht

  • ob die Wetterstation nicht eine andere Möglichkeit bietet
  • oder ob es nicht irgendwie eleganter geht
    aber folgende Idee wäre einen Test wert:

Du legst einen Helper input_number.bodenfeuchte an und eine Automatisation, die bei jeder Änderung der Bodenfeuchte, den aktuellen Wert dort wegspeichert. Vorher wird aber noch alt und neu verglichen inklusive Zeitdifferenz. Eine Automatisation könnte so aussehen:

alias: 1 forum bodenfeuchte
description: ""
trigger:
  - platform: state
    entity_id:
      - sensor.bodenfeuchte
    id: AenderungBodenfeuchte
condition: []
action:
  - variables:
      comment: >-
        Vergleiche die aktuelle Bodenfeuchte mit der vorigen inklusive
        Zeitsempel
      comment1: Als Aktion hier eine Email mit Debugdaten, Aktion kann allesmögliche sein
  - if:
      - condition: template
        value_template: >
          {% set previous_state =
          states('input_number.bodenfeuchte') |
          float(0) %}

          {% set current_state =
          states('sensor.bodenfeuchte') | float(0)
          %}

          {% set last_change_prev =
          as_timestamp(states.input_number.bodenfeuchte.last_changed)
          %}

          {% set last_change_curr =
          as_timestamp(states.sensor.bodenfeuchte.last_changed)
          %}

          {% set time_difference = last_change_curr - last_change_prev %}

          {% set rain_rate_per_sec = (current_state - previous_state) /
          time_difference if time_difference > 0 else 0 %}

          {{ rain_rate_per_sec > 0.002 }}
    then:
      - action: notify.my_email
        metadata: {}
        data:
          message: >
            {% set previous_state =
            states('input_number.bodenfeuchte') |
            float(0) %}

            {% set current_state =
            states('sensor.bodenfeuchte') |
            float(0) %}

            {% set last_change_prev =
            as_timestamp(states.input_number.bodenfeuchte.last_changed)
            %}

            {% set last_change_curr =
            as_timestamp(states.sensor.bodenfeuchte.last_changed)
            %}

            {% set time_difference = last_change_curr - last_change_prev %}

            {% set rain_rate_per_sec = (current_state - previous_state) /
            time_difference if time_difference > 0 else 0 %}

            previous_state {{previous_state}}

            current_state {{current_state}}

            last_change_prev {{last_change_prev}}

            last_change_curr {{last_change_curr}}

            time_difference {{time_difference}}

            rain_rate_per_sec {{rain_rate_per_sec}}

            Über 0,2 % {{ rain_rate_per_sec > 0.002 }}
          title: Es hat zu regnen angefangen. (Debug in Body)
  - variables:
      comment: Speichere den aktuellen Wert der Bodenfeuchte in den Helper
  - action: input_number.set_value
    metadata: {}
    data:
      value: >-
        {{ states('sensor.bodenfeuchte') | float(0)
        }}
    target:
      entity_id: input_number.bodenfeuchte
mode: queued
max: 10

Was mir von der Logik noch fehlt ist der Fall “Es hört auf zu regnen”.

  • Ändert sich dann der Wert des Sensors Bodenfeuchte wieder auf einen niedrigen Wert? Wenn ja, ist alles schick.
  • Wenn nein, müssen wir mal schauen, wann der vorige Wert im input_number.bodenfeuchte wieder zurückgesetzt werden sollte.

Was mir auch noch nicht gefällt:

  • Entsprechend obiger Automatisation würde ich immer wieder eine neue Mail bekommen, sobald die Regenstärke entsprechend zunimmt. Aber eigentlich will ich nur einmal benachrichtigt werden oder ?

Gutes Gelingen!

Nachtrag:
Beim Lesen dieses Posts über Regendaten stoße ich auf statische Sensoren. Und bei https://www.home-assistant.io/integrations/statistics sehe ich “change_second” (The average change per second. The difference between the newest and the oldest measurement is divided by seconds between them.)

Ich habs jetzt nicht probiert aber das zu testen, würde sich auch lohnen. Der Vorteil gegenüber oben wäre, daß kein Helper extra über eine Automatisation befüllt werden muß, sondern der statische Sensor alles erledigt.

:crayon:by HarryP: Zusammenführung Doppelpost (bitte “bearbeiten” Funktion nutzen)

Moin, und danke schon mal für die Mühe.

Es dreht sich um folgenden Sensor: Ecowitt WN35 Blattfeuchtesensor
image

Der zeigt Werte von 0% - 100% an.
Beim Morgentau sieht die Steigung ungefähr so aus.

Wenn es hingegen regnet, sieht das ganze so aus.

Wenn es es aufhört zu regnen oder der Morgentau verschwindet, dann fällt der Wert auch wieder auf 0% zurück.

Und Ja, du hast recht… Ich möchte natürlich nicht ständig benachrichtigt werden, wobei ich ja nur einen Wert in Node-Red abgreifen möchte. Also sinngemäß, wenn der gefütterte input number Sensor über diese 0,2% /Sek anzeigt, mein Node-Red Flow für die Bewässerung unterbrochen wird.

UPDATE:

wenn ich deine Automation anlege bekomme ich folgenden Fehler:
Message malformed: Unable to determine action @ data[‘action’][1][‘then’][0]

alias: Regensensor Input
description: ""
trigger:
  - platform: state
    entity_id:
      - sensor.regensensor
    id: AenderungRegensensor
condition: []
action:
  - variables:
      comment: >-
        Vergleiche die aktuelle Bodenfeuchte mit der vorigen inklusive
        Zeitsempel
      comment1: Als Aktion hier eine Email mit Debugdaten, Aktion kann allesmögliche sein
  - if:
      - condition: template
        value_template: >
          {% set previous_state =
          states('input_number.regensensor_input') |
          float(0) %}

          {% set current_state =
          states('sensor.regensensor') | float(0)
          %}

          {% set last_change_prev =
          as_timestamp(states.input_number.regensensor_input.last_changed)
          %}

          {% set last_change_curr =
          as_timestamp(states.sensor.regensensor.last_changed)
          %}

          {% set time_difference = last_change_curr - last_change_prev %}

          {% set rain_rate_per_sec = (current_state - previous_state) /
          time_difference if time_difference > 0 else 0 %}

          {{ rain_rate_per_sec > 0.002 }}
    then:
      - action: notify.mobile_app_sorgenfrei_iphone
        metadata: {}
        data:
          message: >
            {% set previous_state =
            states('input_number.regensensor_input') |
            float(0) %}

            {% set current_state =
            states('sensor.regensensor') |
            float(0) %}

            {% set last_change_prev =
            as_timestamp(states.input_number.regensensor_input.last_changed)
            %}

            {% set last_change_curr =
            as_timestamp(states.sensor.regensensor.last_changed)
            %}

            {% set time_difference = last_change_curr - last_change_prev %}

            {% set rain_rate_per_sec = (current_state - previous_state) /
            time_difference if time_difference > 0 else 0 %}

            previous_state {{previous_state}}

            current_state {{current_state}}

            last_change_prev {{last_change_prev}}

            last_change_curr {{last_change_curr}}

            time_difference {{time_difference}}

            rain_rate_per_sec {{rain_rate_per_sec}}

            Über 0,2 % {{ rain_rate_per_sec > 0.002 }}
          title: Es hat zu regnen angefangen. (Debug in Body)
  - variables:
      comment: Speichere den aktuellen Wert der Bodenfeuchte in den Helper
  - action: input_number.set_value
    metadata: {}
    data:
      value: >-
        {{ states('sensor.regensensor') | float(0)
        }}
    target:
      entity_id: input_number.regensensor_input
mode: queued
max: 10

INFO: Ich denke anstatt “action” musste “service” in der Automation stehen.


FRAGE:

kann ich nicht einfach einen input_number erstellen und dann dann ohne Benachrichtigung nur hiermit befüttern?:

service: input_number.set_value
metadata: {}
data:
  value: "{{ states('sensor.regensensor') | float(0) }}"
target:
  entity_id: input_number.regensensor_input

danach dann einen Template Helfer mit diesem Template anlegen:

{% set previous_state = states('input_number.regensensor_input') | float(0) %}
{% set current_state = states('sensor.regensensor') | float(0) %}
{% set last_change_prev = as_timestamp(states.input_number.regensensor_input.last_changed) %}
{% set last_change_curr = as_timestamp(states.sensor.regensensor.last_changed) %}
{% set time_difference = last_change_curr - last_change_prev %}
{% set rain_rate_per_sec = (current_state - previous_state) / time_difference if time_difference > 0 else 0 %}
{{ rain_rate_per_sec > 0.002 }}

denn dann zeigt mir dieser Template Helfer doch “false” oder “true” an, richtig?

image

Jetzt wäre die Überlegung, ob man überhaupt den Input Helfer benötigt, oder ob man dein Template auch irgendwie direkt auf den Ausgangssensor legen kann? Allerdings fehlt mir da die Expertise.


Ich habe gerade mal versucht zu simulieren indem ich den Zustand des Ausgangssensors manuell jede Sekunde um 1% erhöht habe. Leider Hat das Template trotzdem die ganze Zeit “false” angezeigt.

Kann es sein, dass der Wert zu schnell in den Input Helfer eingetragen wird? Ich konnte beobachten, dass wenn sich der Wert im Ausgangssensor verändert, der Wert im Inputsensor nahezu Zeitgleich geändert wird.

Grüße und danke

Update2:
Über die Statistik Sensoren bin ich auch schon gestolpert, allerdings muss ich gestehen, dass ich die Konfiguration über die GUI (StatisticHelper) nicht wirklich verstehe. Ich hab jetzt ein paar unterschiedliche Typen angelegt, aber so wirklich das Richtige scheint das nicht zu sein… Oder mir fehlt das KnowHow…!!!


Ich habe auch hier mal probiert einen “Absolute Distanz” Helfer zu erstellen. Wenn ich manuell die Werte relativ schnell nach oben setze dann verändert ich auch dieser Helfer. leider fällt der Wert dann ja schnell wieder auf null wenn zb der ausgangssensor seine 50% erreicht hat und es dann halt nicht mehr weiter steigt. In diesem Fall würde es ja bedeuten, dass es nicht mehr regnet. Das stimmt ja aber nicht. Man müsste also beide Seiten betrachten. Einmal die Seite, dass der Wert sehr schnell ansteigt (=Regen) und einmal, dass er auch in einer bestimmten Zeit fällt (=es hört auf zu regnen)

Also müsste man es irgendwie hinbekommen, dass bei einer hohen Regenrate (oder schnellem Anstieg des Wertes) ein binary Sensor (Schalter) getriggert wird (regen=true) und dann wenn der Wert in einer gewissen Zeit fällt (oder Regenrate Berechnung niedrig ist) er diesen binary Sensor wieder zurücktriggert auf (regen=false)

Das ist bestimmt möglich wenn man genügend Programmierkenntnisse hat :smiley:

PUHHHHH… ich glaube dass ich hier an meine Grenzen stoße :smiley:

:crayon:by HarryP: Zusammenführung Mehrfachpost (bitte “bearbeiten” Funktion nutzen)

Man könnte aber auch einfach einenTrend Sensor verwenden.

Oder einen Statistic Sensor.

Gruß
Osorkon

Ich denke, dass ich nachdem ich ein wenig gebastelt habe eine Lösung für mich gefunden habe.

Ich habe in der Tat einen Ableitungs-Helfer genommen den ich über den Eingangssensor füttere. Durch ausprobieren (den Wert des Ausgangssensor von 0 auf 1 innerhalb 45 Sekunden setze) habe ich festgestellt, dass der Trend Sensor dann auf 0,0220%/s springt. Das wäre der maximale Anstieg bei Morgentau. Bei Regen dann drüber. z.B.: 0,0250%/s

wenn der Wert dann wieder um 1 oder mehr % fällt, springt der Ableitungs-Sensor automatisch in den Minus bereich.

image

Daraus habe ich einen kleinen Flow gebaut:

Wert über 0,0220 setzt einen Merker und sendet “es fängt an zu regnen!”
Wert unter oder gleich 0,000 setzt einen Merker und sendet “es hört auf zu regnen!”

Also aktuell (mit manuellem ändern der Werte) funktioniert das gut. ich bin gespannt was morgen früh passiert wenn der Morgentau losgeht. Regen kann ich ja mal mit dem Gartenschlauch simulieren :smiley:

Ich denke, der Weg über statistische Sensoren oder auch den Trend ist zielführend. Das ist auch für mich Neuland und ich muß probieren.

Dennoch hier einige Kommentare zum vorher Gesagtem.

Hm, ich hab noch einmal geschaut, bei mir gehts, auch wenn ich das wie Du bei Dir aufs Handy schicke. ChatGPT meint es ist, eine Fehler im If/then - da gibt es kein action-Block. Man solle “service” einsetzen. Das bringt mich auf die Idee, daß Dein HA vielleicht nicht auf neusten Stand ist weil dieser “service/action” Wechsel erst vor kurzem eingeführt wurde.

Finde ich gut, ich liebäugele auch etwas.

Hätte ich mir eigentlich denken können, warum soll ein Wert hoch bleiben wenn es nicht mehr regnet. Nachtlichtes Programmieren hat manchmal auch seine Nachteile.

Die Benachrichtigung ist nicht zwingend nötig. Du kannst jede andere Action einsetzen oder auch nur input_number.regensensor_input beschreiben. Aber dieser “service: input_number.set_value” muß ja von irgendwas angestoßen werden. In der Aut. wäre jegliche Wertänderung von sensor.regensensor der Trigger.

Hm, vielleicht ist meine Grundidee verkehrt. Nimm die Differenz von Jetzt und Vorher und teile sie durch die Zeit in Sekunden zwischen beiden Werten und so hast Du die Veränderungsrate pro Sekunde.

Hatte ich heute Nacht auch kurz überlegt und mit einer 1 s Verzögerung probiert aber dann wieder verworfen weil die Zeitdifferenz manipuliert wird aber die ja wichtig ist. Ich entschied mich dann lieber den Aut. Modus auf Warteschlange zu setzen. Jede Erhöhung wird nacheinander abgearbeitet.

Habe ich auch gerade probiert und mir gefällt, daß man als Werte 2 eingegeben kann und auch die Zeitdifferenz (zum Testen nahm ich 10 s). Ich würde auch anderen Statistiksensoren probieren und natürlich etwas statische Theorie vorher einlesen.

Wenn ich mir die Kurven Tau/Regen anschaue, könnte man Regen auch über die größeren Sprünge erkennen (Ableitungsensor?).

Ich an Deiner Stelle würde mich einlesen und probieren.

Über das Ergebnis würde ich mich freuen :yum:

Aktuell für mich Quick & Dirty die Lösung, siehe oben :wink:

Soooo,

kleine Rückmeldung meinerseits, da es heute morgen mal geregnet hat.
Das ganze hat schon mal richtig gut funktioniert.

Der Blattfeuchtemesser hat seinen Wert schnell geänderet und dadurch erkannte mein Ableitungssensor dass der Wert die Schwelle von +0,022 %/s überschritten hatte. Zusätzlich frage ich trotzdem noch ab ob der tatsächliche Wert des Blattfeuchtesensor (Regensensor) über 0 % liegt). Dadurch möchte ich sicherstellen, dass wenn der Ableitungssensor vielleicht mal einen solchen + Wert anzeigt, es auch wirklich feucht ist.

Der Merker in Node-Red wurde gesetzt und ich bekam eine Benachrichtigung dass es anfängt zu Regnen. Parallel dazu habe ich dadurch noch einen Input-Helfer (Schalter) einschalten lassen der besagt, dass es jetzt regnet. Ist für mich wichtig, weil ich den dann in meiner Bewässerung abfragen werde.

Jetzt wurde es spannend. Ich möchte ja auch wissen wann es aufhört zu regnen. Meine erste Überlegung, einfach den 0 oder Negativwert des Ableitungssensors zu nehmen, stellte sich als nicht optimal heraus da der Wert ja durchaus mal in den Bereich fallen kann auch wenn es noch regnet. Meine aktuelle Lösung dafür ist, dass ich den Sensor (Niederschlagsrate der letzten Stunde) aus der Ecowitt Wetterstation abgreife und frage ob der Wert bei 0,0mm liegt und ob der Ableitungssensor auch 0 oder weniger anzeigt. In diesem Fall wird dann wieder der Merker umgeschaltet und ich bekomme eine Benachrichtigung. Des Weiteren wird der Input Helfer ausgeschaltet.

Heute hat es ziemlich viel geregnet und in diesem Fall hat das gut funktioniert. Leider weiß ich noch nicht wie es sich verhält wenn es nur leicht regnet, da die Sensoren (Niederschlagsrate) aus der Wetterstation ja sehr träge sind.

Meine Überlegung wäre einen Abwertstrend zu erfassen.

Beispiel (Blattfeuchte Sensor fällt in einer Zeit um mindestens XXX % und der Ableitungssensor zeigt 0 oder kleiner an)

Leider fehlt mir dafür die Expertise.
Vielleicht fällt ja einem von euch etwas ein?!?!

Grüße