Cálculo / estimativa de luminosidade exterior (com e sem produção fotovoltaica)

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 }}

image
image

No limite até podem usar uma média dos 2 - a imaginação, baseada na observação, é o limite. :slight_smile:
Boas automações!

3 Curtiram

Olá @FragMenthor . Muito boa ideia utilizar os painéis para ter uma um media do LUX. Esta de parabéns.

Duas duvidas:
Porque limitou os LUX a 10000? Pelo calculo do template pode ter até 20000 e andei a procura aqui e 20000 é um valor aceitável em um dia de sol. No Wikipédia tem a seguinte informação " 10,000–25,000 em dia ensolarado (sem luz solar directa)" com isso até mudei o calculo para 0.4 o que da um valor máximo de 25000.

E os seus painéis estão 100% orientados a sul? Os meus estão a sudoeste (200º de Azimuth) e assim imagino, pelo que vejo na minha produção solar, que pela manhã vão dar valores mais baixos que o real. Configurei isso aqui hoje e vamos ver…

1 Curtiu

Boas! Boa pergunta. De facto não fiz pesquisa (falha minha!), e baseei-me no sensor de estimativa que já tinha ( o “iluminancia_exterior_estimada”, que tinha um valor máximo de 10000. Como já usava há uns tempos, decidi limitar este também a esses valores; de facto o que me interessa mesmo são os valores baixos, e a tua abordagem provavelmente está mais correcta. Quanto aos meus painéis, tenho 4 virados a SO e 2 virados a NE, foi o “possível”, mas provavelmente vou alterar a posícão dos NE mais para a frente. Neste momento tenho sensibilidade (produção) logo quase a seguir ao nascer do sol, até ao pôr do sol, por isso este sensor para mim é brutal; Consigo até fazer diferenciação entre divisões pela hora do dia, consoante se as divisões estão mais a poente ou nascente. Fenomenal, para mim.


Copyright © 2017-2021. Todos os direitos reservados
CPHA.pt - info@cpha.pt


FAQ | Termos de Serviço/Regras | Política de Privacidade