Septillion schreef op vrijdag 17 juni 2022 @ 09:18:
@
RobertMe Volgens mij is alles wat opgeslagen staat in
HA standaard eens string.
HA doet bij
het op
halen alleen voor bepaalde dingen de moeite om
het als een logisc
her object aan te bieden. Maar zelfs een getal laat
het gewoon een string. Je zou dus in Jinja gewoon
het as_datetime filter kunne proberen om de datumstring om te zetten naar een datetime object.
Daarnaast is er ook wel veel mogelijk met string comparison. Want Pyt
hon doet stiekem best veel magic als
het een datum of tijd
herkent. Dan is
het stiekem opeens een datum/tijd vergelijking ipv string.
Dat klopt niet, alleen states zijn altijd strings. Attributes kunnen wel native types zijn, dus bijvoorbeeld een integer of een floating number (of dus een string).
@
RobertMe
Ik
heb
het nog even terug gelezen wat ik toen met Frenck besproken
heb, en ik snap nu ook eindelijk wat
hij zei
Een datetime object is geen native type,
het is een object, en
het bevat dus attributes (zoals
het jaartal, maand, dag, uur, minuten, seconden, etc).
Het is dus meer dan alleen de isoformat weergave van een datum en tijd.
Daarom wordt een datetime als je die opslaat in een attribute omgezet naar de string weergave van een datetime. Nu is de string weergave van een datetime niet
het isoformat, maar iets als
datetime.datetime(2022, 5, 13, 8, 4, 18, 696781, tzinfo=datetime.timezone.utc). Daarom wordt een datetime opject over
het algemeen omgezet naar de isoformat weergave van de datetime voor
hem weg te sc
hrijven, en daarmee wordt
het dus een string.
Nu kun je daar dus wel om
heen werken door je datetime ook om te zetten naar de
het isoformat. Wat je daarbij wel moet doen is omzetten naar een utc, aangezien
now() standaard in de lokale timezone weergegeven wordt. Dat omzetten naar utc kan via een
.astimezone(utcnow().tzinfo)
Op deze manier kun je dus met een filter toc
h gewoon de data die je wil eruit
halen:
Django/Jinja:
1
2
3
4
5
6
| {{
state_attr('weather.climacell_hourly', 'forecast')
| selectattr('datetime', '<', today_at('15:00').astimezone(utcnow().tzinfo).isoformat())
| map(attribute='temperature')
| list
}} |
Geeft:
[19.3, 21.2, 22.9, 24.6, 26.2, 27.4]
Een alternatief is werken met een for-loop en een namespace
Django/Jinja:
1
2
3
4
5
6
7
| {%- set ns = namespace(temp=[]) %}
{%- for f in state_attr('weather.climacell_hourly', 'forecast') %}
{%- if as_datetime(f.datetime) < today_at('15:00') %}
{%- set ns.temp = ns.temp + [ f.temperature ] %}
{%- endif %}
{%- endfor %}
{{ ns.temp }} |
Geeft ook:
[19.3, 21.2, 22.9, 24.6, 26.2, 27.4]
Ik weet ook dat petro (een van de
HA template experts) wel bezig is met een custom filter waarbij je de waardes eerst kunt casten naar iets anders, waardoor
het dus wel direct in een filter zou kunnen. Dan zou je een filter krijgen als
| state_attr_as('datetime', 'as_datetime', '<', today_at('15:00')) maar ik weet niet wat daar de status van is.
[
Voor 15% gewijzigd door
TheFes op 17-06-2022 10:10
]