picnic84 Skrevet 5. mai 2022 Skrevet 5. mai 2022 Laget litt script og visuelt grensesnitt for smartlading av elbil (i mitt tilfelle Tesla pÄ Tesla Wall Charger). Kommer til Ä innarbeide hensyn til effekttariff ogsÄ etterhvert nÄr det kommer her i distriktet.  BlÄtt viser rimeligste timen(e) frem til fastsatt deadline. Beregner automatisk ut hvor mange timer lading som behÞves basert pÄ info fra Tesla. Apexcharts-card for grensesnittet. Apexchart grensesnittet i stor grad kopiert fra en annen forumpost. Deretter kan man sette opp en automasjon som starter og stopper lading basert pÄ binary sensor laget nedenfor.  Koden er litt kaotisk nÄ, men hÄper den kanskje er til hjelp eller inspirasjon for andre: Et par forklaringer i koden: 454 = maks rekkevidde pÄ bil 70 = ladehastighet angitt i km/t  sensor: - platform: template sensors: charge_cheap_hours: friendly_name: "Cheapest hours" attribute_templates: raw_cheapest_hours: > {% set nhoursmax = namespace(nhoursmax= 4) %} {% if states('sensor.tesla_model_3_range_sensor')|int > 0 %} {% set nhoursmax.nhoursmax = ((454 - states('sensor.tesla_model_3_range_sensor')|int)/70)|round(0,'ceil') %} {% else %} {% set nhoursmax.nhoursmax = 4 %} {% endif %} {% if state_attr('sensor.nordpool_kwh_trheim_nok_2_095_025', 'raw_tomorrow')|length > 1 %} {% if state_attr('sensor.nordpool_kwh_trheim_nok_2_095_025', 'raw_tomorrow')[0].value == None %} {% set c=state_attr('sensor.nordpool_kwh_trheim_nok_2_095_025', 'raw_today') %} {% else %} {% set c=state_attr('sensor.nordpool_kwh_trheim_nok_2_095_025', 'raw_today')+state_attr('sensor.nordpool_kwh_trheim_nok_2_095_025', 'raw_tomorrow') %} {% endif %} {% endif %} {% if state_attr('sensor.nordpool_kwh_trheim_nok_2_095_025', 'raw_tomorrow')|length == 0 %} {% set c=state_attr('sensor.nordpool_kwh_trheim_nok_2_095_025', 'raw_today') %} {% endif %} {% set c=c|sort(attribute='value')%} {% set chargefrom = namespace(chargefrom=now()) %} {% set chargeto = namespace(chargeto=now()) %} {% if now().hour < 8 %} {% set chargeto.chargeto = now().replace(hour=8,minute=0,second=0) %} {% endif %} {% if now().hour >= 8 %} {% set d = now().day + 1 %} {% set chargeto.chargeto = now().replace(day=d,hour=8,minute=0,second=0) %} {% endif %} {% if states('input_select.charge_deadline') == "Evening" %} {% if now().hour < 18 %} {% set chargeto.chargeto = now().replace(hour=18,minute=0,second=0) %} {% endif %} {% if now().hour >= 18 %} {% set d = now().day + 1 %} {% set chargeto.chargeto = now().replace(day=d,hour=18,minute=0,second=0) %} {% endif %} {% endif %} {% if states('input_select.charge_deadline') == "Unlimited" %} {% set d = now().day + 3 %} {% set chargeto.chargeto = now().replace(day=d,hour=18,minute=0,second=0) %} {% endif %} {% set data = namespace(list=[]) %} {% for item in c %} {% if item.end >= chargefrom.chargefrom and item.end <= chargeto.chargeto and data.list|length < nhoursmax.nhoursmax %} {% set customer = ({"start":item.start|string,"end": item.end|string,"value":item.value}) %} {% set data.list=data.list + [customer] %} {% endif %} {% endfor %} {{data.list|sort(attribute='start')|to_json}} value_template: 'on' charge_cheap_hour_bool: friendly_name: "Cheap hour" value_template: > {% set nhoursmax = namespace(nhoursmax= 4) %} {% if states('sensor.tesla_model_3_range_sensor')|int > 0 %} {% set nhoursmax.nhoursmax = ((454 - states('sensor.tesla_model_3_range_sensor')|int)/70)|round(0,'ceil') %} {% else %} {% set nhoursmax.nhoursmax = 4 %} {% endif %} {% if state_attr('sensor.nordpool_kwh_trheim_nok_2_095_025', 'raw_tomorrow')|length > 1 %} {% if state_attr('sensor.nordpool_kwh_trheim_nok_2_095_025', 'raw_tomorrow')[0].value == None %} {% set c=state_attr('sensor.nordpool_kwh_trheim_nok_2_095_025', 'raw_today') %} {% else %} {% set c=state_attr('sensor.nordpool_kwh_trheim_nok_2_095_025', 'raw_today')+state_attr('sensor.nordpool_kwh_trheim_nok_2_095_025', 'raw_tomorrow') %} {% endif %} {% endif %} {% if state_attr('sensor.nordpool_kwh_trheim_nok_2_095_025', 'raw_tomorrow')|length == 0 %} {% set c=state_attr('sensor.nordpool_kwh_trheim_nok_2_095_025', 'raw_today') %} {% endif %} {% set c=c|sort(attribute='value')%} {% set chargefrom = namespace(chargefrom=now()) %} {% set chargeto = namespace(chargeto=now()) %} {% if now().hour < 8 %} {% set chargeto.chargeto = now().replace(hour=8,minute=0,second=0) %} {% endif %} {% if now().hour >= 8 %} {% set d = now().day + 1 %} {% set chargeto.chargeto = now().replace(day=d,hour=8,minute=0,second=0) %} {% endif %} {% if states('input_select.charge_deadline') == "Evening" %} {% if now().hour < 18 %} {% set chargeto.chargeto = now().replace(hour=18,minute=0,second=0) %} {% endif %} {% if now().hour >= 18 %} {% set d = now().day + 1 %} {% set chargeto.chargeto = now().replace(day=d,hour=18,minute=0,second=0) %} {% endif %} {% endif %} {% if states('input_select.charge_deadline') == "Unlimited" %} {% set d = now().day + 3 %} {% set chargeto.chargeto = now().replace(day=d,hour=18,minute=0,second=0) %} {% endif %} {% set data = namespace(list=[]) %} {% for item in c %} {% if item.end >= chargefrom.chargefrom and item.end <= chargeto.chargeto and data.list|length < nhoursmax.nhoursmax %} {% set customer = item %} {% set data.list=data.list + [customer] %} {% endif %} {% endfor %} {% set chargebool = namespace(chargebool=False) %} {% for item in data.list %} {% if now() >= item.start and now() <= item.end %} {% set chargebool.chargebool = True %} {% endif %} {% endfor %} {{ chargebool.chargebool }}  input_boolean: charge_onoff: name: Enable smart charge icon: mdi:car input_select: charge_deadline: name: Smart charge deadline options: - Morning - Evening - Unlimited icon: mdi:car  Apexchart: type: custom:apexcharts-card graph_span: 48h span: start: day offset: +0H header: title: Electricity Price show: false show_states: true colorize_states: true floating: false hours_12: false stacked: false experimental: color_threshold: true all_series_config: show: legend_value: false datalabels: false extremas: true in_brush: true float_precision: 3 type: area invert: false fill_raw: last now: show: true label: Now color: red series: - entity: sensor.nordpool_kwh_trheim_nok_2_095_025 name: Current day opacity: 0.7 extend_to: false color_threshold: - value: -1 color: '#1E90FF' - value: 0 color: '#008000' - value: 0.9 color: '#008000' - value: 1.7 color: '#DAA520' - value: 2 color: '#FF0000' data_generator: | return entity.attributes.raw_today.map((start, index) => { return [new Date(start["start"]).getTime(), entity.attributes.raw_today[index]["value"]]; }); - entity: sensor.nordpool_kwh_trheim_nok_2_095_025 name: Tomorrow opacity: 0.5 extend_to: false color_threshold: - value: -1 color: '#1E90FF' - value: 0 color: '#008000' - value: 0.9 color: '#008000' - value: 1.7 color: '#DAA520' - value: 2 color: '#FF0000' data_generator: | return entity.attributes.raw_tomorrow.map((start, index) => { return [new Date(start["start"]).getTime(), entity.attributes.raw_tomorrow[index]["value"]]; }); - entity: sensor.charge_cheap_hours name: Cheapest Hours color: '#380d94' type: column opacity: 0.9 extend_to: false stroke_width: -2 data_generator: | return entity.attributes.raw_cheapest_hours.map((start, index) => { return [new Date(start["start"]).getTime(), entity.attributes.raw_cheapest_hours[index]["value"]]; }); apex_config: chart: height: 400px animations: enabled: true easing: easeinout speed: 800 animateGradually: enabled: true delay: 150 zoom: enabled: true type: x autoScaleYaxis: true zoomedArea: fill: color: '#90CAF9' opacity: 0.4 stroke: color: '#0D47A1' opacity: 0.4 width: 1 legend: show: false floating: true offsetY: 25 yaxis: opposite: false reversed: false logarithmic: false decimalsInFloat: 2 min: 0 labels: show: true tooltip: enabled: true crosshairs: show: true xaxis: labels: show: true rotate: -45 rotateAlways: true logarithmic: true stroke: show: true curve: stepline lineCap: butt colors: undefined plotOptions: candlestick: colors: upward: '#00B746' downward: '#EF403C' wick: useFillColor: true markers: size: 1 grid: show: true strokeDashArray: 1 position: front xaxis: lines: show: true  2 Siter
OlavT Skrevet 7. mai 2022 Skrevet 7. mai 2022 On 05/05/2022 at 13:18, picnic84 said: Laget litt script og visuelt grensesnitt for smartlading av elbil (i mitt tilfelle Tesla pÄ Tesla Wall Charger). Kommer til Ä innarbeide hensyn til effekttariff ogsÄ etterhvert nÄr det kommer her i distriktet. Hvordan hadde du tenkt Ä lage logikken for Ä ta hensyn til effekt-tariff? Tenker ikke pÄ kode, men hvordan tenker du dette skal fungere. Det blir jo motstridende mÄl. Enten lade billig eller Ä lade med lavere effekt. Ofte vanskelig Ä kombinere. Siter
picnic84 Skrevet 7. mai 2022 Forfatter Skrevet 7. mai 2022 (endret)   5 hours ago, OlavT said: Hvordan hadde du tenkt Ä lage logikken for Ä ta hensyn til effekt-tariff? Tenker ikke pÄ kode, men hvordan tenker du dette skal fungere. Det blir jo motstridende mÄl. Enten lade billig eller Ä lade med lavere effekt. Ofte vanskelig Ä kombinere.  Det mÄ jeg nesten se pÄ nÄr jeg vet hvordan den prisingen blir. Mest sannsynlig mÄ jeg nok bare pÄ forhÄnd ta stilling til hvilket nivÄ jeg skal legge meg pÄ, og mest sannsynlig vil det nok aldri vÊre prismessig verdt det med hensyn til elbillading Ä betale for et hÞyere effektnivÄ. SÄ da mÄ jeg kanskje bare vurdere om jeg f.eks. vil betale for <5kw, >=5kw eller >=10kw (har ingen varme i huset som gÄr pÄ det ordinÊre elnettet mitt). Endret 7. mai 2022 av picnic84 Siter
hellowlol Skrevet 13. oktober 2022 Skrevet 13. oktober 2022 Knall at noen gidder Ă„ skrive en template for dette đ Siter
stigvi Skrevet 14. oktober 2022 Skrevet 14. oktober 2022 hellowlol skrev (8 timer siden): Knall at noen gidder Ă„ skrive en template for dette đ Synd at det ikke er noen etablerte standarder for Ă„ styre dette. Ladebokser som i det hele tatt lar seg styre, bruker forskjellige mĂ„ter Ă„ gjĂžre det pĂ„. Teknologien i bunn er i tillegg svak og gir ingen informasjon om ladestatus nĂ„r en bruker AC lader. Og det gjĂžr jo alle med lading hjemme. SĂ„ en blir henvist til bilens mangelfulle kommunikasjon hvis den i det hele tatt har noe. Egentlig ganske merkelig at vi i 2022 ikke har kommet lenger. Siter
picnic84 Skrevet 14. oktober 2022 Forfatter Skrevet 14. oktober 2022 (endret) Min hypotese er nok at dette er noe som vil bli mer og mer styrt via bilene. Praktisk talt alle biler som leveres i dag har nettilkobling og solide "datamaskiner". Hvorfor vi da skal trenge enda en kompliserende styringsenhet oppÄ dette (ladeboks) igjen skjÞnner jeg ikke. Den kan vÊre dum som et brÞd for min del. Standarder er fint, men jeg tror vi skal se langt etter noe standard API lÞsning pÄ tvers av bilmodellene.  Jeg har uansett utvidet modellen ovenfor nÄ med noen fÄ ting: - knapp til Ä angi om man skal lade med maxrange eller ikke (100%/80%) - en mer smooth justering av opp og ned justering ved hjelp av en "average" modul som er mye bedre enn den som finnes i HA - har ogsÄ laget script hvor jeg justerer effektbelastningen med hensyn til nettselskapenes trinnprising - (bruker amsleser.no for Ä lese totalbelastning som fungerer utrolig bra)  Kan oppdatere her etterhvert. Endret 14. oktober 2022 av picnic84 Siter
strutings Skrevet 19. februar Skrevet 19. februar picnic84 skrev (PĂ„ 14.10.2022 den 8.57): Min hypotese er nok at dette er noe som vil bli mer og mer styrt via bilene. Praktisk talt alle biler som leveres i dag har nettilkobling og solide "datamaskiner". Hvorfor vi da skal trenge enda en kompliserende styringsenhet oppĂ„ dette (ladeboks) igjen skjĂžnner jeg ikke. Den kan vĂŠre dum som et brĂžd for min del. Standarder er fint, men jeg tror vi skal se langt etter noe standard API lĂžsning pĂ„ tvers av bilmodellene.  Jeg har uansett utvidet modellen ovenfor nĂ„ med noen fĂ„ ting: - knapp til Ă„ angi om man skal lade med maxrange eller ikke (100%/80%) - en mer smooth justering av opp og ned justering ved hjelp av en "average" modul som er mye bedre enn den som finnes i HA - har ogsĂ„ laget script hvor jeg justerer effektbelastningen med hensyn til nettselskapenes trinnprising - (bruker amsleser.no for Ă„ lese totalbelastning som fungerer utrolig bra)  Kan oppdatere her etterhvert.  BlĂ„ser liv i denne trĂ„den igjen đ Etter en oppgradering av apexchart, sĂ„ nektet den Ă„ legge fyllfarge pĂ„ cheapest hours. Endret til area, men da fyller den alt mellom lavest og hĂžyest.. Bruker du dette fortsatt? Siter
picnic84 Skrevet 20. februar Forfatter Skrevet 20. februar (endret) Bruker det ikke lenger siden Tesla stengte av APIet for Ä kunne styre Tesla gratis. Effektledd begrensningen tok jeg inn som en varsel til mobil i stedet dersom jeg ser ut til Ä gÄ over effektleddet jeg Þnsker Ä ligge innenfor.    Men har apexchart grafen fortsatt:    - type: custom:apexcharts-card graph_span: 48h span: end: hour update_interval: 30s header: title: Electricity Consumption Hourly Average show: true show_states: true colorize_states: true floating: false hours_12: false stacked: true experimental: color_threshold: true all_series_config: show: legend_value: false extremas: true float_precision: 3 type: area invert: false fill_raw: zero now: show: true label: Now color: red series: - entity: sensor.ams_powu_p name: AMS meter group_by: func: avg duration: 60min type: column opacity: 0.5 extend_to: false color_threshold: - value: -1 color: "#008000" - value: 4500 color: "#DAA520" - value: 5000 color: "#FF0000" - entity: sensor.heated_water_power_consumption name: Water Heating transform: return x * 1000; unit: W group_by: func: diff duration: 60min fill: last start_with_last: true type: column fill_raw: last opacity: 0.3 extend_to: false color_threshold: - value: -1 color: "#008000" apex_config: chart: height: 200px animations: enabled: true easing: easeinout speed: 800 animateGradually: enabled: true delay: 150 zoom: enabled: true type: x autoScaleYaxis: true zoomedArea: fill: color: "#90CAF9" opacity: 0.4 stroke: color: "#0D47A1" opacity: 0.4 width: 1 legend: show: false floating: true offsetY: 25 yaxis: opposite: false reversed: false logarithmic: false decimals: 0 min: 0 labels: show: true tooltip: enabled: true crosshairs: show: true xaxis: labels: show: true rotate: -45 rotateAlways: true logarithmic: true stroke: show: true curve: stepline lineCap: butt colors: undefined plotOptions: candlestick: colors: upward: "#00B746" downward: "#EF403C" wick: useFillColor: true markers: size: 1 grid: show: true strokeDashArray: 1 position: front xaxis: lines: show: true - type: custom:apexcharts-card graph_span: 48h span: start: day offset: +0H header: title: Electricity Price show: false show_states: true colorize_states: true floating: false hours_12: false stacked: true experimental: color_threshold: true all_series_config: show: legend_value: false extremas: true float_precision: 3 type: area invert: false fill_raw: zero now: show: true label: Now color: red yaxis: - id: Strompris min: ~0 - id: Forbruk opposite: true min: ~0 max: ~5000 series: - entity: sensor.charge_cheap_hours name: Today unit: kr yaxis_id: Strompris type: column opacity: 0.5 extend_to: false color_threshold: - value: -1 color: "#1E90FF" - value: 0 color: "#008000" - value: 0.9 color: "#008000" - value: 1.7 color: "#DAA520" - value: 2 color: "#FF0000" data_generator: > return entity.attributes.raw_leftover_hours_today.map((start, index) => { return [new Date(start["start"]).getTime(), entity.attributes.raw_leftover_hours_today[index]["value"]]; }); - entity: sensor.charge_cheap_hours name: Tomorrow unit: kr yaxis_id: Strompris type: column opacity: 0.8 extend_to: false color_threshold: - value: -1 color: "#1E90FF" - value: 0 color: "#008000" - value: 0.9 color: "#008000" - value: 1.7 color: "#DAA520" - value: 2 color: "#FF0000" data_generator: > return entity.attributes.raw_leftover_hours_tomorrow.map((start, index) => { return [new Date(start["start"]).getTime(), entity.attributes.raw_leftover_hours_tomorrow[index]["value"]]; }); - entity: sensor.charge_cheap_hours name: Cheapest Hours unit: kr yaxis_id: Strompris color: "#380d94" type: column opacity: 0.9 extend_to: false data_generator: | return entity.attributes.raw_cheapest_hours.map((start, index) => { return [new Date(start["start"]).getTime(), entity.attributes.raw_cheapest_hours[index]["value"]]; }); apex_config: chart: height: 200px animations: enabled: true easing: easeinout speed: 800 animateGradually: enabled: true delay: 150 zoom: enabled: true type: x autoScaleYaxis: true zoomedArea: fill: color: "#90CAF9" opacity: 0.4 stroke: color: "#0D47A1" opacity: 0.4 width: 1 legend: show: false floating: true offsetY: 25 yaxis: opposite: false reversed: false logarithmic: false decimalsInFloat: 2 min: 0 labels: show: true tooltip: enabled: true crosshairs: show: true xaxis: labels: show: true rotate: -45 rotateAlways: true logarithmic: true stroke: show: true curve: stepline lineCap: butt colors: undefined plotOptions: candlestick: colors: upward: "#00B746" downward: "#EF403C" wick: useFillColor: true markers: size: 1 grid: show: true strokeDashArray: 1 position: front xaxis: lines: show: true  Endret 20. februar av picnic84 justering Siter
strutings Skrevet 21. februar Skrevet 21. februar Takk for den đ Hva er det den visningen av leftovers gjĂžr? Lyst til Ă„ dele konfigen for denne attributen? Siter
picnic84 Skrevet 21. februar Forfatter Skrevet 21. februar Ga deg nok litt for mye i forrige..  Leftover er bare en betegnelse pÄ de timene som ikke er de rimeligste.   Her er den relevante apexchart grafen:  - type: custom:apexcharts-card graph_span: 48h span: start: day offset: +0H header: title: Electricity Price show: false show_states: true colorize_states: true floating: false hours_12: false stacked: true experimental: color_threshold: true all_series_config: show: legend_value: false extremas: true float_precision: 3 type: area invert: false fill_raw: zero now: show: true label: Now color: red yaxis: - id: Strompris min: ~0 - id: Forbruk opposite: true min: ~0 max: ~5000 series: - entity: sensor.charge_cheap_hours name: Today unit: kr yaxis_id: Strompris type: column opacity: 0.5 extend_to: false color_threshold: - value: -1 color: "#1E90FF" - value: 0 color: "#008000" - value: 0.9 color: "#008000" - value: 1.7 color: "#DAA520" - value: 2 color: "#FF0000" data_generator: > return entity.attributes.raw_leftover_hours_today.map((start, index) => { return [new Date(start["start"]).getTime(), entity.attributes.raw_leftover_hours_today[index]["value"]]; }); - entity: sensor.charge_cheap_hours name: Tomorrow unit: kr yaxis_id: Strompris type: column opacity: 0.8 extend_to: false color_threshold: - value: -1 color: "#1E90FF" - value: 0 color: "#008000" - value: 0.9 color: "#008000" - value: 1.7 color: "#DAA520" - value: 2 color: "#FF0000" data_generator: > return entity.attributes.raw_leftover_hours_tomorrow.map((start, index) => { return [new Date(start["start"]).getTime(), entity.attributes.raw_leftover_hours_tomorrow[index]["value"]]; }); - entity: sensor.charge_cheap_hours name: Cheapest Hours unit: kr yaxis_id: Strompris color: "#380d94" type: column opacity: 0.9 extend_to: false data_generator: | return entity.attributes.raw_cheapest_hours.map((start, index) => { return [new Date(start["start"]).getTime(), entity.attributes.raw_cheapest_hours[index]["value"]]; }); apex_config: chart: height: 200px animations: enabled: true easing: easeinout speed: 800 animateGradually: enabled: true delay: 150 zoom: enabled: true type: x autoScaleYaxis: true zoomedArea: fill: color: "#90CAF9" opacity: 0.4 stroke: color: "#0D47A1" opacity: 0.4 width: 1 legend: show: false floating: true offsetY: 25 yaxis: opposite: false reversed: false logarithmic: false decimalsInFloat: 2 min: 0 labels: show: true tooltip: enabled: true crosshairs: show: true xaxis: labels: show: true rotate: -45 rotateAlways: true logarithmic: true stroke: show: true curve: stepline lineCap: butt colors: undefined plotOptions: candlestick: colors: upward: "#00B746" downward: "#EF403C" wick: useFillColor: true markers: size: 1 grid: show: true strokeDashArray: 1 position: front xaxis: lines: show: true   og sensorer:  - platform: template sensors: charge_cheap_hours_binary: friendly_name: "Cheap hour binary sensor" value_template: > {% set ns = namespace(matched = "false") %} {% set data = state_attr('sensor.charge_cheap_hours','raw_cheapest_hours') %} {% for item in data %} {% if as_timestamp(item.end) >= as_timestamp(now()) and as_timestamp(item.start) <= as_timestamp(now()) %} {% set ns.matched = "true" %} {% endif %} {% endfor %} {{ ns.matched }} charge_cheap_hours: friendly_name: "Cheapest hours lists" value_template: > {{ "" }} attribute_templates: raw_today_priceadjusted: > {% set chargingpricehourly=state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_today') %} {% if chargingpricehourly | length == 0 %} {{ state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_today') }} {% else %} {% if now().month in [1, 2, 3] %} {% set price_day = 39.89/100 %} {% set price_night = 26.51/100 %} {% else %} {% set price_day = 48.55/100 %} {% set price_night = 35.18/100 %} {% endif %} {% set data = namespace(chargingpricehourly=[]) %} {% for item in chargingpricehourly %} {% if item.end <= item.end.replace(hour=6, minute=0, second=0) or item.start >= item.end.replace(hour=22, minute=0, second=0) %} {% set customer = ({"start":item.start.isoformat(),"end": item.end.isoformat(),"value":item.value + price_night }) %} {% set data.chargingpricehourly=data.chargingpricehourly + [customer] %} {% else %} {% set customer = ({"start":item.start.isoformat(),"end": item.end.isoformat(),"value":item.value + price_day }) %} {% set data.chargingpricehourly=data.chargingpricehourly + [customer] %} {% endif %} {% endfor %} {{ data.chargingpricehourly }} {% endif %} raw_today_priceadjusted_datetime: > {% set chargingpricehourly=state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_today') %} {% if chargingpricehourly | length == 0 %} {{ state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_today') }} {% else %} {% if now().month in [1, 2, 3] %} {% set price_day = 39.89/100 %} {% set price_night = 26.51/100 %} {% else %} {% set price_day = 48.55/100 %} {% set price_night = 35.18/100 %} {% endif %} {% set data = namespace(chargingpricehourly=[]) %} {% for item in chargingpricehourly %} {% if item.end <= item.end.replace(hour=6, minute=0, second=0) or item.start >= item.end.replace(hour=22, minute=0, second=0) %} {% set customer = ({"start":item.start,"end": item.end,"value":item.value + price_night }) %} {% set data.chargingpricehourly=data.chargingpricehourly + [customer] %} {% else %} {% set customer = ({"start":item.start,"end": item.end,"value":item.value + price_day }) %} {% set data.chargingpricehourly=data.chargingpricehourly + [customer] %} {% endif %} {% endfor %} {{ data.chargingpricehourly }} {% endif %} raw_tomorrow_priceadjusted: > {% set chargingpricehourly=state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_tomorrow') %} {% if chargingpricehourly | length == 0 %} {{ state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_tomorrow') }} {% else %} {% if now().month in [1, 2, 3] %} {% set price_day = 39.89/100 %} {% set price_night = 26.51/100 %} {% else %} {% set price_day = 48.55/100 %} {% set price_night = 35.18/100 %} {% endif %} {% set data = namespace(chargingpricehourly=[]) %} {% for item in chargingpricehourly %} {% if item.end <= item.end.replace(hour=6, minute=0, second=0) or item.start >= item.end.replace(hour=22, minute=0, second=0) %} {% set customer = ({"start":item.start.isoformat(),"end": item.end.isoformat(),"value":item.value + price_night }) %} {% set data.chargingpricehourly=data.chargingpricehourly + [customer] %} {% else %} {% set customer = ({"start":item.start.isoformat(),"end": item.end.isoformat(),"value":item.value + price_day }) %} {% set data.chargingpricehourly=data.chargingpricehourly + [customer] %} {% endif %} {% endfor %} {{ data.chargingpricehourly }} {% endif %} raw_cheapest_hours: > {% if now().month in [1, 2, 3] %} {% set price_day = 39.89/100 %} {% set price_night = 26.51/100 %} {% else %} {% set price_day = 48.55/100 %} {% set price_night = 35.18/100 %} {% endif %} {% set maxrange = (states('number.tesla_model_3_charge_limit')|int/100 * 570)|int %} {% set chargespeedkmh = ((states('input_number.charge_watt_max')|float-300) * (27/(10*1.732*230*1.1)))|int %} {% set nhoursmax = namespace(nhoursmax= 4) %} {% if states('sensor.tesla_model_3_range')|int > 0 and states('sensor.tesla_model_3_range')|int < maxrange %} {% set nhoursmax.nhoursmax = ((maxrange - states('sensor.tesla_model_3_range')|int)/chargespeedkmh)|round(0,'ceil') %} {% elif states('sensor.tesla_model_3_range')|int >= maxrange %} {% set nhoursmax.nhoursmax = 0 %} {% else %} {% set nhoursmax.nhoursmax = 4 %} {% endif %} {% if (state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_today')|length > 1 and state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_today')[0].value != None) %} {% if (state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_tomorrow')|length > 1 and state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_tomorrow')[0].value != None) %} {% if state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_tomorrow')[0].start != state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_today')[0].start %} {% set chargingpricehourly=state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_today')+state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_tomorrow') %} {% else %} {% set chargingpricehourly=state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_today') %} {% endif %} {% else %} {% set chargingpricehourly=state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_today') %} {% endif %} {% endif %} {% set data = namespace(chargingpricehourly=[]) %} {% for item in chargingpricehourly %} {% if item.end <= item.end.replace(hour=6, minute=0, second=0) or item.start >= item.end.replace(hour=22, minute=0, second=0) %} {% set customer = ({"start":item.start,"end": item.end,"value":item.value + price_night }) %} {% set data.chargingpricehourly=data.chargingpricehourly + [customer] %} {% else %} {% set customer = ({"start":item.start,"end": item.end,"value":item.value + price_day }) %} {% set data.chargingpricehourly=data.chargingpricehourly + [customer] %} {% endif %} {% endfor %} {% set chargingpricehourly=data.chargingpricehourly|sort(attribute='value')%} {% set chargefrom = namespace(chargefrom=now()) %} {% set chargeto = namespace(chargeto=now()) %} {% if now().hour < 8 %} {% set chargeto.chargeto = now().replace(hour=8,minute=0,second=0) %} {% endif %} {% if now().hour >= 8 %} {% set chargeto.chargeto = chargeto.chargeto + timedelta(days=1) %} {% set chargeto.chargeto = chargeto.chargeto.replace(hour=8,minute=0,second=0) %} {% endif %} {% if states('input_select.charge_deadline') == "Evening" %} {% if now().hour < 18 %} {% set chargeto.chargeto = now().replace(hour=18,minute=0,second=0) %} {% endif %} {% if now().hour >= 18 %} {% set chargeto.chargeto = chargeto.chargeto + timedelta(days=1) %} {% set chargeto.chargeto = chargeto.chargeto.replace(hour=18,minute=0,second=0) %} {% endif %} {% endif %} {% if states('input_select.charge_deadline') == "Unlimited" %} {% set chargeto.chargeto = chargeto.chargeto + timedelta(days=3) %} {% set chargeto.chargeto = chargeto.chargeto.replace(hour=18,minute=0,second=0) %} {% endif %} {% set data = namespace(list=[]) %} {% for item in chargingpricehourly %} {% if item.end >= chargefrom.chargefrom and item.end <= chargeto.chargeto and data.list|length < nhoursmax.nhoursmax %} {% set customer = ({"start":item.start|string|replace(" ","T"),"end": item.end|string|replace(" ","T"),"value":item.value}) %} {% set data.list=data.list + [customer] %} {% endif %} {% endfor %} {{data.list|sort(attribute='start')|to_json}} raw_leftover_hours_today: > {% if now().month in [1, 2, 3] %} {% set price_day = 39.89/100 %} {% set price_night = 26.51/100 %} {% else %} {% set price_day = 48.55/100 %} {% set price_night = 35.18/100 %} {% endif %} {% set maxrange = (states('number.tesla_model_3_charge_limit')|int/100 * 570)|int %} {% set chargespeedkmh = ((states('input_number.charge_watt_max')|float-300) * (27/(10*1.732*230*1.1)))|int %} {% set nhoursmax = namespace(nhoursmax= 4) %} {% if states('sensor.tesla_model_3_range')|int > 0 and states('sensor.tesla_model_3_range')|int < maxrange %} {% set nhoursmax.nhoursmax = ((maxrange - states('sensor.tesla_model_3_range')|int)/chargespeedkmh)|round(0,'ceil') %} {% elif states('sensor.tesla_model_3_range')|int >= maxrange %} {% set nhoursmax.nhoursmax = 0 %} {% else %} {% set nhoursmax.nhoursmax = 4 %} {% endif %} {% if (state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_today')|length > 1 and state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_today')[0].value != None) %} {% if (state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_tomorrow')|length > 1 and state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_tomorrow')[0].value != None) %} {% if state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_tomorrow')[0].start != state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_today')[0].start %} {% set chargingpricehourly=state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_today')+state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_tomorrow') %} {% set chargingpricehourlytoday=state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_today') %} {% set chargingpricehourlytomorrow=state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_tomorrow') %} {% else %} {% set chargingpricehourly=state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_today') %} {% set chargingpricehourlytoday=state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_today') %} {% set chargingpricehourlytomorrow=[] %} {% endif %} {% else %} {% set chargingpricehourly=state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_today') %} {% set chargingpricehourlytoday=state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_today') %} {% set chargingpricehourlytomorrow=[] %} {% endif %} {% endif %} {% set data = namespace(chargingpricehourly=[]) %} {% for item in chargingpricehourly %} {% if item.end <= item.end.replace(hour=6, minute=0, second=0) or item.start >= item.end.replace(hour=22, minute=0, second=0) %} {% set customer = ({"start":item.start,"end": item.end,"value":item.value + price_night }) %} {% set data.chargingpricehourly=data.chargingpricehourly + [customer] %} {% else %} {% set customer = ({"start":item.start,"end": item.end,"value":item.value + price_day }) %} {% set data.chargingpricehourly=data.chargingpricehourly + [customer] %} {% endif %} {% endfor %} {% set chargingpricehourly=data.chargingpricehourly|sort(attribute='value')%} {% set data = namespace(chargingpricehourlytoday=[]) %} {% for item in chargingpricehourlytoday %} {% if item.end <= item.end.replace(hour=6, minute=0, second=0) or item.start >= item.end.replace(hour=22, minute=0, second=0) %} {% set customer = ({"start":item.start,"end": item.end,"value":item.value + price_night }) %} {% set data.chargingpricehourlytoday=data.chargingpricehourlytoday + [customer] %} {% else %} {% set customer = ({"start":item.start,"end": item.end,"value":item.value + price_day }) %} {% set data.chargingpricehourlytoday=data.chargingpricehourlytoday + [customer] %} {% endif %} {% endfor %} {% set chargingpricehourlytoday=data.chargingpricehourlytoday%} {% set data = namespace(chargingpricehourlytomorrow=[]) %} {% for item in chargingpricehourlytomorrow %} {% if item.end <= item.end.replace(hour=6, minute=0, second=0) or item.start >= item.end.replace(hour=22, minute=0, second=0) %} {% set customer = ({"start":item.start,"end": item.end,"value":item.value + price_night }) %} {% set data.chargingpricehourlytomorrow=data.chargingpricehourlytomorrow + [customer] %} {% else %} {% set customer = ({"start":item.start,"end": item.end,"value":item.value + price_day }) %} {% set data.chargingpricehourlytomorrow=data.chargingpricehourlytomorrow + [customer] %} {% endif %} {% endfor %} {% set chargingpricehourlytomorrow=data.chargingpricehourlytomorrow%} {% set chargefrom = namespace(chargefrom=now()) %} {% set chargeto = namespace(chargeto=now()) %} {% if now().hour < 8 %} {% set chargeto.chargeto = now().replace(hour=8,minute=0,second=0) %} {% endif %} {% if now().hour >= 8 %} {% set chargeto.chargeto = chargeto.chargeto + timedelta(days=1) %} {% set chargeto.chargeto = chargeto.chargeto.replace(hour=8,minute=0,second=0) %} {% endif %} {% if states('input_select.charge_deadline') == "Evening" %} {% if now().hour < 18 %} {% set chargeto.chargeto = now().replace(hour=18,minute=0,second=0) %} {% endif %} {% if now().hour >= 18 %} {% set chargeto.chargeto = chargeto.chargeto + timedelta(days=1) %} {% set chargeto.chargeto = chargeto.chargeto.replace(hour=18,minute=0,second=0) %} {% endif %} {% endif %} {% if states('input_select.charge_deadline') == "Unlimited" %} {% set chargeto.chargeto = chargeto.chargeto + timedelta(days=3) %} {% set chargeto.chargeto = chargeto.chargeto.replace(hour=18,minute=0,second=0) %} {% endif %} {% set data = namespace(list=[],listto=[]) %} {% for item in chargingpricehourly %} {% if item.end >= chargefrom.chargefrom and item.end <= chargeto.chargeto and data.list|length < nhoursmax.nhoursmax %} {% set customer = ({"start":item.start|string|replace(" ","T"),"end": item.end|string|replace(" ","T"),"value":item.value}) %} {% set data.list=data.list + [customer] %} {% endif %} {% endfor %} {% for item in chargingpricehourlytoday %} {% set customer = ({"start":item.start|string|replace(" ","T"),"end": item.end|string|replace(" ","T"),"value":item.value}) %} {% if customer not in data.list %} {% set data.listto=data.listto + [customer] %} {% endif %} {% endfor %} {{data.listto|sort(attribute='start')|to_json}} raw_leftover_hours_tomorrow: > {% if now().month in [1, 2, 3] %} {% set price_day = 39.89/100 %} {% set price_night = 26.51/100 %} {% else %} {% set price_day = 48.55/100 %} {% set price_night = 35.18/100 %} {% endif %} {% set maxrange = (states('number.tesla_model_3_charge_limit')|int/100 * 570)|int %} {% set chargespeedkmh = ((states('input_number.charge_watt_max')|float-300) * (27/(10*1.732*230*1.1)))|int %} {% set nhoursmax = namespace(nhoursmax= 4) %} {% if states('sensor.tesla_model_3_range')|int > 0 and states('sensor.tesla_model_3_range')|int < maxrange %} {% set nhoursmax.nhoursmax = ((maxrange - states('sensor.tesla_model_3_range')|int)/chargespeedkmh)|round(0,'ceil') %} {% elif states('sensor.tesla_model_3_range')|int >= maxrange %} {% set nhoursmax.nhoursmax = 0 %} {% else %} {% set nhoursmax.nhoursmax = 4 %} {% endif %} {% if (state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_today')|length > 1 and state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_today')[0].value != None) %} {% if (state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_tomorrow')|length > 1 and state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_tomorrow')[0].value != None) %} {% if state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_tomorrow')[0].start != state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_today')[0].start %} {% set chargingpricehourly=state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_today')+state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_tomorrow') %} {% set chargingpricehourlytoday=state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_today') %} {% set chargingpricehourlytomorrow=state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_tomorrow') %} {% else %} {% set chargingpricehourly=state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_today') %} {% set chargingpricehourlytoday=state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_today') %} {% set chargingpricehourlytomorrow=[] %} {% endif %} {% else %} {% set chargingpricehourly=state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_today') %} {% set chargingpricehourlytoday=state_attr('sensor.nordpool_kwh_no3_nok_2_095_025', 'raw_today') %} {% set chargingpricehourlytomorrow=[] %} {% endif %} {% endif %} {% set data = namespace(chargingpricehourly=[]) %} {% for item in chargingpricehourly %} {% if item.end <= item.end.replace(hour=6, minute=0, second=0) or item.start >= item.end.replace(hour=22, minute=0, second=0) %} {% set customer = ({"start":item.start,"end": item.end,"value":item.value + price_night }) %} {% set data.chargingpricehourly=data.chargingpricehourly + [customer] %} {% else %} {% set customer = ({"start":item.start,"end": item.end,"value":item.value + price_day }) %} {% set data.chargingpricehourly=data.chargingpricehourly + [customer] %} {% endif %} {% endfor %} {% set chargingpricehourly=data.chargingpricehourly|sort(attribute='value')%} {% set data = namespace(chargingpricehourlytoday=[]) %} {% for item in chargingpricehourlytoday %} {% if item.end <= item.end.replace(hour=6, minute=0, second=0) or item.start >= item.end.replace(hour=22, minute=0, second=0) %} {% set customer = ({"start":item.start,"end": item.end,"value":item.value + price_night }) %} {% set data.chargingpricehourlytoday=data.chargingpricehourlytoday + [customer] %} {% else %} {% set customer = ({"start":item.start,"end": item.end,"value":item.value + price_day }) %} {% set data.chargingpricehourlytoday=data.chargingpricehourlytoday + [customer] %} {% endif %} {% endfor %} {% set chargingpricehourlytoday=data.chargingpricehourlytoday%} {% set data = namespace(chargingpricehourlytomorrow=[]) %} {% for item in chargingpricehourlytomorrow %} {% if item.end <= item.end.replace(hour=6, minute=0, second=0) or item.start >= item.end.replace(hour=22, minute=0, second=0) %} {% set customer = ({"start":item.start,"end": item.end,"value":item.value + price_night }) %} {% set data.chargingpricehourlytomorrow=data.chargingpricehourlytomorrow + [customer] %} {% else %} {% set customer = ({"start":item.start,"end": item.end,"value":item.value + price_day }) %} {% set data.chargingpricehourlytomorrow=data.chargingpricehourlytomorrow + [customer] %} {% endif %} {% endfor %} {% set chargingpricehourlytomorrow=data.chargingpricehourlytomorrow%} {% set chargefrom = namespace(chargefrom=now()) %} {% set chargeto = namespace(chargeto=now()) %} {% if now().hour < 8 %} {% set chargeto.chargeto = now().replace(hour=8,minute=0,second=0) %} {% endif %} {% if now().hour >= 8 %} {% set chargeto.chargeto = chargeto.chargeto + timedelta(days=1) %} {% set chargeto.chargeto = chargeto.chargeto.replace(hour=8,minute=0,second=0) %} {% endif %} {% if states('input_select.charge_deadline') == "Evening" %} {% if now().hour < 18 %} {% set chargeto.chargeto = now().replace(hour=18,minute=0,second=0) %} {% endif %} {% if now().hour >= 18 %} {% set chargeto.chargeto = chargeto.chargeto + timedelta(days=1) %} {% set chargeto.chargeto = chargeto.chargeto.replace(hour=18,minute=0,second=0) %} {% endif %} {% endif %} {% if states('input_select.charge_deadline') == "Unlimited" %} {% set chargeto.chargeto = chargeto.chargeto + timedelta(days=3) %} {% set chargeto.chargeto = chargeto.chargeto.replace(hour=18,minute=0,second=0) %} {% endif %} {% set data = namespace(list=[],listto=[]) %} {% for item in chargingpricehourly %} {% if item.end >= chargefrom.chargefrom and item.end <= chargeto.chargeto and data.list|length < nhoursmax.nhoursmax %} {% set customer = ({"start":item.start|string|replace(" ","T"),"end": item.end|string|replace(" ","T"),"value":item.value}) %} {% set data.list=data.list + [customer] %} {% endif %} {% endfor %} {% for item in chargingpricehourlytomorrow %} {% set customer = ({"start":item.start|string|replace(" ","T"),"end": item.end|string|replace(" ","T"),"value":item.value}) %} {% if customer not in data.list %} {% set data.listto=data.listto + [customer] %} {% endif %} {% endfor %} {{data.listto|sort(attribute='start')|to_json}}  Siter
strutings Skrevet 23. februar Skrevet 23. februar Takk for deling đ Sliter fortsatt med at grafen fyller opp mellom de billigste timene. Sensor fungerer, sĂ„ det er ikke noe feil med den. Er et hav av konfig-muligheter pĂ„ apexgraph, sĂ„ blir litt svett Siter
Anbefalte innlegg
Bli med i samtalen
Du kan publisere innhold nÄ og registrere deg senere. Hvis du har en konto, logg inn nÄ for Ä poste med kontoen din.