Ankündigung

Einklappen
Keine Ankündigung bisher.

Sensor Template für Zeitmessung nach Aktion (z.B. Switch Off)

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    #16
    Zitat von steiniKNX Beitrag anzeigen
    Du hast das so einfach im "configuration.yaml" unter "sensors:" eingebunden?
    Nein. Meine configuration.yaml ist kurz / präzise / übersichtlich, da kommt so ein 'Grabbelkram' (im Sinne von: ein einzelner Sensor) nicht rein. Ich habe hier mittlerweile weit über 1.500 Entitäten je System (1x Produktiv, 1x Entwicklung). Da blickt man nicht mehr durch, wenn alles in einer einzigen Datei steht.

    Nach langem Suchen und viel Herumprobiererei mit diversen include-Varianten bin ich ein großer Fan von 'packages' geworden, da man damit geräte- oder raumspezifische Strukturen unabhängig von der Hauptstruktur implementieren kann. Kleinere Dinge (der 'Grabbelkram' - wie in diesem Fall einzelne Sensoren oder Template Sensoren) werden in einer Datei zusammengefasst, wobei ich auch dafür ein /conf Verzeichnis habe. Andere Forenteilnehmer hier bevorzugen andere Ansätze - es gibt da mehrere valide Wege.

    Klartext: In der configuration.yaml steht:
    Code:
    automation:   !include conf/automations.yaml
    script:       !include conf/scripts.yaml
    scene:        !include conf/scenes.yaml
    sensor:       !include conf/sensors.yaml
    rest:         !include conf/rests.yaml
    template:     !include conf/templates.yaml
    media_player: !include conf/media_players.yaml
    input_select: !include conf/input_selects.yaml
    input_number: !include conf/input_numbers.yaml​
    Entsprechend gibt es eine Datei /conf/sensors.yaml, und in der steht (die 2 Leerzeichen am Anfang belassen (!)):
    Code:
      - platform: template
      
        sensors:
    
          # Sonnenauf- und -untergang
    
          sonnenaufgang:
            friendly_name: "Sonnenaufgang"
            unique_id: "sonnenaufgang"
            value_template: >
              {{ as_timestamp(state_attr("sun.sun", "next_rising"))|timestamp_custom("%H:%M") }}
    
          sonnenuntergang:
            friendly_name: "Sonnenuntergang"
            unique_id: "sonnenuntergang"
            value_template: >
              {{ as_timestamp(state_attr("sun.sun", "next_setting"))|timestamp_custom("%H:%M") }}
    Und genau da würde bei mir das oben genannte Template landen, wenn ich es denn selbst brauchen würde. Gleich unter Sonnenauf- und -untergang.

    Hoffe, das hilft Dir weiter.

    /tom
    Zuletzt geändert von Tom Bombadil; 12.05.2025, 20:49.

    Kommentar


      #17
      Zitat von Tom Bombadil Beitrag anzeigen
      Nach langem Suchen und viel Herumprobiererei mit diversen include-Varianten bin ich ein großer Fan von 'packages' geworden, da man damit geräte- oder raumspezifische Strukturen unabhängig von der Hauptstruktur implementieren kann.
      Danke dir.
      Für mein KNX habe ich das auch mit include gemacht.
      Ich bin heute Abend leider nicht mehr dazu gekommen. Werde das morgen Mal genau testen. Viele licht ist es wieder mal das Problem mit den Einrückungen im Editor. Das hatte ich schon vor einiger Zeit mal. Hat ewig gedauert bis ich das gefunden habe.
      Aber dein Aufbau scheint mir schon sehr strukturiert. 👍

      Kommentar


        #18
        Also in der Configuration.yaml habe ich jetzt unter andem folgendes eingebunden:

        sensor: !include sensors.yaml

        Und in der Datei sensors.yaml steht folgendes:
        Code:
          - platform: template
        
            sensors:
              mein_switch_last_switch_off:
                entity_id: switch.mein_switch
                friendly_name: "mein_switch_Switch_last_OFF"
                value_template: >
                  {% set t = states('sensor.time') %}
                  {% set is_off = is_state('switch.mein_switch', 'off')| int(0) %}
                  {% if is_off %}
                    {{ relative_time(states.switch.mein_switch.last_changed) }}"
                  {% else %}
                    {{ '-- XYZ_SWITCH IST AN! --' }}
                  {% endif %}​
        Und ich bekomme die Fehlermeldung:
        Configuration errors
        Error loading /config/configuration.yaml: while scanning for the next token
        found character '\t' that cannot start any token
        in "/config/sensors.yaml", line 3, column 1


        Irgendwas passt wohl an dem "sensors:" nicht. Ist dass ggf. irgendwie die Einrückung?​

        Kommentar


          #19
          Schau mal, ob da irgendwo ein Tab statt Leerzeichen drin ist. Vermutlich Zeile 3 ganz links.

          /tom

          Kommentar


            #20
            Zitat von Tom Bombadil Beitrag anzeigen
            Schau mal, ob da irgendwo ein Tab statt Leerzeichen drin ist.
            Ja, es war ein Tab drin. Sind Tabs generell verboten?

            Jetzt kommt allerdings das nächste komische.
            Ich kann die Datei so speichern und bekomme den grünen Hacken.
            Wenn ich dann aber bei den Developer Tool die Config checken will, dann dreht der Kreis ewig weiter. Wenn ich die sensors.yaml wieder aus kommentiere, dann geht es sofort mit der Prüfung.

            Das ist jetzt mein Code
            Code:
              - platform: template
            
                sensors:
                  mein_switch_last_switch_off:
                  entity_id: switch.mein_switch
                  friendly_name: "Test4"
                  value_template: >
                    {% set t = states('sensor.time') %}
                    {% set is_off = is_state('switch.mein_switch', 'off')| int(0) %}
                    {% if is_off %}
                      {{ relative_time(states.switch.mein_switch.last_changed) }}"
                    {% else %}
                      {{ '-- XYZ_SWITCH IST AN! --' }}
                    {% endif %}​

            Kommentar


              #21
              Bitte mal das " am Ende dieser Zeile entfernen:

              Code:
                  {{ relative_time(states.switch.mein_switch.last_changed) }}"
              Zu YAML und Tabs: Hier unter 'YAML Syntax', 3. Absatz.

              /tom
              Zuletzt geändert von Tom Bombadil; 13.05.2025, 08:52.

              Kommentar


                #22
                Zitat von Tom Bombadil Beitrag anzeigen
                Bitte mal das " am Ende dieser Zeile entfernen:
                Nach Klick auf Prüfung hört der Kringel auch so nicht auf zu drehen?

                Welche HA Version hast du drauf?
                Ich habe gerade gefunden, dass es sich wohl bei dem Aufbau mit " - platform: template" wohl um eine ältere Darstellungsart handelt und diese zwar unterstützt wird, aber nicht mehr empfohlen. Falls ich das überhaupt richtig interpretiere.
                Siehe: https://www.home-assistant.io/integr...tion-variables unter "Legacy binary sensor configuration format"
                Kann es ggf. daran liegen?

                Kommentar


                  #23
                  Nochmal kurz drübergeflogen - Du hast einen Einrückungsfehler. Die Zeilen ab 'entity_id: switch.mein_switch' müssen eine Ebene weiter eingerückt sein.

                  IST:
                  Code:
                    - platform: template
                  
                      sensors:
                        mein_switch_last_switch_off:
                        entity_id: switch.mein_switch
                        friendly_name: "Test4"
                        value_template: >
                          {% set t = states('sensor.time') %}
                          {% set is_off = is_state('switch.mein_switch', 'off')| int(0) %}
                          {% if is_off %}
                            {{ relative_time(states.switch.mein_switch.last_changed) }}"
                          {% else %}
                            {{ '-- XYZ_SWITCH IST AN! --' }}
                          {% endif %}​
                  SOLL:
                  Code:
                    - platform: template
                  
                      sensors:
                  
                        mein_switch_last_switch_off:
                  
                          entity_id: switch.mein_switch
                          friendly_name: "Test4"
                          value_template: >
                            {% set t = states('sensor.time') %}
                            {% set is_off = is_state('switch.mein_switch', 'off')| int(0) %}
                            {% if is_off %}
                              {{ relative_time(states.switch.mein_switch.last_changed) }}
                            {% else %}
                              {{ '-- XYZ_SWITCH IST AN! --' }}
                            {% endif %}​
                  Deshalb empfehle ich auch immer Leerzeilen im Code, da sieht man sowas schneller als in einer 'wall of text'.

                  So, jetzt haben wir hoffentlich alles erwischt.

                  /tom

                  Kommentar


                    #24
                    Zitat von Tom Bombadil Beitrag anzeigen
                    Deshalb empfehle ich auch immer Leerzeilen im Code, da sieht man sowas schneller als in einer 'wall of text'.
                    Danke das war das Problem. Ich habe es nicht gesehen und das hatte ich schon mal und hab Tage rumprobiert.
                    Gibt es ggf. für Home Assitant einen Compiler wie Eclipse oder ähnliches der das besser anzeigt? Was nutzt du?

                    Und gibt es bei der Lösung jetzt noch eine einfache Möglichkeit, dass man die Zeit seit der Switch Aus ist ausschließlich in Minuten angibt.
                    Also ab einer Stunde nicht 1 hour sondern z.B. 64 minutes?

                    Kommentar


                      #25
                      Zum Editor: Im Standard VSCode Addon von HA siehst Du mögliche YAML-Fehler sofort, da der eine eingebaute Prüfung hat. Da wären auch die obigen Punkte sofort aufgefallen.

                      Zur Ausgabe in Minuten: Das wäre halt statt {{ relative_time(states.switch.mein_switch.last_chang ed) }} irgendwas in der Art, wie pamo es bereits geschrieben hat: {{ ( as_timestamp(now()) - as_timestamp(state_attr('switch.mein_switch', 'last_changed')) | int(0) / faktor) }}., wobei Faktor der Umrechnungsfaktor in Minuten ist (vermutlich kommen da s oder ms zurück - kann es grad nicht testen, deshalb einfach selber in den Developer Tools --> Template Checker per copy/paste ausprobieren).

                      /tom

                      Edit: Gemäß diesem Beitrag geht folgendes:

                      Code:
                      {# difference in minutes #}
                      {{ (utcnow() - states.binary_sensor.zugaengeeg.last_changed).total_seconds() // 60 }}
                      Zuletzt geändert von Tom Bombadil; 13.05.2025, 13:21.

                      Kommentar


                        #26
                        Zitat von Tom Bombadil Beitrag anzeigen
                        Nach langem Suchen und viel Herumprobiererei mit diversen include-Varianten bin ich ein großer Fan von 'packages' geworden, da man damit geräte- oder raumspezifische Strukturen unabhängig von der Hauptstruktur implementieren kann. Kleinere Dinge (der 'Grabbelkram' - wie in diesem Fall einzelne Sensoren oder Template Sensoren) werden in einer Datei zusammengefasst, wobei ich auch dafür ein /conf Verzeichnis habe. Andere Forenteilnehmer hier bevorzugen andere Ansätze - es gibt da mehrere valide Wege.
                        Sorry wenn ich mich hier kurz einklinke, aber auch evtl. für dich steiniKNX interessant.
                        Kann man Entitäten "umziehen" z.B. von einer großen yaml zu mehreren kleineren yaml
                        ohne das irgendwelche Verknüpfungen in Automationen oder Visu verloren gehen?

                        Kommentar


                          #27
                          steiniKNX So, jetzt konnte ich mal testen:

                          image.png

                          So sieht entsprechend die oben bereits verlinkte sensors.yaml mit einem Beispielswitch aus:
                          Code:
                            - platform: template
                            
                              sensors:
                          
                                # Sonnenauf- und -untergang
                                sonnenaufgang:
                                  friendly_name: "Sonnenaufgang"
                                  unique_id: "sonnenaufgang"
                                  value_template: >
                                    {{ as_timestamp(state_attr("sun.sun", "next_rising"))|timestamp_custom("%H:%M") }}
                              
                                sonnenuntergang:
                                  friendly_name: "Sonnenuntergang"
                                  unique_id: "sonnenuntergang"
                                  value_template: >
                                    {{ as_timestamp(state_attr("sun.sun", "next_setting"))|timestamp_custom("%H:%M") }}
                          
                                # Testsensor zur Minutenanzeige seit 'off'
                                minuten_seit_kwl_boost:
                                  friendly_name: "Minuten seit letzter KWL Stosslüftung"
                                  unique_id: "Minuten seit letzter KWL Stosslüftung"
                                  device_class: "duration"
                                  unit_of_measurement: "min"
                                  value_template: >
                                    {% set t = states('sensor.time') %}
                                    {% set is_off = is_state('switch.ventilation_boost_mode', 'off')| int(0) %}
                                    {% if is_off %}
                                      {{ (utcnow() - states.switch.ventilation_boost_mode.last_changed).total_seconds() | int(0) // 60 }}
                                    {% else %}
                                      {{ '0' }}
                                    {% endif %}
                          Ich denke, das ist genau das, was Du haben wolltest. Wird die Entität einer Karte hinzugefügt, erscheint automatisch 'min' als Einheit. Im Wert der Entität steht '0' (=switch an) oder die Anzahl der Minuten seit Schaltvorgang auf 'aus'. Achtung für spätere Auswertungen: Template Sensoren enthalten immer den Typ 'String', müssen also ggf. mit '| int(0)' für Vergleiche und Berechnungen in eine Zahl umgewandelt werden.

                          bjoernhim Die YAML Files werden ohnehin beim Start im Hauptspeicher zusammengeführt. Dabei ist egal, ob das YAML aus einer einzigen configuration.yaml oder für die Übersichtlichkeit aus 250 verschiedenen Dateien kommt, auf die aus der configuration.yaml verwiesen wird. Ich sehe nicht, warum man Dateien nicht aufsplitten können sollte (und habe dies tatsächlich auch schon oft gemacht). Es ist nur manchmal ziemliche Frickelei, bis man in allen Dateien alle Einrückungen richtig hat, da die Codeprüfung von VS Code nicht über verschachtelte Dateien funktioniert. Deshalb behalte ich beim Verschieben auch immer alle Einrückungen bei, auch wenn sie teilweise nach dem Verschieben nicht mehr erforderlich sind (manche includes setzen den Einrückungslevel autmatisch).

                          /tom
                          Zuletzt geändert von Tom Bombadil; 13.05.2025, 17:28.

                          Kommentar


                            #28
                            Danke dir und vor allem danke für den Hinweis mit der Umrechnung!

                            Kommentar

                            Lädt...
                            X