Seite 1 von 1

Betriebsstundenzähler erstellen

Verfasst: Mi 11. Mai 2022, 06:47
von Markus
Ich würde gerne erfassen wieviel Stunden/Minuten ein Shelly Switch pro Tag den Status "on" hat.

Das tägliche Rücksetzen wäre mit dem utility meter möglich, nur wie erfasse ich die Tagesstunden? Mit https://www.home-assistant.io/integrations/statistics/ bekomm ich das nicht raus?

Re: Betriebsstundenzähler erstellen

Verfasst: Mi 11. Mai 2022, 08:19
von Markus

Re: Betriebsstundenzähler erstellen

Verfasst: Mi 11. Mai 2022, 20:08
von manni
Hatte dies im Einsatz:

Code: Alles auswählen

  
sensor:  
  - platform: history_stats
    name: on_time_lg_tv
    entity_id: media_player.lg_webos_smart_tv
    state: 'on'
    type: time
    start: '{{ 0 }}'
    end: '{{ now() }}'


utility_meter:
  daily_on_lg_tv:
    source: sensor.on_time_lg_tv
    cycle: daily
  weekly_on_lg_tv:
    source: sensor.on_time_lg_tv
    cycle: weekly
  monthly_on_lg_tv:
    source: sensor.on_time_lg_tv
    cycle: monthly
  quarterly_on_lg_tv:
    source: sensor.on_time_lg_tv
    cycle: quarterly
  yearly_on_lg_tv:
    source: sensor.on_time_lg_tv
    cycle: yearly

Re: Betriebsstundenzähler erstellen

Verfasst: Mi 11. Mai 2022, 20:19
von Markus
Ja, läuft gut....das einzige wäre noch eine Ausgabe in Tabellenform

Tag | Betriebsstunden
1 | x
2 | y
3 | z
4 | ..
5 | ..
6 | ..

Re: Betriebsstundenzähler erstellen

Verfasst: Do 12. Mai 2022, 12:35
von manni
Markdown

Code: Alles auswählen

type: markdown
content: |-
  | Spalte rechts | Spalte links | Nochmal rechts | Spalte mittig |
  |--------------:|:-------------|----------------:|:-------------:|
  |Zeile 1        |Zeile 1       |Zeile 1         |Zeile 1        |
  |Zeile 2        |Zeile 2       |Zeile 2         |Zeile 2        |
  |Zeile 3        |Zeile 3       |Zeile 3         |Zeile 3        |
title: Beispiel Formartierung als Tabelle links/rechts/mittig

Re: Betriebsstundenzähler erstellen

Verfasst: Do 12. Mai 2022, 18:40
von Markus
ja aber wie bekomme ich die Daten in Markup Card (Datum und dazugehöriger Betriebsstundenwert)

Re: Betriebsstundenzähler erstellen

Verfasst: Do 12. Mai 2022, 21:38
von manni
Ich hoffe ich verstehe dich richtig.
Ich habe es in einer normalen Entitäts-Karte.
Aber hier dann verschiedene Möglichkeiten in Markdown:

Code: Alles auswählen

type: markdown
content: >-
  | Nr.     | Wert

  |:--------|:------------------------------------------|

  |1.       |{{ states.sensor.daily_on_lg_tv.state  }}

  |2.       |{{ states.sensor.weekly_on_lg_tv.state }}

  |3.       |{{ states.sensor.monthly_on_lg_tv.state }}

  |4.       |{{ states.sensor.quarterly_on_lg_tv.state }}

  |5.       |{{ states.sensor.yearly_on_lg_tv.state }}

  ***

  | Nr.     | Wert

  |:--------|------------------------------------------:|

  |1)       |{{ states.sensor.daily_on_lg_tv.state  }} h

  |2)       |{{ states.sensor.weekly_on_lg_tv.state }} h

  |3)       |{{ states.sensor.monthly_on_lg_tv.state }} h

  |4)       |{{ states.sensor.quarterly_on_lg_tv.state }} h

  |5)       |{{ states.sensor.yearly_on_lg_tv.state }} h

  ***

  | Zeitraum  | Wert

  |:----------|:------------------------------------------:|

  |Tag        |{{ states.sensor.daily_on_lg_tv.state  }}

  |Woche      |{{ states.sensor.weekly_on_lg_tv.state }}

  |Monat      |{{ states.sensor.monthly_on_lg_tv.state }}

  |Quartal    |{{ states.sensor.quarterly_on_lg_tv.state }}

  |Jahr       |{{ states.sensor.yearly_on_lg_tv.state }}

  ***

  |Tag                                     
  |Woche                                   
  |Monat                                    
  |Jahr                                     |

  |:---------------------------------------:|:---------------------------------------:|:-----------------------------------------|:---------------------------------------:|

  |{{ states.sensor.daily_on_lg_tv.state  }}|{{
  states.sensor.weekly_on_lg_tv.state }}|{{ states.sensor.monthly_on_lg_tv.state
  }}|{{ states.sensor.yearly_on_lg_tv.state }}|
title: Links, rechts, mittig oder als Zeile


Re: Betriebsstundenzähler erstellen

Verfasst: Sa 14. Mai 2022, 08:38
von Markus
Danke, mein Problem ist nicht unbedingt die Formatierung sondern wie ich den jeweiligen Vergangenheits-Tageswert mit Datum erhalte.

Datum-Gestern: xx h
Datum-Vorgestern: xx h
usw...

Re: Betriebsstundenzähler erstellen

Verfasst: Sa 14. Mai 2022, 11:40
von manni
Hm, ich habe hier nur eine Situation, wo ich Temperatur und Datum in eine Datei schreibe.
Da ermittele ich aber nur das aktuelle Datum und speichere das.

Code: Alles auswählen

{{ now().strftime('%a   %d.%m.%Y   %H:%M  ') }}
Vielleicht davon ausgehend das aktuelle Datum in Helfer schreiben oder obiges -24h...-48h usw.?
Damit habe ich mich aber auch noch nicht befasst.
Ich verstehe noch nicht, wie das Ganze zum Schluss aussehen soll.
Du willst also nur den daily-Wert und das wie lange zurück?

Re: Betriebsstundenzähler erstellen

Verfasst: Di 17. Mai 2022, 14:21
von Markus
manni hat geschrieben: Sa 14. Mai 2022, 11:40 Du willst also nur den daily-Wert und das wie lange zurück?
Ja, nur den Daily-Wert von den letzten n (zB 7) Tagen....

Re: Betriebsstundenzähler erstellen

Verfasst: Di 17. Mai 2022, 20:55
von Osorkon
Muss es unbedingt eine Tabelle sein?
Oder geht auch ein Balken-Diagramm?

wie sowas hier mit der custom:apexcharts-card
apexcharts-card.jpg
apexcharts-card.jpg (17.12 KiB) 4141 mal betrachtet
Gruß
Osorkon

Re: Betriebsstundenzähler erstellen

Verfasst: Di 17. Mai 2022, 21:13
von Markus
Mit apexcharts-card funktioniert es gut....aber ich würde gerade rausfinden/verstehen wie man das mit einer Tabelle lösen kann ;-)

Re: Betriebsstundenzähler erstellen

Verfasst: Di 17. Mai 2022, 23:28
von Osorkon
Du willst ja auf die Werte zurück greifen, die in der Vergangenheit liegen.
Müsstest also auf die history bzw. die db zurückgreifen.
Da wäre einmal ein SQL Sensor dann 7 Stück davon mit der entsprechenden query. Voraussetzung Deine history erfasst die 7 Tage.

Eine andere Möglichkeit wäre ein Trigger-based template sensor für jeden Wochentag, der um 23:59 den Wert für eine Woche zwischen speichert. Als Attribut kannst Du z.B. das jeweilige Datum mitgeben.

Hier mal ein Bsp, Auszug aus der template.yaml

Code: Alles auswählen

- trigger:
    - platform: template
      value_template: >
        {{ now().strftime('%w,%H:%M') == "2,23:59" }}
  sensor:
    - name: "Wert Dienstag"
      state: >
        {{states('sensor.xyz')}}
      attributes:
        Datum: >
          {{ now().strftime('Dienstag, den %d.%m') }}
Die erste Zahl steht für den Wochentag 2=Dienstag und dann die Uhrzeit 23:59
Spricht der Sensor wird immer Dienstags um 23:59 aktualisiert.
Und dann eben noch die Sensoren für die anderen Wochentage.
Nach einer Woche hast Du alle 7 Sensoren mit Werten gefüllt.
Jetzt musst Du diese noch Sortieren nach "letzte Aktualisierung" und irgendwie in die Markdown Karte verpacken.

Das einfachste wäre aber immer noch eine custom:apexcharts-card in Tabellen Form, wenn es sowas gäbe. 😀

Gruß
Osorkon

Re: Betriebsstundenzähler erstellen

Verfasst: Mi 18. Mai 2022, 11:37
von manni
So, habe mal bißchen rumexperimentiert.
Gibt bestimmt elegantere Möglichkeiten, aber auf die Schnelle fiel mir bloß dies hier ein.
Habe 7 Sensoren erstellt, für 7 Tage.

Code: Alles auswählen

  - platform: history_stats
    name: on_time_lg_tv
    entity_id: media_player.lg_webos_smart_tv
    state: 'on'
    type: time
    end: "{{ now().replace(hour=0, minute=0, second=0) }}"
    duration:
      hours: 0
  - platform: history_stats
    name: on_time_lg_tv_1
    entity_id: media_player.lg_webos_smart_tv
    state: 'on'
    type: time
    end: "{{ now().replace(hour=0, minute=0, second=0) }}"
    duration:
      hours: 24
usw. bis:
      hours: 168
Ich habe jetzt also 7 Werte, es wird also jedesmal die gesamte Zeit von 0 Uhr bis zu x Stunden zurück ermittelt.
Weiß nicht ob man die Zeit auch anders vorgeben kann, so daß immer nur ein Tag ermittelt wird.
Aber so gehts auch.

Code: Alles auswählen

{{states.sensor.on_time_lg_tv.state}}
{{states.sensor.on_time_lg_tv_1.state}}
{{states.sensor.on_time_lg_tv_2.state}}
{{states.sensor.on_time_lg_tv_3.state}}
{{states.sensor.on_time_lg_tv_4.state}}
{{states.sensor.on_time_lg_tv_5.state}}
{{states.sensor.on_time_lg_tv_6.state}}
{{states.sensor.on_time_lg_tv_7.state}}
Man muß jetzt halt nur die Differenz zwischen den einzelnen Tagen ermitteln.

Code: Alles auswählen

{{  '%0.2f' | format(states('sensor.on_time_lg_tv_7') | float - states('sensor.on_time_lg_tv_6') | float ) }}
{{  '%0.2f' | format(states('sensor.on_time_lg_tv_6') | float - states('sensor.on_time_lg_tv_5') | float ) }}
{{  '%0.2f' | format(states('sensor.on_time_lg_tv_5') | float - states('sensor.on_time_lg_tv_4') | float ) }}
{{  '%0.2f' | format(states('sensor.on_time_lg_tv_4') | float - states('sensor.on_time_lg_tv_3') | float ) }}
{{  '%0.2f' | format(states('sensor.on_time_lg_tv_3') | float - states('sensor.on_time_lg_tv_2') | float ) }}
{{  '%0.2f' | format(states('sensor.on_time_lg_tv_2') | float - states('sensor.on_time_lg_tv_1') | float ) }}
{{  '%0.2f' | format(states('sensor.on_time_lg_tv_1') | float ) }}
Dazu das Datum der 7 Tage und alles in ein Markdown:

Code: Alles auswählen

|Datum                                                                              |  |  |Summe                                      |  |Tageswerte                                                                                                             |
|:----------------------------------------------------------------------------------|:-|:-|:-----------------------------------------:|:-|:---------------------------------------------------------------------------------------------------------------------:|
|{{ now().strftime('%d.%m.%Y')}}                                                    |  |  |{{states.sensor.on_time_lg_tv.state}}      |  |                                                                                                                       |
|{{ (as_timestamp(now()) - (24*3600)) | timestamp_custom('%d.%m.%Y', True) }}       |  |  |{{states.sensor.on_time_lg_tv_1.state}}    |  |{{  '%0.2f' | format(states('sensor.on_time_lg_tv_1') | float ) }}                                                     |
|{{ (as_timestamp(now()) - (48*3600)) | timestamp_custom('%d.%m.%Y', True) }}       |  |  |{{states.sensor.on_time_lg_tv_2.state}}    |  |{{  '%0.2f' | format(states('sensor.on_time_lg_tv_2') | float - states('sensor.on_time_lg_tv_1') | float ) }}          |
|{{ (as_timestamp(now()) - (72*3600)) | timestamp_custom('%d.%m.%Y', True) }}       |  |  |{{states.sensor.on_time_lg_tv_3.state}}    |  |{{  '%0.2f' | format(states('sensor.on_time_lg_tv_3') | float - states('sensor.on_time_lg_tv_2') | float ) }}          |
|{{ (as_timestamp(now()) - (96*3600)) | timestamp_custom('%d.%m.%Y', True) }}       |  |  |{{states.sensor.on_time_lg_tv_4.state}}    |  |{{  '%0.2f' | format(states('sensor.on_time_lg_tv_4') | float - states('sensor.on_time_lg_tv_3') | float ) }}          |
|{{ (as_timestamp(now()) - (120*3600)) | timestamp_custom('%d.%m.%Y', True) }}      |  |  |{{states.sensor.on_time_lg_tv_5.state}}    |  |{{  '%0.2f' | format(states('sensor.on_time_lg_tv_5') | float - states('sensor.on_time_lg_tv_4') | float ) }}          |
|{{ (as_timestamp(now()) - (144*3600)) | timestamp_custom('%d.%m.%Y', True) }}      |  |  |{{states.sensor.on_time_lg_tv_6.state}}    |  |{{  '%0.2f' | format(states('sensor.on_time_lg_tv_6') | float - states('sensor.on_time_lg_tv_5') | float ) }}          |
|{{ (as_timestamp(now()) - (168*3600)) | timestamp_custom('%d.%m.%Y', True) }}      |  |  |{{states.sensor.on_time_lg_tv_7.state}}    |  |{{  '%0.2f' | format(states('sensor.on_time_lg_tv_7') | float - states('sensor.on_time_lg_tv_6') | float ) }}          |
|-----------------------                                                   |  |  |-----------------------------                                           |  |                                                                                                                       |
Mit der letzten Zeile experimentieren wegen Abstand zwischen den Spalten zur besseren Lesbarkeit.
Die Tageswerte muß man dann umrechnen, 0,5 sind dann 30 Minuten.

Hoffentlich meintest du sowas.