• Para evitar SPAM as primeiras publicações de cada usuário são moderadas e portanto podem demorar algumas horas até serem liberadas para visualização por outros usuários

  • Após efetuar o cadastro no fórum você DEVE CLICAR no LINK enviado por E-MAIL para ativar a conta, verifique na sua pasta de SPAM caso não encontre a mensagem .




Integração de recarga e sistema solar

Avatar do usuário
ivanfm
Mensagens: 1732
Registrado em: Qua Abr 18, 2018 12:41 pm
Possui Veiculo Elétrico: Sim
Veiculo(s): Bolt / XC40 P6

Integração de recarga e sistema solar

Mensagem por ivanfm »

  • Depois que coloquei um carregador fixo e conectado em casa fiz a integração com o sistema solar para recarga
  • A forma de fazer essa integração vai depender do carregador que você possui e seu sistema de controle
  • Utilizei a integração do HomeAssistant com a API JuiceBox
  • Aprendi que alguns veículos tratam melhor o ajuste de limite de corrente do que outros
    • o Bolt quando conectado em um carregador que indica correntes de até 10A assume que esse carregador é um carregador de baixa potencia e não aceita quando o carregador indica que pode fornecer corrente maior
    • Por isso sempre deixo a corrente minima para inicio de carga como 12A
  • Configuração do Home Assistant para receber novos limites e passar para API Juicenet

    Código: Selecionar todos

    # Recebe comando via mqtt e atualiza definicao do juicebox
    - id: ajuste_limite_juicebox
      alias: "Ajuste limite JuiceBox"
      trigger: 
        platform: mqtt
        topic: /juicenet_q12l12/setLimit
      action:
        service: python_script.juicenet_limit
        data: 
          entity_id: 'number.juicenet_q12l12_amperage_limit'
          trigger: '{{ trigger }}'
          payload: '{{ trigger.payload }}'
  • Script que faz a chamada no formato correto e dentro dos limites, se fizer a chamada com valores fora do limite a integração para de funcionar corretamente

    Código: Selecionar todos

    payload = data.get('payload')
    entity = data.get('entity_id')
    oldStateObj = hass.states.get(entity)
    newValue = int(payload)
    if 'min' in oldStateObj.attributes:
       newValue = max(oldStateObj.attributes['min'], newValue)
    if 'max' in oldStateObj.attributes:
       newValue = min(oldStateObj.attributes['max'], newValue)
    data = { "entity_id" : entity, "value" : int(newValue) }
    hass.services.call("number","set_value", data , False)
  • A parte que define o tratamento ficou simples, mas depende de cada ambiente portanto não vou colocar o código aqui, mas explicar o que é feito

    • A cada 3 minutos (isso dá tempo para estabilizar o sistema)
      • Se não está carregando coloco limite de carga para 12A
      • Se esta carregando
        • se está injetando energia na rede mando aumentar a corrente limite de carga pelo numero que esta injetando (se passar do permitido o script do homeassistant controla)
        • se está consumindo da rede, mando reduzir a corrente limite de carga do numero que está recebendo
      • Dessa forma o processo de carga tenta utilizar o máximo possível de energia solar durante a carga, tenho uma configuração de valor minimo, dessa forma posso garantir a recarga sempre, normalmente deixo em 6A mas quando preciso de uma carga mais rápida só preciso ajustar esse limite inferior

Tags:
Avatar do usuário
ivanfm
Mensagens: 1732
Registrado em: Qua Abr 18, 2018 12:41 pm
Possui Veiculo Elétrico: Sim
Veiculo(s): Bolt / XC40 P6

Re: Integração de recarga e sistema solar

Mensagem por ivanfm »

Estou migrando totalmente o sistema de controle do carregador para o home assistant então aqui vou colocar como está ficando (atualmente já estou utilizando isso por pelo menos 1 mês) :

  • Um critério que mudei em relação a versão inicial foi a corrente limite de standby

    • agora deixo com valor igual ao máximo pois minha instalação suporta e se perder a conectividade com o carregador ele vai ficar oferecer uma possibilidade de carga mais rápida e posso ajustar pelo limite do carro
  • Para não ficar carregando a noite quando não preciso da carga rapidamente ajusto o temporizador do carro para carregar somente durante o dia

    • assim posso utilizar mais do período de geração solar
    • o carregador que utilizo não tem opção de pausar a recarga via API utilizada no homeassistant
  • Um sensor template que calcula a corrente que pode ser disponibilizada ou reduzida do carregador

    Código: Selecionar todos

    - sensor:
      - name: "Corrente Disponivel EVSE"
        unique_id: evse_available_amps
    # O meu medidor somente mostra sinal na potencia em watts
    # o carregador esta ligado entre as fases 1 e 2
    # Entao determina quando pode ajustar pela fase que tem menor "folga" a que vai ter potencia maior
    # A tensao pode variar mas utiliza aqui um valor fixo como referencia para facilitar
    # Se a potencia for positiva significa que nao tem folga entao a corrente disponivel fica negativa
    # Se a potencia for negativa significa que tem folga e a corrente disponivel fica positiva
        state: >-
          {%- set watts = max(states.sensor.fase_1_quadro_entrada.state | int,states.sensor.fase_2_quadro_entrada.state | int) -%}
          {%- set amps = (watts / -127) -%}
          {{- amps -}}
  • Automação

    Código: Selecionar todos

    alias: EVSE - Controle de Corrente
    description: >-
      A cada 3 minutos para não ficar alterando muito e dar tempo para estabilizar
      as mudanças maiores
    
    
      Alem do delay entre os dados medidos (medidor de energia, carregador) existem
      variações constantes no consumo da casa (maquina de lavar, secar, forno entre
      outros equipamentos)
    
    
      45 segundos para dar tempo de receber as atualizações dos medidores de energia
      que atualiza até uns 20 segundos
    
    
      Se o carro ficar muito tempo com plugged significa que provavelmente terminou
      a carga entao considera como standby para retornar a corrente padrao
    
    
      Isso é útil no caso do juicebox que frequentemente tem perdido a conexao com
      os servidores, dessa forma vai tentar deixar com corrente de standby para o
      próximo  uso com corrente maxima mesmo que não retorne a conexão
    trigger:
      - platform: time_pattern
        seconds: "45"
        minutes: /3
      - platform: state
        entity_id:
          - input_number.cfg_evse_maximo
          - input_number.cfg_evse_standby
          - input_number.cfg_evse_minimo
        for:
          hours: 0
          minutes: 0
          seconds: 30
    condition: []
    action:
      - service: python_script.evse_control_limits
        metadata: {}
        data:
          minCurrent: "{{ states('input_number.cfg_evse_minimo') }}"
          maxCurrent: "{{ states('input_number.cfg_evse_maximo') }}"
          standbyCurrent: "{{ states('input_number.cfg_evse_standby') }}"
          availableCurrent: "{{ states('sensor.corrente_disponivel_evse') }}"
          chargingState: >-
            {{ 'standby' if
            (is_state('sensor.juicenet_q12l12_charging_status','plugged')) and
            (now() > (states.sensor.juicenet_q12l12_charging_status.last_changed +
            timedelta(hours=1)))  else
            states('sensor.juicenet_q12l12_charging_status') }}
          chargingCurrent: "{{ states('sensor.juicenet_q12l12_amps') }}"
          chargingTime: "{{ states('sensor.juicenet_q12l12_charge_time') }}"
          limitEntity: number.juicenet_q12l12_amperage_limit
          debug: 0
    mode: single
  • Script que segue a lógica já indicada anteriormente

    Código: Selecionar todos

    #
    # Configuration Parameters
    #  minCurrent           - minimum Current (default 6)
    #  maxCurrent           - maximum Current (default 32)
    #  standbyCurrent       - standby Current (default 12) 
    #                         Bolt with not allow to go over 10A if started with less than 11A
    #  minChargingTime      - minimum ChargingTime (seconds) to make adjusts (default 180)
    #
    #
    # Control Parameters
    #  availableCurrent     - available Current (positive can use more, negative reduce from charging)
    #
    #
    # EVSE - Parameters
    #  chargingState        - current EVSE state ('charging' and 'standby' considered)
    #  chargingTime         - charging time in seconds
    #  chargingCurrent      - current being used
    #  limitEntity          - entity that controls de current limit
    #
    
    def get_or_default(name, defaultValue):
        value = data.get(name)
        if value is None:
            return defaultValue
        return value
        
    minCurrent = int(get_or_default('minCurrent', 6))
    maxCurrent = int(get_or_default('maxCurrent', 32))
    standbyCurrent = int(get_or_default('standbyCurrent', 12))
    availableCurrent = float(get_or_default('availableCurrent', 0))
    minChargingTime = int(get_or_default('minChargingTime', 180))
    #
    chargingState = get_or_default('chargingState', 'standby')
    chargingTime = int(get_or_default('chargingTime', 0))
    chargingCurrent = float(get_or_default('chargingCurrent', 0))
    limitEntity = get_or_default('limitEntity', '')
    
    
    stateObject = hass.states.get(limitEntity)
    currentLimit = int(stateObject.state)
    if (chargingState == 'standby'):
        newLimit = standbyCurrent
    elif (chargingState == 'charging'):
        if (chargingTime > minChargingTime):
            newLimit = chargingCurrent + availableCurrent
    else:
        newLimit = currentLimit
    
    # Apply configured limits
    newLimit = min( max(minCurrent, newLimit), maxCurrent)
    
    if int(get_or_default('debug', 0)) > 0:
        logger.error(data)
        logger.error("state = " + chargingState + "current=" + str(chargingCurrent) + " currentLimit = " + str(currentLimit) + " newLimit = " + str(newLimit))    
        logger.error(stateObject)
    
    if (newLimit != 0) and (newLimit != currentLimit):
        # if entity has limits apply this limits also
        tmpLimit = newLimit
        if 'min' in stateObject.attributes:
            tmpLimit = max(stateObject.attributes['min'], tmpLimit)
        if 'max' in stateObject.attributes:
            tmpLimit = min(stateObject.attributes['max'], tmpLimit)
        if (tmpLimit != currentLimit):
            serviceData = { "entity_id" : limitEntity, "value" : int(tmpLimit) }
            hass.services.call("number","set_value", serviceData , False)
        else:
            logger.info("Limit not changed because of entity limits : newLimit=" + str(newLimit) + " " + str(stateObject))
  • exemplo de corrente em comparação com a potência gerada pelo sistema solar em um dia nublado com várias nuvens
    • é importante lembrar também que existem outros equipamentos no imóvel sendo utilizados e com isso a variação da corrente não acompanha totalmente a geração solar
Screenshot_2024-01-29_16-39-20.jpg
Screenshot_2024-01-29_16-39-20.jpg (23.44 KiB) Exibido 54 vezes
Avatar do usuário
ivanfm
Mensagens: 1732
Registrado em: Qua Abr 18, 2018 12:41 pm
Possui Veiculo Elétrico: Sim
Veiculo(s): Bolt / XC40 P6

Re: Integração de recarga e sistema solar

Mensagem por ivanfm »

Responder

Voltar para “Carregadores”