Uso de produção solar para estimativa de luminosidade exterior
O objectivo deste post será dar um exemplo de que podemos dar uso a algo que já podemos ter, para conseguir algo quer não temos.
E para que serve isto?
- Para teres um exemplo de que podes usar coisas que tens para estimar / calcular outras que não tens.
- Neste caso específico: Para teres mais um sensor que podes usar nas tuas automações, por exemplo de luzes: no meu caso eu tenho automações, associadas a sensores, a ligar luzes em determinadas horas (normalmente entre o nascer do sol menos 1 hora e o pôr do sol mais uma hora); no entanto, nos dias mais nublados acho útil também ter em conta, fora desse horário, a luminosidade exterior. Ora, se tenho painéis solares a produzir energia, a quantidade de energia obviamente é quase directamente proporcional à luminosidade externa, e é isso que quero aproveitar. Eu fiz o sensor adaptado ao meu caso, e bate mais ou menos certo com outro sensor que já tinha em template, mas muito mais simplificado, eficaz e preciso. Uso para ligar as luzes em determinadas divisões caso a luminosidade calculada esteja abaixo de 2000, ou 1500 (depende, no meu caso, das divisões, e claro que ajustei às minhas condições).
Para adaptares estes sensores ao teu caso tens de substituir só 1 entidade e alterar 1 valor:
- Sensor de produção actual (W) = sensor.paineis_fotovoltaicos_power
- Produção máxima da tua unidade (W) = 1750
- O factor de multiplicação de ‘0.5’ no template, foi um valor a que eu cheguei para ter um valor semelhante a outro sensor que usava antes (que não é de minha autoria) - podes adaptar ao teu caso.
Os meus sensores:
sensor:
- platform: filter
name: "Painéis Fotovoltaicos - Power (Filtrado)"
entity_id: sensor.paineis_fotovoltaicos_power
filters:
- filter: time_simple_moving_average
window_size: "00:00:30"
precision: 2
- filter: lowpass
time_constant: 10
precision: 0
- platform: template
sensors:
iluminancia_exterior_calculada:
friendly_name: "Iluminância Exterior Calculada"
unit_of_measurement: 'lx'
value_template: >
{% set solar_max_power = 1750 %}
{% set producao_filtrada_power = states('sensor.paineis_fotovoltaicos_power_filtrado')|int(0) %}
{% set luminosidade_estimada = (producao_filtrada_power / (solar_max_power * 0.5) * 10000)|round(0) %}
{% if luminosidade_estimada > 10000 %}
10000
{% else %}
{{ luminosidade_estimada }}
{% endif %}
O sensor que antes tinha (que não fui eu que fiz), também válido para quem não tem a maneira anterior de calcular (não tem produção solar), baseia-se numa entidade de ‘weather’ e usa a posição do sol em conjunto com as condições atmosféricas para estimar o valor (neste caso tens de alterar as entidades a seguir a {#- SENSORES DE WEATHER #}):
sensor:
- platform: template
sensors:
iluminancia_exterior_estimada:
friendly_name: Iluminância Exterior Estimada
icon_template: mdi:brightness-auto
device_class: illuminance
unit_of_measurement: lx
attribute_templates:
current_condition: |
{%- set factors = namespace(current_condition='') %}
{#- SENSORES DE WEATHER #}
{%- set weather_sensors = [
"weather.casa_da_soeira",
"sensor.openweathermap_condition"
] %}
{%- for sensor in weather_sensors if states(sensor) != "unknown" and factors.current_condition == "" %}
{%- set factors.current_condition = states(sensor) %}
{%- endfor %}
{%- set current_condition = factors.current_condition|lower|replace("partly cloudy w/ ","")|replace("mostly cloudy w/ ","")|replace("freezing","")|replace("and","")|replace("-", " ")|replace("_", " ")|replace("(","")|replace(")","")|replace(" ", "") %}
{{ current_condition }}
condition_factor: |
{% set factors = namespace(condition='') %}
{% set current_condition = state_attr("sensor.outdoor_illuminance","current_condition") %}
{%- set condition_factors = {
"10000": ("clear", "clearnight", "sunny", "windy", "exceptional"),
"7500": ("partlycloudy", "partlysunny", "mostlysunny", "mostlyclear", "hazy", "hazysunshine", "intermittentclouds"),
"2500": ("cloudy", "mostlycloudy"),
"1000": ("fog", "rainy", "showers", "pouring", "snowy", "snowyheavy", "snowyrainy", "flurries", "chanceflurries", "chancerain", "chancesleet", "drearyovercast", "sleet"),
"200": ("hail", "lightning", "tstorms")
} %}
{%- for factor in condition_factors if current_condition in condition_factors[factor] %}
{%- set factors.condition = factor %}
{%- endfor %}
{{ factors.condition }}
sun_factor: |
{% set factors = namespace(sun='') %}
{%- set right_now = now() | as_timestamp %}
{%- set sunrise = states("sensor.sunrise") | as_timestamp %}
{%- set sunrise_begin = states("sensor.dawn") | as_timestamp %}
{%- set sunrise_end = sunrise + (40 * 60) %}
{%- set sunset = states("sensor.sunset") | as_timestamp %}
{%- set sunset_begin = sunset - (40 * 60) %}
{%- set sunset_end = states("sensor.dusk") | as_timestamp %}
{%- if sunrise_end < right_now and right_now < sunset_begin %}
{%- set factors.sun = 1 %}
{%- elif sunset_end < right_now or right_now < sunrise_begin %}
{%- set factors.sun = 0 %}
{%- elif right_now <= sunrise_end %}
{%- set factors.sun = (right_now - sunrise_begin) / (60*60) %}
{%- else %}
{%- set factors.sun = (sunset_end - right_now) / (60*60) %}
{%- endif %}
{%- set factors.sun = 1 if factors.sun > 1 else factors.sun %}
{{ factors.sun }}
value_template: |
{%- set sun_factor = state_attr("sensor.outdoor_illuminance","sun_factor") %}
{%- set condition_factor = state_attr("sensor.outdoor_illuminance","condition_factor") %}
{%- set illuminance = (sun_factor|float(default=0) * condition_factor|float(default=0)) | round %}
{%- set illuminance = 10 if illuminance < 10 else illuminance %}
{{ illuminance }}
No limite até podem usar uma média dos 2 - a imaginação, baseada na observação, é o limite.
Boas automações!