Deluxe Automatiserung für Rasenmäherroboter

Hi,

vielen vielen Dank für die Anleitung und die ganze Mühe, die du dir gemacht hast!

Ich freue mich sehr darüber.

Mir ist eingefallen, dass ich noch ein paar ungenutzte Aqara Temperatur/Feuchtigkeitssensoren habe. Davon werde ich einen nutzen, in den Garten packen und deine Anleitung Step by Step nachvollziehen. Ich melde mich wenn ich Fragen habe bzw. wie weit ich bin.

OT: ich bin Privatier und habe Zeit genug. Ich wollte heute nur etwas handwerken und hab sicher noch ein paar Stunden für Home Assistant.

Hi,

ich bin bis hierhin gekommen.

wenn ich das …

Und bei Wert muss folgendes rein:

{{ states('input_number.tagestemperatur_summe_jede_stunde') | float + state_attr('weather.forecast_home', 'temperature') | float }}

… mache, steht bei Wert e+ und nicht der Code.

Bist du dir sicher, dass du bei der Korrektur nicht irgendwas vertauscht hast?

Äh … ich hab da jetzt gerade mal ein bissl herumprobiert und so funktioniert es:

Aktion hinzufügen → Andere Aktionen → Aktion ausführen

In der Dropdown-Liste wählst Du

123 Festlegen

Dann auf + Entität auswählen. Dort wählst Du die tagestempertur_summe_jede_stunde aus.

Dann ins Feld Wert klicken und eine 0 (Null) eingeben. Jetzt auf das Hamburger-Menu (die drei Punkte oben rechts) und In YAML bearbeiten.

In dem YAML siehst Du dies:

data:
  value: 0

Das änderst Du zu:

data:
  value: >-
    {{ states('input_number.tagestemperatur_summe_jede_stunde') | float + state_attr('weather.forecast_home', 'temperature') | float }}

Jeden anderen Weg, den ich gerade probiert habe, hat zu einem Fehler geführt. Was mich allerdings ziemlich stutzig macht, weil so hab ich das gestern ganz bestimmt nicht gemacht! :hushed_face:

Vermutlich hab ich da irgendwie was Falsches eingegeben und es kam zufällig etwas Richtiges dabei heraus?! :laughing:

Ich guck mir das nachher nach Feierabend auf jeden Fall nochmal genauer an. :thinking:

Dank dir.

Meien Automatisierung sieht jetzt so aus:

alias: Temperatur jede Stunde addieren
description: ""
triggers:
  - trigger: time_pattern
    minutes: /1
conditions:
  - condition: template
    value_template: "{{ states.weather.forecast_home.attributes.temperature | float > 0}}"
actions:
  - action: counter.set_value
    target:
      entity_id: input_number.tagestemperatur_summe_jede_stunde
    data:
      value: >-
        {{ states('input_number.tagestemperatur_summe_jede_stunde') | float +
        state_attr('weather.forecast_home', 'temperature') | float }}
mode: single

Der Helfer (input_number.tagestemperatur_summe_jede_stunde) bleibt aber bisher noch dauerhaft bei 0° stehen.

Yap. Du hast nicht 123 Festlegen als Aktion benutzt, sondern [1|2] Festlegen.

Deswegen ist es bei Dir

  - action: counter.set_value

und bei mir … was anderes. :wink:

Aber der Rest sieht gut aus! :+1:

Sorry, 123 Festlegen war sehr versteckt. Ich habe es aber jetzt:

alias: Temperatur jede Stunde addieren
description: ""
triggers:
  - trigger: time_pattern
    minutes: /1
conditions:
  - condition: template
    value_template: "{{ states.weather.forecast_home.attributes.temperature | float > 0}}"
actions:
  - action: number.set_value
    target:
      entity_id: input_number.tagestemperatur_summe_jede_stunde
    data:
      value: >-
        {{ states('input_number.tagestemperatur_summe_jede_stunde') | float +
        state_attr('weather.forecast_home', 'temperature') | float }}
mode: single

DIe Automatisierung läuft auch jede Minute, die Entität

input_number.tagestemperatur_summe_jede_stunde


bleibt aber nach wie vor bei 0 °C.

Du verwendest die falsche Aktion !
Muss lauten

input_number.set_value

Und nicht

number.set_value

Aber warum machst Du das über eine Automation und legst Dir keinen Trigger Bades Template Sensor an?

Außerdem wird nicht stündlich, sonder laut Deinem Trigger minütlich die Addition durchgeführt.

/1 → jede Minute
1 → jede Stunde zu Minute 1

Siehe auch Doku

Gruß Osorkon

Danke jetzt funktioniert es mit:

input_number.set_value

Die Automatisierung hat diesen Code:

alias: Temperatur jede Stunde addieren
description: ""
triggers:
  - trigger: time_pattern
    minutes: /1
conditions:
  - condition: template
    value_template: "{{ states.weather.forecast_home.attributes.temperature | float > 0}}"
actions:
  - action: input_number.set_value
    target:
      entity_id: input_number.tagestemperatur_summe_jede_stunde
    data:
      value: >-
        {{ states('input_number.tagestemperatur_summe_jede_stunde') | float +
        state_attr('weather.forecast_home', 'temperature') | float }}
mode: single

Das ist ja auch Sinn der Übung. Wenn ich stündlich addieren würde, müsste ich immer eine Stunde warten, um zu sehen, ob was passiert. Das hätte hier schon Stunden gedauert. So habe ich nach 1, 2 Minutne gesehen, dass etwass nicht korrekt war.

Ich habe keine Ahnung was Bades ist. In der Doku steht auch nichts dazu.

Sorry! Es sollte Trigger BASED Template Sensor lauten.

Gruß Osorkon

Interessant, das kenne ich noch nicht.

Geht das über

Einstellungen - Geräte & Dienste - Helfer - +Helfer erstellen - Template - Sensor

?

Ich finde da nicht, wie man den Trigger einbaut. Auf YAML kann ich da auch nicht wechseln. Bin ich da komplett falsch?

Ich habe auch noch eine andere Frage.

Ganz zu Anfang sollte ich im Template Editor das eingeben:

{{ states.weather.forecast_home.attributes.temperature }}
{{state_attr('weather.forecast_home', 'temperature')}}

Das gibt die Temperatur zweimal aus. Ist Zeile 1 ein String, mit dem Home Assistant nicht rechnen kann?

Was passiert in Zeile 2?

Einen gewöhnlichen Template Sensor kannst in der GUI unter Helfer erstellen.

Einen Trigger Based Template Sensor leider nur über yaml.

Gruß Osorkon

In dieser yaml?

/homeassistant/configuration.yaml

Ich habe die Automatisierung jetzt fertig:

Du baust das jetzt nach und zeigst dann Deine Automation und wir vergleichen die dann. :winking_face_with_tongue:

alias: Temperatur jede Stunde addieren
description: ""
triggers:
  - trigger: time_pattern
    hours: "*"
    minutes: "0"
    seconds: "0"
conditions:
  - condition: template
    value_template: "{{ states.weather.forecast_home.attributes.temperature | float > 0}}"
actions:
  - action: input_number.set_value
    target:
      entity_id: input_number.tagestemperatur_summe_jede_stunde
    data:
      value: >-
        {{ states('input_number.tagestemperatur_summe_jede_stunde') | float +
        state_attr('weather.forecast_home', 'temperature') | float }}
mode: single

Damit müsste sich jede volle Stunde der Wert ändern.

Das scheint zu klappen

@ Oern:

Teil 3: Leg einen Helfer für den Durchschnittswert an. Das ist eine Zahl, deshalb wird es ein …?! Identisch mit Teil 5. :man_facepalming:

Teil 4: Eine weitere Automation namens durchschnitt_berechnen anlegen, die um 00:01 (hh:mm) den Wert von tagestemperatur_summe_jede_stunde durch 24 teilt und …

Teil 5: … in einem input_number-Helfer namens tagesdurchschnittstemperatur speichert.

Teil 6: Was muss dann mit dem tagestemperatur_summe_jede_stunde passieren, damit die nächste Berechnung stimmt? Das auch einbauen.

Teil 2 habe ich geschafft.

Kann man 2. direkt so anpassen, dass der direkt der Durchschnittswert brechnet wird? Evtl die Summe durch die Anzahl der abgelaufenen Stundne teilen, also jertzzt um 16.33 Uhr durch 16.

Könnt ihr mal aufhören hier zu antworten, während ich auf der Arbeit bin?! Das konnte ich alles wieder löschen! Sack Zement nochmal! :angry: :laughing:

@Osorkon

Sicherlich kann man einiges anders machen. In HA lassen sich häufig Dinge auf verschiedene Arten und Weisen bewerkstelligen. Einige sind besser, andere sind umständlicher, die nächsten sind eleganter, dafür häufig unverständlich (bekanntes Programmiererproblem), … usw. Aber wem sag ich das eigentlich? :man_shrugging:

Weil das von JHA Gesuchte keine “Mach mal hier, klick mal da”-Lösung ist, sondern einiges mehr an Aufwand bedeutet, hat hier bisher keiner einfach eine Lösung reingekippt. Das wäre auch gar nicht zielführend gewesen, weil JHA sie einfach kopiert hätte und beim nächsten Problem wieder dagestanden wäre wie der Ochs vorm Berg. Und weil es (für mich) ein interessantes und (absehbar!) lösbares Problem ist, machen wir das jetzt einfach zusammen. Das trifft sich ganz gut, weil ich das auch noch nicht alles kann. :face_with_peeking_eye: :laughing:

An dem ganzen Projekt gibt es bereits jetzt einige absehbare aber bisher ungelösten Probleme. Z.B. wird die erste Temperatur um 00:00 gespeichert und beim Berechnen des Durchschnitts um 00:01 gleich wieder gelöscht. Deswegen macht man das besser in einer Automation statt in zwei separaten. Wenn weather keine Temperatur meldet, dann stimmt der Durchschnitt nicht, weil da ein fester Teiler von /24 drin steht.

Lange Rede, kurzer Sinn:
Wir machen das, weil er es noch nicht kann und weil ich noch nicht alles kann! So lernen wir beide was dabei. Und alle anderen lernen ja vielleicht auch noch das Eine oder Andere?! :wink:

Falls also irgendwer irgendwelche Ideen hat: immer her damit. Aber nicht einfach die Lösung verraten. So macht das keinen Spaß.

Und hier ist meine:

alias: Temperatur jede Stunde addieren
description: ""
triggers:
  - trigger: time_pattern
    hours: /1
conditions:
  - condition: template
    value_template: "{{ states.weather.forecast_home.attributes.temperature | float > 0}}"
actions:
  - target:
      entity_id: input_number.tagestemperatur_summe_jede_stunde
    data:
      value: >-
        {{ states('input_number.tagestemperatur_summe_jede_stunde') | float +
        state_attr('weather.forecast_home', 'temperature') | float }}
    action: input_number.set_value
mode: single

Warum meine jetzt bei der Aktion leicht anders aussieht und warum sie funktioniert, trotzdem ich nicht die nachträglich korrigierte Vorgehensweise gegangen bin, weiß ich auch nicht. Ich erinnere mich statt einer Zahl gleich einen Sensor a lá {{ states.weather.forecast_home.attributes.temperature }} da eingetragen zu haben. Vermutlich hab ich dabei irgendwas (zufällig richtig) korrigiert?! :man_shrugging:

Hier mein Verlauf:

Das sind beides Strings! Mit der ersten Zeile greifst du - sozusagen - direkt in den Sensor rein und holst da den Wert ab. Wenn der Sensor diesen Wert gar nicht hat, weil er ihn generell nicht hat oder Du Dich vielleicht nur verschrieben hast, dann gibt es einen Fehler:

Mit der zweiten Zeile sagst Du Home Assistant “Hey, frag mal den Sensor nach dem Wert und gib ihn mir”. Das macht HA dann. Weil HA das managed bekommst Du aber immer etwas zurück. Entweder den Wert, none (wenn der Sensor den Wert gar nicht hat) oder unknown / unavailiable (wenn es den Wert zwar generell gibt, er aber gerade unbekannt oder nicht verfügbar ist):

Dadurch bleibt eine Automation dann nicht mit einem Fehler stehen, wie z.B. diese hier:

Hier wurde die Aktion nicht ausgeführt, weil die Automation bereits vorher mit einem Fehler ausgestiegen ist.

Jaaa, prinzipiell geht das. Man muss aber berücksichtigen, dass states.weather.forecast_home.attributes.temperature auch mal keinen Wert liefert. Wie gestern gesehen, als es plötzlich nicht verfügbar war. Ich würde das jetzt so machen, dass ich einen Zähler-Helfer anlege. In der Automation Temperatur jede Stunde addieren wird ja bereits abgefragt, ob der Wert größer Null ist. Zusätzlich muss noch geprüft werden, ob es überhaupt ein valider Wert ist und wenn, dann wird der Zähler erhöht:

alias: Temperatur jede Stunde addieren
description: ""
triggers:
  - trigger: time_pattern
    hours: /1
conditions:
  - condition: template
    value_template: "{{state_attr('weather.forecast_home', 'temperature') != 'unknown'}}"
  - condition: template
    value_template: "{{state_attr('weather.forecast_home', 'temperature') != 'unavailable'}}"
  - condition: template
    value_template: "{{ states.weather.forecast_home.attributes.temperature | float > 0}}"
actions:
  - action: input_number.set_value
    target:
      entity_id: input_number.tagestemperatur_summe_jede_stunde
    data:
      value: >-
        {{ states('input_number.tagestemperatur_summe_jede_stunde') | float +
        state_attr('weather.forecast_home', 'temperature') | float }}
  - action: input_number.set_value
    target:
      entity_id: input_number.gezaehlte_temperaturen
    data:
      value: "{{ states('input_number.gezaehlte_temperaturen') | float + 1 }}"
mode: single


Da sind jetzt mehrerere Bedingung drin.

Grundsätzlich ist es so, dass Du beliebig viele Trigger, beliebig viele Bedingungen und beliebige viele Aktionen in eine Automation packen kannst. Dabei gilt:

Eine Automation wird ausgelöst, wenn einer der Trigger feuert. Sie sind oder-Verknüpft

Dann werden alle Bedingungen geprüft. Nur wenn alle zutreffen, geht es weiter. Sie sind und-Verknüpft.

Wenn das der Fall ist, werden alle Aktionen der Reihe nach ausgeführt. Hier mal als Schaubild (die beiden roten, waagerechten Striche hab ich reingemalt) direkt aus den Traces:

Ganz oben sind 4 Trigger. Wenn einer davon feuert, geht es weiter. Das ist bei dem ganz rechts der Fall. Dann werden die Bedingungen in der Mitte geprüft. Die erste traf nicht zu, deshalb hat die Automation dort aufgehört (bei dem orangenen Kreis mit dem X). Falls alle Bedingungen zutreffen, werden die Aktionen unten nacheinander ausgeführt.

Dies ist aber nur ein kleiner Teil der Möglichkeiten einer Automation. man kann z.B. an die Aktionen noch Bedingungen knüpfen. Zudem kann man bei den Aktionen abfragen welcher der Trigger überhaupt gefeuert hat und das bei den Aktionen berücksichtigen. Bei den Bedingungen kann man logische Verknüpfungen benutzen, also und und oder. Das alles - und noch vieles mehr - macht das ganze ziemlich mächtig.

Du kannst Dir ja mal die Automation basics anschauen, da wird das noch en Detail erklärt. :wink:

Das Ziel wäre es eine Automation zu haben, die die Werte jede Stunde aufsummiert, um Mitternacht den Durchschnitt bildet und dann (und nur dann) alle genutzten Helfer automatisch löscht, damit der nächste Zyklus beginnen kann. Daneben sollen nur valide Temperaturwerte übernommen werden und dann (und nur dann) der Zähler, durch den später geteilt wird, um eins erhöht werden. Die Automation, die ich da eben gezeigt habe, ist also noch lange nicht fertig. :grimacing:

Nachtrag:

Hier mal die ganze Automation als Pseudocode auf die Schnelle zusammengeklöppelt. Und gleich noch einen Fehler gefunden. Kurze Kontrolle bei wikipedia. Ja, ist ein Fehler. Deswegen gleich das korrigierte Bild:

Man muss natürlich nach 24 Werten, d.h. um 23 Uhr(!), den Durchschnitt bilden. Der Wert um Mitternacht ist ja schon der 25. bzw. der erste der nächsten Messung:

Quelle: Schamlos einen Screenshot bei wikipedia gemacht! :laughing:

Nachtrag 2:

In der oben gezeigten Automation den falschen Wert unavailiable durch den korrekten unavailable getauscht! Da war ein i zuviel.

Ich möchte ja kein Spielverderber sein, aber die Durchschnitt Temperatur der letzten 24h, ließe sich auch über die Statistics Integration mit 6 Zeilen code realisieren.

Aber ich sollte mich ja nicht einmischen. :wink: :laughing:
Somit natürlich Off-Topic das Ganze.

Gruß Osorkon

Du sollst Dich nicht nicht einmischen! Du sollst halt nicht sofort einen fertigen Code oder gar eine komplette Automation zum Besten geben. Ein Hinweis, ggf. mit Link, ist voll ok. :wink:

Ich hab irgendwo auch schon einen Sensor gesehen, der min-, max- und mittelwerte ausgibt. Den bräuchte man dann vermutlich nur einmal um Mitternacht aufrufen und der Fisch wäre geputzt. Aber zum einen wäre das langweilig und zum anderen braucht man für irgendwann später noch was zum Optimieren. :man_shrugging:

Zum Glück hab ich vergessen wo ich den gesehen hab. :zany_face:

@JHA

Falls Du es noch nicht gewusst haben solltest. Man kann im Verlauf auch mehrere Verläufe gleichzeitig anzeigen lassen.

Ich hab jetzt eine Automation, die dem oben gezeigten Schaubild entspricht. Jetzt muss ich “nur noch” bis übermorgen warten, um zu sehen, ob sie auch funktioniert wie gewünscht. :thinking:

Das ist mir auch aufgefallen. Ich vermute, dass wir auf de gleiche Lösung gekommen sind.

Von 0:00 bis 23:00 Uhr insgesamt 24 Werte zählen, dann den Durchschnitt bilden und mit diesem Tageswert woanders weiter rechnen. Vor 0:00 muss der Zähler dann resettet werden.

Sorry, dass ich hier nochmal frage. Warum nehmen wir dann nicht nur die zweite Zeile Code?

Dank dir für das Erklären der Automatisierungen.

Ich habe verstanden, dass der Trigger der Auslöser ist (bzw. bei mehreren Triggern die Auslöser sind).

Also z.B:

Trigger 1: wenn ich nach Hause komme

Trigger 2: wenn meine Frau nach Hause kommt

…

Egal ob ich oder sie nach Hause kommt, geht die Automatisierung los, weil ein Triger ausgelöst hat.

Condition ist die Bedingung für das Auslösen bzw. Conditions sind die Bedingungen.

Also z.B.:

Condition 1: wenn Montag ist

Condition 2: wenn es über 10 Grad ist

…

Es muss also Montag sein und über 10 Grad, damit die Aktion(en) ausgeführt wird/werden.

Aktion (action): legt fest was passiert, wenn mindestens 1 Trigger und alle Conditions erfüllt sind.

Ich habe übrigens den Temperatursensor am Laufen. Angeblich sind es den ganzen Tag exakt 14,3 Grad (unverändert). Ich bestelle mir noch den von dir verlinkten.

Dann mache ich es bis hierhin nochmal und versuche mich am Helfer für die gezählten Werte (input_number.gezaehlte_temperaturen).

Ich glaube, dass ich es grundsätzlich kapiert habe, wie es geht, mein Problem ist die Vielzahl an Helfern und dass ich nicht weiß, welcher am besten geeignet ist.

Z.B. weiß ich noch nicht was ich mit den ca. 260 Werten je Kalendertag mache. Gibt es eine Möglichkeit, mittels Tag des Jahres (heute ist der 273te) aus eienr Tabelle den zugehörigen Wert zu 273 zu entnehmen? Es sind heute 2,002 mm. In Excel ist das ein SVERWEIS.

Dank dir vielmals!

Das machen wir ja. Nun, da wir wissen, wo bei der ersten Version die Fallstricke lauern. :wink:

Ja. Genau so, wie Du es verstanden hast, funktioniert es. :+1:

Probier mal folgendes: Batterien raus. Über Nacht liegen lassen. Nächsten Tag die Batterien wieder rein und einmal neu pairen / anlernen. Wenn er dann immer noch spinnt, kann er weg. :man_shrugging:

Das ist gleichzeitig Fluch und Segen an HA. Man hat sehr viele Möglichkeiten und … man hat sehr viele Möglichkeiten. :laughing:

Ich gehe davon aus, dass so gut wie alle hier mit dem Problem zu kämpfen hatte. Gottlob gibt es eine recht umfangreiche und (manchmal mehr und manchmal weniger) ausführliche Doku. Gelegentlich muss man ein bisschen suchen. Teilweise sind die Infos ein wenig verstreut. Neben der “normalen” Doku bei HA gibt es weitergehende Info auf dem Portal für Developer. Nicht zu vergessen das Portal für Designer. :zany_face:

Die “normale” Doku ist die erste Anlaufstelle. Auf dem Developer- und Designer-Portal findest Du dann einen (teilweise ziemlich tiefen) Blick unter die Haube von HA. Da guck ich ab und an schonmal rein, allerdings bin ich auch Programmierer. Ist also quasi eine Berufskrankheit. :laughing:

Und falls alle Stricke reißen gibt es ja noch das Forum. Wer höflich fragt und mit den für das Verständnis nötigen Angaben nicht geizt, dem wird i.d.R. schnell und unbürokratisch geholfen. :+1:

Wenn Du auch später auf alle Werte zugreifen können willst, darfst Du die Helfer nicht löschen. Wie sich das jetzt genau mit dem recorder verhält - der ist für das Speichern der Werte zuständig - kann ich Dir leider aktuell nicht sagen. Den hab ich mir im Detail noch nicht angeschaut. :man_shrugging:

Ich weiß bisher nur, dass standardmäßig für 10 Tage detaillierte Daten im 5s(?)-Intervall gespeichert und ältere Daten zu einem Wert pro Stunde zusammengefasst werden. Diese älteren Daten werden auch nicht gelöscht.

Gleich zur Warnung! An den recorder-Einstellungen sollte man besser nicht rumspielen, wenn man nicht ganz genau weiß, was man tut. Es gibt hier im Forum einige Fäden, wo Leute (nicht selten erfolglos) um Hilfe gebeten habe, weil sie sich damit ihr System zerschossen haben. Solche “lustigen” Sachen wie Systemauslastung über der Kotzgrenze, eine korrupte Datenbank, kaputte Backups, … u.ä.! Im schlimmsten Fall fängt man da wieder bei Null an! :grimacing:

Da nich für! :blush:

Nachtrag:

Den Zähler hatte ich gestern Abend erst eingebaut, aber grundsätzlich läuft es. :blush:

Nicht über die Zeiten wundern. Hier ist es eine Stunde später. Offensichtlich wird für die Anzeige auf meinem Rechner nicht die lokale Zeit auf dem HA zu Hause hergenommen. :man_shrugging:

@JHA
Gerade zufällig gefunden:

Hi,

ich habe den Sonoff SNZB-02WD gerade bekommen und auch schon angelernt.

Die Temperatur hat diese Entität:

sensor.859_sonoff_snzb_02wd_garten_temperature

Nicht wundern, ich habe meine Geräte alle durchnummeriert. Zigbee kist bei mir ab 801. Dieser Sensor ist das 59te Zigbeegerät, hat also die Nummer 859. Ich finde die Geräte damit am besten wieder.

Aktuell habe ich noch ein Projekt, danach schaue ich, dass ich alles nach Anleitung von Oern nachvollziehen kann und melde mich zwischendurch.

Ich würde die Entity_ID’s immer kurz und prägnant benennen.
In diesem Fall einfach

sensor.temperatur_garten

Und dann einfach mit dem Label “ZigBee” und Sonoff" versehen.

Für mich wäre Ausschlaggebend, dass ich so sehr schnell die Entitäten finde. Egal ob in den Karten oder Automationen. Gebe “sensor.temeperatur” ein und schwupp habe ich alle Temperatur Sensoren zur Auswahl.
Auch wäre so die Benennung Hersteller / Protokoll Neutral. Heute habe ich den SonOff als Temp Sensor, morgen ein Fibaro, oder Aqara, etc.

Ist nur ein Tipp, nichts weiteres.

Gruß Osorkon

Nimm bitte noch die Anzahl der Igel mit in Deine Automatisierung auf. Man sollte seine Mähroboter generell nicht nach Einbruch der Dämmerung laufen lassen.

PS bei uns treiben sich regelmäßig 4 bis 5 Igel rum. Also ist der Mähroboter Abends aus und fängt erst am nächsten Tag wieder an.