Práce s časem

Co umí šablony a jak je využívat.
kiklhorn
Moderátor
Moderátor
Příspěvky: 901
Registrován: 03. červenec 2021, 18:35
Dal poděkování: 107 poděkování
Dostal poděkování: 210 poděkování

Práce s časem

Příspěvek od kiklhorn »

Práce s časem

Dost informací najdeme v dokumentaci v sekci "TIME":
https://www.home-assistant.io/docs/conf ... emplating/

Posledních pár hodin jsem se ztrácel a nadával proč mi nic nefunguje.
Takže datum a čas můžeme mít buď jako
- int nebo float nebo i string - počet sekund od 1.1.1970 UTC - což je výhodné pro výpočty intervalů, jednoduchým provnáním <> zjistíme jestli je událost v minulosti nebo budoucnosti apod.
z některých zdrojů to může přijít i jako počet ms (tedy pak stačí před použitím dělit 1000) A pro případnou kontrolu jestli to číslo opravdu je ten určitý datum/čas máme i online nástroj: https://www.epochconverter.com/
- nějaký string YYY-MM-DD HH:MM apod. Pokud je v nějakém nestandartním tvaru tak - než nějaké přehazování řetězení s částni stringu - je asi nejjednodužší použít timestamp_custom viz odkaz na docs nahoře
- datetime objekt - což je věc která jako jediná umožňuje používat metody objektu - třeba pro den v týdnu .weekday()
více též v nahoře odkazované dokumentaci a v https://docs.python.org/3.8/library/dat ... e.datetime

Největší zásek je právě s tím že když to vidíme zobrazené jako třeba 2021-08-14 23:36:53 tak z toho opravdu není poznat jestli je to interně int, float, str, nebo objekt.


Takže jsem udělal malý taháček:
Následující si nakopírujte do vývojářské nástroje, šablony. Je to samodokumentující.

Kód: Vybrat vše

{% set nyni=(now().timestamp()) %} nyni> {{ nyni }}
------------------ slunce vyjde v:
{% set vychod = as_timestamp(strptime(state_attr("sun.sun", "next_rising"), "")) %} # vychod je ted v epoch (sekund od 1.1.1970)
vychod> {{ vychod }}
--------------------
tedy vyjde za
{{ (vychod | int) - (nyni | int) }} sekund
{{ ((vychod | int) - (nyni | int)) /60 }} minut
{{ ((vychod | int) - (nyni | int)) /3600 }} hodin
-------------------------------

vychod je cislo {{ vychod }} (epoch)
udelame z nej string obsahujici datum {{vychod | timestamp_local}}
a z nej datetime objekt {{ as_datetime(vychod | timestamp_local) }}
se kterym uz muzeme pouzivat datetime metody a atributy 
{{ (as_datetime(vychod | timestamp_local)).weekday()  }}
a pro vystup pro zobrazeni z nej udelame iso string aby to zkousl i Apple :)
{{ (as_datetime(vychod | timestamp_local)).isoformat() }}

a nejake hratky:
{% if now().weekday() < 5 %}
ne
{%- else -%}
ano
{%- endif %}

now() {{ now() }}
now().weekday() {{ now().weekday() }}
{{ now() + timedelta( hours = 23, minutes = 17 ) }}


{% if ((now() - timedelta(days=3)).weekday()) < 5 %}
ne
{%- else -%}
ano
{%- endif %}
Vše co si přinesu domů je buď Shelly, nebo to skončí buď pod ESPhome nebo pod Zigbee2mqtt.
Ajťák co pamatuje BBS a OS/2 Warp a je mu jedno o jaký systém nebo síťařinu běží.
HA OS jako jedna z Proxmox VM na Odroid H3+/64GB https://github.com/tteck/Proxmox

Uživatelský avatar
rejze69
Pokročilý
Pokročilý
Příspěvky: 336
Registrován: 01. říjen 2022, 16:21
Dal poděkování: 21 poděkování
Dostal poděkování: 16 poděkování

Re: Práce s časem

Příspěvek od rejze69 »

Ahoj,
nechtěl jsem zakládat nové téma a sem se dotaz hodí nejvíce.
Tepelné čerpadlo poskytuje entitu, kde je vidět čistý čas běhu kompresoru a údaj je v sekundách. Abych si mohl informaci zobrazit rozumně zobrazit, tak v sekundách to opravdu nechceš. ;)
Vytvořil jsem si tedy template, kde je šablona

Kód: Vybrat vše

{{ states('sensor.total_system_uptime')|int|timestamp_custom('%-Hh %-Mm %Ss', false) }}
To mi ukazuje úhledný údaj, kde vidím 6h 3m 40s. Zatím.
Jenže za měsíc či rok už to nechceš ani v hodinách. Nepřišel jsem na to jak to rozšířit o dny. Když přidám %-dd tak to ukazuje 1d a to není pravda.
Nejspíš to tedy pomocí timestamp_custom vůbec nejde. Nebo ano?
Pokud ne, jde do této šablony přidat dělení sekund přímo na dny? Samorřejmě bez desetinných míst. :)
Díky za radu.
NTB Acer aspire ONE N4000, 4G RAM, 64G emmc. Testovací Asrock BeeBox N3000 atom. 4GB Ram, SSD128

kiklhorn
Moderátor
Moderátor
Příspěvky: 901
Registrován: 03. červenec 2021, 18:35
Dal poděkování: 107 poděkování
Dostal poděkování: 210 poděkování

Re: Práce s časem

Příspěvek od kiklhorn »

1d je naprosto v pořádku. timestamp je to čas od?...
Od půlnoci 1.1.1970 což odpovídá timestamp = 0
A snažíš se to zobrazit jako odpovídající datum.
Takže %-d správně zobrazuje 1 protože to je den z nultého dne počítání, tedy z 1.1.1970

Je mi ale jasné co chceš dosáhnout, v ESPHome používám pro zobrazení na displeji

Kód: Vybrat vše

sensor:
  - platform: uptime
    name: ${device_name} uptime
    id: uptime_sensor
    update_interval: 60s
    on_raw_value:
      then:
        - text_sensor.template.publish:
            id: uptime_human
            state: !lambda |-
              int seconds = round(id(uptime_sensor).raw_state);
              int days = seconds / (24 * 3600);
              seconds = seconds % (24 * 3600);
              int hours = seconds / 3600;
              seconds = seconds % 3600;
              int minutes = seconds /  60;
              seconds = seconds % 60;
              return (
                (days ? to_string(days) + "d " : "") +
                (hours ? to_string(hours) + "h " : "") +
                (minutes ? to_string(minutes) + "m " : "") +
                (to_string(seconds) + "s")
              ).c_str();
Pokud to má být přímo v HA, tak si zkus do nástroje pro vývojáře - šablony nakopírovat následující kód
a buď si do Jinja formátu přepsat co používám výše, nebo to určitě někde najdeš už hotové.

Kód: Vybrat vše

{% set up_time =  as_timestamp(now()) - as_timestamp(states('sensor.uptime')) %}
{{ as_timestamp(states('sensor.uptime')) }}
{{ up_time }}
{{ as_timestamp(states('sensor.uptime'))|int|timestamp_custom('%-yy %-mm %-dd %-Hh %-Mm %Ss', false) }}
{{ up_time|int|timestamp_custom('%-yy %-mm %-dd %-Hh %-Mm %Ss', false) }}
{{ states('sensor.uptime') | as_datetime | as_local | relative_time }}
--------------------
1* {{ as_timestamp(states('sensor.date_time_iso'))}}
2* {{ (states('sensor.date_time_iso'))}}
3* {{ (states('sensor.date_time_iso'))}}
4* {{ as_local(now() )}}
{{ utcnow() }}
5* {{ as_timestamp(now() ) }}
6* {{ as_timestamp(now() ) | timestamp_custom('%a %d-%m-%Y %-I:%M %p')}}
7* {{ as_timestamp(utcnow() ) | timestamp_custom('%Y-%m-%d %H:%M:%S')}}
71* {{ as_timestamp(now() ) | timestamp_custom('%Y-%m-%d %H:%M:%S',false)}}
8* {{ (now().isoformat())}}
----------------------
sensor.uptime pochází z integrace https://www.home-assistant.io/integrations/uptime/ (ale dá se k němu dostat i jinak)


//edit: třeba tady: https://community.home-assistant.io/t/h ... u=kiklhorn
Vše co si přinesu domů je buď Shelly, nebo to skončí buď pod ESPhome nebo pod Zigbee2mqtt.
Ajťák co pamatuje BBS a OS/2 Warp a je mu jedno o jaký systém nebo síťařinu běží.
HA OS jako jedna z Proxmox VM na Odroid H3+/64GB https://github.com/tteck/Proxmox

Uživatelský avatar
acerot
Pokročilý
Pokročilý
Příspěvky: 118
Registrován: 12. prosinec 2022, 15:44
Dal poděkování: 2 poděkování
Dostal poděkování: 24 poděkování

Re: Práce s časem

Příspěvek od acerot »

Zkus tohle, ale přidá to jen dny - měsíce a roky už ne (to sčítání je tam jen pro názornost, samozřejmě stačí jedno číslo).

Kód: Vybrat vše

{{ timedelta( seconds = 31536000 + 3600 + 120 + 33 ) }}
{{ timedelta( seconds = 63072000 + 3600 + 120 + 33 ) }}

365 days, 1:02:33
730 days, 1:02:33

Uživatelský avatar
rejze69
Pokročilý
Pokročilý
Příspěvky: 336
Registrován: 01. říjen 2022, 16:21
Dal poděkování: 21 poděkování
Dostal poděkování: 16 poděkování

Re: Práce s časem

Příspěvek od rejze69 »

Ahoj a díky za nápovědy. Zkusím to použít a uvidím co bude lepší.
:thx:

Edit:
Tak pokud se to potom objeví i s dny, tak funguje tohle:

Kód: Vybrat vše

{{ timedelta (seconds = states('sensor.total_system_uptime') | int ) }}
A nakonec asi vyhraje tohle:

Kód: Vybrat vše

{% set s = states('sensor.total_system_uptime') | int %}

{{ [(s//86400)|int ~ ' dnů' if s//86400 else '',
    (s%86400//3600)|int ~ ' hodin' if s%86400//3600 else '',
    (s%3600//60)|int ~ ' minut' if s%3600//60 else '',
    (s%60)|round(2) ~ ' sekund' if s%60 else '']
  |select('ne','')|join(', ')}}
Výsledek 8 hodin, 4 minut, 40.0 sekund
NTB Acer aspire ONE N4000, 4G RAM, 64G emmc. Testovací Asrock BeeBox N3000 atom. 4GB Ram, SSD128

Uživatelský avatar
rejze69
Pokročilý
Pokročilý
Příspěvky: 336
Registrován: 01. říjen 2022, 16:21
Dal poděkování: 21 poděkování
Dostal poděkování: 16 poděkování

Re: Práce s časem

Příspěvek od rejze69 »

Tak favorit funguje.
NTB Acer aspire ONE N4000, 4G RAM, 64G emmc. Testovací Asrock BeeBox N3000 atom. 4GB Ram, SSD128

bimbop
Pokročilý
Pokročilý
Příspěvky: 240
Registrován: 22. srpen 2022, 15:46
Bydliště: Frýdlant nad Ostravicí
Dal poděkování: 53 poděkování
Dostal poděkování: 1 poděkování

Re: Práce s časem

Příspěvek od bimbop »

Bádal a hledal jsem kde se dalo. Bohužel nevím jak v šabloně získat určité datum minulého měsíce. Přiklad dnes máme 11.2.2024 a chci získat 15.1.2024. Jde o to že dnešní datum se mění a získávané datum je pevné vždy minulý měsíc.

Uživatelský avatar
Lion®
Administrátor fóra
Administrátor fóra
Příspěvky: 1604
Registrován: 28. září 2020, 14:07
Bydliště: podkrkonoší
Dal poděkování: 144 poděkování
Dostal poděkování: 193 poděkování
Kontaktovat uživatele:

Re: Práce s časem

Příspěvek od Lion® »

bimbop píše: 11. únor 2024, 20:13 Bádal a hledal jsem kde se dalo. Bohužel nevím jak v šabloně získat určité datum minulého měsíce. Přiklad dnes máme 11.2.2024 a chci získat 15.1.2024. Jde o to že dnešní datum se mění a získávané datum je pevné vždy minulý měsíc.
Jak to myslíš?

Kód: Vybrat vše

{{ as_timestamp('2024-01-15T00:00:00') | timestamp_custom('%Y-%m-%d') }}

Kód: Vybrat vše

{{ '2024-01-15' }}
________________
🍻 Přispěj a získej přístup do obsahu fóra pro dárce. :thx:
Oficiální sada s Raspberry Pi 4B/4GB, černá +Argon NEO Raspberry Pi 4 Case
Patriot Burst 2.5" SATA SSD 120GB + AXAGON EE25-XA6 ALINE box

Galerie realizací

bimbop
Pokročilý
Pokročilý
Příspěvky: 240
Registrován: 22. srpen 2022, 15:46
Bydliště: Frýdlant nad Ostravicí
Dal poděkování: 53 poděkování
Dostal poděkování: 1 poděkování

Re: Práce s časem

Příspěvek od bimbop »

Ještě pro upřesnění. Jde o automatický výpočet. Došlo mi vlastně, že jde o získání předchozího 15. dne. Čili pokud je 1. tak 15. minulý měsíc a pokud je třeba 20. tak 15. tento měsíc. Vycházím z aktuálního data. Nejspíš bude třeba aktuální datum převést. Udělat výpočet a převést zpátky. Jsem natvrdlý a nejde mi pochopit tu logiku. Prostě nakopnout správným směrem. Jaké nástroje použít?

Uživatelský avatar
Lion®
Administrátor fóra
Administrátor fóra
Příspěvky: 1604
Registrován: 28. září 2020, 14:07
Bydliště: podkrkonoší
Dal poděkování: 144 poděkování
Dostal poděkování: 193 poděkování
Kontaktovat uživatele:

Re: Práce s časem

Příspěvek od Lion® »

bimbop píše: 12. únor 2024, 05:43 Ještě pro upřesnění. Jde o automatický výpočet. Došlo mi vlastně, že jde o získání předchozího 15. dne. Čili pokud je 1. tak 15. minulý měsíc a pokud je třeba 20. tak 15. tento měsíc. Vycházím z aktuálního data. Nejspíš bude třeba aktuální datum převést. Udělat výpočet a převést zpátky. Jsem natvrdlý a nejde mi pochopit tu logiku. Prostě nakopnout správným směrem. Jaké nástroje použít?
Nějak tedy tak:

Kód: Vybrat vše

{{ (now() - timedelta(days=15 if now().day > 15 else now().day)).replace(day=15).strftime('%Y-%m-%d') }}
Nebo:

Kód: Vybrat vše

{{ (now() - timedelta(days=14 if now().day > 14 else now().day)).replace(day=15).strftime('%Y-%m-%d') }}
________________
🍻 Přispěj a získej přístup do obsahu fóra pro dárce. :thx:
Oficiální sada s Raspberry Pi 4B/4GB, černá +Argon NEO Raspberry Pi 4 Case
Patriot Burst 2.5" SATA SSD 120GB + AXAGON EE25-XA6 ALINE box

Galerie realizací

Odpovědět

Zpět na „Šablony“