Pesar Botijão de Gás 13Kg (P13) usando Esphome

Olá Pessoal,

Para quem não conhece temos um grupo no Telegram, que acabam compartilhando muitos projetos por lá, e para não ficarem perdidos vou passar eles para o forum.

Este projeto foi desenvolvido pelo José (@jhbcosta) e compartilhado no grupo do telegram, e o Drikos (@Drikos) recentemente compartilhou o seu código. Obrigado por compartilharem os projetos, segue o material compartilhado no grupo:

Do que vai precisar:
Placa Nodecum
nodecum
2 Celulas de Carga são suficientes para botijão de P13, mas também pode usar 4 celulas de 50Kg:
celula

Base para pesar botijão
Vai precisar fixar as 2 ou 4 ceulas de carga em uma base, segue alguns modelos:


Base do José

Base do Lima

Base do Elton

Com a base pronta, o esquema de ligação:


*Na imagem da ligação é um arduino, mas ira fazer as ligações na placa Nodecum:
dout -> Porta: D1 no Nodecum
sck -> Porta: D2 no Nodecum
GND -> Porta GND no Nodecum
5v -> Porta VIN no Nodecum

O código para subir no Esphome:
esphome:
name: botijao_gas
platform: ESP8266
board: nodemcuv2

wifi:
  ssid: "id"
  password: "pass"

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Botijao Gas Fallback Hotspot"
    password: "pass"

captive_portal:

# Enable logging
logger:

# Enable Home Assistant API
api:

ota:

sensor:
  - platform: hx711
    name: "Botijão de Gás"
    dout_pin: D1
    clk_pin: D2
    gain: 128
    icon: 'mdi:scale'
    update_interval: 60s
    accuracy_decimals: 2
    filters:
      - calibrate_linear:
        - 527924  -> 0
        - 554807  -> 1
    unit_of_measurement: kg

Calibrar a balança:
Modificar no código a parte do calibrate_linear, onde está 527924 colocar o valor da tara, no caso o valor que sua balança estiver lendo sem nada em cima. E onde está 554807, substituir pelo valor de quando colocar um objeto de 1 kg sobre a balança

Código para integrar balança no HA:
#------------------Imput text----------------------------------------#

  inserir_preco_gas:
    name: R$ Botijão de Gás
    max: 6
    icon: mdi:cash-multiple  
  tara_botijao_vazio_gas:
    name: Tara do Botijão
    max: 6
    icon: mdi:weight-kilogram

#------------------Imput number----------------------------------------#

  gas_gasto_ontem:
    name: Gasto de Gás ontem
    icon: mdi:gas-cylinder
    unit_of_measurement: kg
    min: 0
    max: 100
    step: 0.01
    mode: slider 
  gas_inicial_para_calculo_hoje:
    name: Gás Inicial para Calculo hoje
    icon: mdi:gas-cylinder
    unit_of_measurement: kg
    min: 0
    max: 100
    step: 0.01
    mode: slider 
  gas_gasto_semana_anterior:
    name: Gasto de Gás Semana Anterior
    icon: mdi:gas-cylinder
    unit_of_measurement: kg
    min: 0
    max: 100
    step: 0.01
    mode: slider         
  gas_gasto_semana_atual:
    name: Gasto de Gás Semana Atual
    icon: mdi:gas-cylinder
    unit_of_measurement: kg
    min: 0
    max: 100
    step: 0.01
    mode: slider  
  gas_gasto_mes_anterior:
    name: Gasto de Gás Mês Anterior
    icon: mdi:gas-cylinder
    unit_of_measurement: kg
    min: 0
    max: 100
    step: 0.01
    mode: slider          
  gas_gasto_mes_atual:
    name: Gasto de Gás Mês Atual
    icon: mdi:gas-cylinder
    unit_of_measurement: kg
    min: 0
    max: 100
    step: 0.01
    mode: slider 

#------------------Sensor----------------------------------------#

#-------Gasto de Gás em kilos--------------------------------------------------------------#

# Template do Sensor do botijão de Gás
  - platform: template
    sensors:
      peso_somente_do_gas:
        friendly_name: "Peso Somente do Gás do Botijão"
        value_template: "{{ (states('sensor.botijao_de_gas')|float - states('input_text.tara_botijao_vazio_gas')|float) | round(3) }}"
        icon_template: mdi:gas-cylinder
        unit_of_measurement: "kg"

#Template de Consumo do Gás Ontem. 
  - platform: template
    sensors:
      consumo_gas_ontem:
        friendly_name: "Consumo do Gás Ontem"
        value_template: "{{ states('input_number.gas_gasto_ontem') }}"
        icon_template: mdi:gas-cylinder
        unit_of_measurement: "kg"

#Template de Consumo do Gás Hoje. 
  - platform: template
    sensors:
      consumo_gas_hoje:
        friendly_name: "Consumo do Gás Hoje"
        value_template: "{{ (states('input_number.gas_inicial_para_calculo_hoje')|float - states('sensor.peso_somente_do_gas')|float) | round(2) }}"
        icon_template: mdi:gas-cylinder
        unit_of_measurement: "kg"

#Template de Consumo do Gás Semana Anterior. 
  - platform: template
    sensors:
      consumo_gas_semana_anterior:
        friendly_name: "Consumo do Gás Semana Anterior"
        value_template: "{{ states('input_number.gas_gasto_semana_anterior') }}"
        icon_template: mdi:gas-cylinder
        unit_of_measurement: "kg"

#Template de Consumo do Gás Semana Atual. 
  - platform: template
    sensors:
      consumo_gas_semana_atual:
        friendly_name: "Consumo do Gás Semana Atual"
        value_template: "{{ (states('input_number.gas_gasto_semana_atual')|float - states('sensor.peso_somente_do_gas')|float) | round(2) }}"
        icon_template: mdi:gas-cylinder
        unit_of_measurement: "kg"

#Template de Consumo do Gás Mês Anterior. 
  - platform: template
    sensors:
      consumo_gas_mes_anterior:
        friendly_name: "Consumo do Gás Mês Anterior"
        value_template: "{{ states('input_number.gas_gasto_mes_anterior') }}"
        icon_template: mdi:gas-cylinder
        unit_of_measurement: "kg" 

#Template de Consumo do Gás Mensal. 
  - platform: template
    sensors:
      consumo_gas_mes_atual:
        friendly_name: "Consumo do Gás Mês Atual"
        value_template: "{{ (states('input_number.gas_gasto_mes_atual')|float - states('sensor.peso_somente_do_gas')|float) | round(2) }}"
        icon_template: mdi:gas-cylinder
        unit_of_measurement: "kg"

#-------R$ Gasto de Gás em valores monetarios R$--------------------------------------------------------------#

#Template de Preço do Gás por Grama. 
  - platform: template
    sensors:
      preco_gas_por_grama:
        friendly_name: "R$ Gás por Kilo"
        value_template: "{{ (states('input_text.inserir_preco_gas')|float / 13.000) | round(2) }}"
        icon_template: mdi:gas-cylinder
        unit_of_measurement: "Reais"

#Template de R$ do Gás Ontem. 
  - platform: template
    sensors:
      consumo_gas_ontem_valores:
        friendly_name: "R$ do Gás Ontem"
        value_template: "{{ 'R$%.2f'|format (float(states('sensor.consumo_gas_ontem')|float * states('sensor.preco_gas_por_grama')|float)) | round(3) }}"
        icon_template: mdi:gas-cylinder

#Template de Consumo do Gás Hoje. 
  - platform: template
    sensors:
      consumo_gas_hoje_valores:
        friendly_name: "R$ do Gás Hoje"
        value_template: "{{ 'R$%.2f'|format (float(states('sensor.consumo_gas_hoje')|float * states('sensor.preco_gas_por_grama')|float)) | round(3) }}"
        icon_template: mdi:gas-cylinder

#Template de Consumo do Gás Semana Anterior. 
  - platform: template
    sensors:
      consumo_gas_semana_anterior_valores:
        friendly_name: "R$ do Gás Semana Anterior"
        value_template: "{{ 'R$%.2f'|format (float(states('sensor.consumo_gas_semana_anterior')|float * states('sensor.preco_gas_por_grama')|float)) | round(3) }}"
        icon_template: mdi:gas-cylinder

#Template de Consumo do Gás Semana Atual. 
  - platform: template
    sensors:
      consumo_gas_semana_atual_valores:
        friendly_name: "R$ do Gás Semana Atual"
        value_template: "{{ 'R$%.2f'|format (float(states('sensor.consumo_gas_semana_atual')|float * states('sensor.preco_gas_por_grama')|float)) | round(3) }}"
        icon_template: mdi:gas-cylinder

#Template de Consumo do Gás Mês Anterior. 
  - platform: template
    sensors:
      consumo_gas_mes_anterior_valores:
        friendly_name: "R$ do Gás Mês Anterior"
        value_template: "{{ 'R$%.2f'|format (float(states('sensor.consumo_gas_mes_anterior')|float * states('sensor.preco_gas_por_grama')|float)) | round(3) }}"
        icon_template: mdi:gas-cylinder

#Template de R$ do Gás Mensal. 
  - platform: template
    sensors:
      consumo_gas_mes_atual_valores:
        friendly_name: "R$ do Gás Mês Atual"
        value_template: "{{ 'R$%.2f'|format (float(states('sensor.consumo_gas_mes_atual')|float * states('sensor.preco_gas_por_grama')|float)) | round(3) }}"
        icon_template: mdi:gas-cylinder

#------------------Automation----------------------------------------#

- id: '1586831656805'
  alias: Informa que o Botijão de Gás foi trocado e esta cheio
  description: Informa que o Botijão de Gás esta cheio se for se o peso for superior
    a 12.5kg
  trigger:
  - above: '12.5'
    entity_id: sensor.peso_somente_do_gas
    platform: numeric_state
  condition:
  - condition: template
    value_template: '{{ as_timestamp(now()) - as_timestamp(states.automation.informa_que_o_botijao_de_gas_esta_cheio_acima_de_12_5kg.attributes.last_triggered)
      | int > 86400 }}'
  action:
  - data:
      entity_id: media_player.sala
      message: Foi detectado a troca do Botijão de Gás, e o Nível agora está cheio.
    service: tts.google_say
  - data:
      message: Agora você esta com o botijão de gás cheio novamente, e seu nível de
        gás atual é de {{states('sensor.peso_somente_do_gas')}} kilos.
      title: Troca do botijão de gás realizada.
    service: notify.telegram
  - data_template:
      entity_id: input_number.gas_inicial_para_calculo_hoje
      value: '{{ (states(''input_number.gas_inicial_para_calculo_hoje'')|float + 13.00
        |float - states(''sensor.peso_somente_do_gas'')|float) | round(2) }}'
    service: input_number.set_value
  - data_template:
      entity_id: input_number.gas_gasto_semana_atual
      value: '{{ (states(''input_number.gas_gasto_semana_atual'')|float + 13.00 |float
        - states(''sensor.peso_somente_do_gas'')|float) | round(2) }}'
    service: input_number.set_value
  - data_template:
      entity_id: input_number.gas_gasto_mes_atual
      value: '{{ (states(''input_number.gas_gasto_mes_atual'')|float + 13.00 |float
        - states(''sensor.peso_somente_do_gas'')|float) | round(2) }}'
    service: input_number.set_value
- id: '1586832561624'
  alias: Informa que o Botijão de Gás esta pela metade
  description: Informa que o Botijão de Gás esta pela metade que equivale 7.5kg
  trigger:
  - below: '7.51'
    entity_id: sensor.peso_somente_do_gas
    platform: numeric_state
  condition:
  - above: '1.59'
    below: '7.51'
    condition: numeric_state
    entity_id: sensor.peso_somente_do_gas
  - condition: template
    value_template: '{{ as_timestamp(now()) - as_timestamp(states.automation.informa_que_o_botijao_de_gas_esta_pela_metade.attributes.last_triggered)
      | int > 86400 }}'
  action:
  - data:
      entity_id: media_player.sala
      message: O botijão de gás atingiu a metade da sua capacidade.
    service: tts.google_say
  - data:
      message: O botijão de gás atingiu a metade da sua capacidade, que é de {{states('sensor.peso_somente_do_gas')}}
        kilos.
    service: notify.telegram
- id: '1586833826489'
  alias: 'Informa que o Botijão de Gás esta com seu Nível em 25% '
  description: ''
  trigger:
  - below: '3.26'
    entity_id: sensor.peso_somente_do_gas
    platform: numeric_state
  condition:
  - above: '3.24'
    below: '3.26'
    condition: numeric_state
    entity_id: sensor.peso_somente_do_gas
  - condition: template
    value_template: '{{ as_timestamp(now()) - as_timestamp(states.automation.informa_que_o_botijao_de_gas_esta_com_seu_nivel_em_25.attributes.last_triggered)
      | int > 86400 }}'
  action:
  - data:
      entity_id: media_player.sala
      message: O Nível do Gás chegou a 25% de sua capacidade, mais fique tranquilo,
        que eu avisarei você quando estiver na hora de trocar o botijão.
    service: tts.google_say
  - data:
      message: Mais fique tranquilo, que eu avisarei você quando estiver na hora de
        trocar o botijão.
      title: O Nível do Gás chegou a 25% de sua capacidade, que é de {{states('sensor.peso_somente_do_gas')}}
        kilos.
    service: notify.telegram
- id: '1586834697355'
  alias: 'Informa que o Gás esta quase acabando - Nível em 2% '
  description: ''
  trigger:
  - below: '0.26'
    entity_id: sensor.peso_somente_do_gas
    platform: numeric_state
  condition:
  - above: '0.25'
    below: '0.26'
    condition: numeric_state
    entity_id: sensor.peso_somente_do_gas
  - condition: template
    value_template: '{{ as_timestamp(now()) - as_timestamp(states.automation.informa_que_o_gas_esta_quase_acabando_nivel_em_5.attributes.last_triggered)
      | int > 86400 }}'
  action:
  - data_template:
      language: pt-br
      message: O Nível do Botijão de Gás está com a capacidade de - {{states('sensor.peso_somente_do_gas')}}
        kilos
    entity_id: media_player.sala
    service: tts.google_say
  - delay: 00:00:07
  - data_template:
      language: pt-br
      message: O nível está muito baixo, sugiro que não asse e não cozinhe nada nesse
        momento, realize a troca do botijão urgente.
    entity_id: media_player.sala
    service: tts.google_say
  - data:
      message: O nível está muito baixo, sugiro que não asse e não cozinhe nada nesse
        momento, realize a troca do botijão urgente.
      title: O Nível do Botijão de Gás está com a capacidade de - {{states('sensor.peso_somente_do_gas')}}
        kilos.
    service: notify.telegram
- id: '1587096088998'
  alias: Pega a quantidade de gás no Inicio do dia (Calculo DIA)
  description: ''
  trigger:
  - hours: '00'
    minutes: '00'
    platform: time_pattern
    seconds: '53'
  condition: []
  action:
  - data_template:
      entity_id: input_number.gas_inicial_para_calculo_hoje
      value: '{{ states(''sensor.peso_somente_do_gas'') }}'
    service: input_number.set_value
- id: '1587139436797'
  alias: Pega o consumo do Gás de ontem
  description: ''
  trigger:
  - hours: '23'
    minutes: '59'
    platform: time_pattern
    seconds: '59'
  condition: []
  action:
  - data_template:
      entity_id: input_number.gas_gasto_ontem
      value: '{{ states(''sensor.consumo_gas_hoje'') }}'
    service: input_number.set_value
- id: '1587139534424'
  alias: Pega o consumo do Gás Semana Atual
  description: ''
  trigger:
  - hours: '00'
    minutes: '00'
    platform: time_pattern
    seconds: '10'
  condition:
  - condition: time
    weekday:
    - sun
  action:
  - data_template:
      entity_id: input_number.gas_gasto_semana_atual
      value: '{{ states(''sensor.peso_somente_do_gas'') }}'
    service: input_number.set_value
- id: '1587139604911'
  alias: Pega o consumo do Gás Mês Atual
  description: ''
  trigger:
  - hours: '00'
    minutes: '00'
    platform: time_pattern
    seconds: '10'
  condition:
  - condition: template
    value_template: '{{ now().strftime("%d") == "1" }}'
  action:
  - data_template:
      entity_id: input_number.gas_gasto_mes_atual
      value: '{{ states(''sensor.peso_somente_do_gas'') }}'
    service: input_number.set_value
- id: '1587252151958'
  alias: Pega o consumo do Gás do Mês Anterior
  description: ''
  trigger:
  - hours: '00'
    minutes: '00'
    platform: time_pattern
    seconds: '00'
  condition:
  - condition: template
    value_template: '{{ now().strftime("%d") == "1" }}'
  action:
  - data_template:
      entity_id: input_number.gas_gasto_mes_anterior
      value: '{{ states(''sensor.consumo_gas_mes_atual'') }}'
    service: input_number.set_value
- id: '1587267082904'
  alias: Pega o consumo do Gás da Semana Anterior
  description: ''
  trigger:
  - hours: '00'
    minutes: '00'
    platform: time_pattern
    seconds: '00'
  condition:
  - condition: time
    weekday:
    - sun
  action:
  - data_template:
      entity_id: input_number.gas_gasto_semana_anterior
      value: '{{ states(''sensor.consumo_gas_semana_atual'') }}'
    service: input_number.set_value

Como o peso do botijão vazio varia, assim como o peço, por isto que o Drikos incluir estas variáveis como input:

Card da Barra de Carga
Jose tambem compartilhou uma barra de carga bem bacana:

**Código do Card Barra de Carga**
    card:
      entities:
        - entity: sensor.balanca_gas
          icon: 'mdi:gas-cylinder'
          name: PESO BOTIJÃO (15 kg = vazio)
        - card:
            align: split
            columns: 1
            entity: sensor.peso_botijao
            height: 30px
            positions:
              icon: 'off'
              indicator: 'off'
              minmax: inside
              title: 'off'
              value: inside
            rounding: 0px
            severity:
              - color: '#bf4040'
                from: 0
                to: 30.99
              - color: '#ffc300'
                from: 31
                to: 59.99
              - color: '#40bf40'
                from: 60
                to: 100
            style: |-
              bar-card-value {
                margin-right: auto;
                margin-left: auto;
                margin-bottom: auto;
                margin-top: -8px;
                font-size: 14px
              }
              bar-card-minvalue {
                margin-top: 16px;
                margin-left: 8px;
                margin-right: auto;
                margin-bottom: -13px;
                bottom: 8px;
              }
              bar-card-maxvalue {
                margin-bottom: 0px;
                margin-right: 8px;
                margin-left: auto;
                margin-top: -13px;
                top: 6px;
              }
              bar-card-divider {
                display: none;
              }
              bar-card-contentbar {
                flex-direction: column;
              }
              bar-card-title {
                margin-bottom: 0px;
              }
            title_position: inside
            title_style:
              font-size: 14px
            type: 'custom:bar-card'
            unit_of_measurement: '%'
            value_style:
              font-size: 12px
            width: 100%
          type: 'custom:auto-entities'
      type: entities
    style:
      border: solid 2px var(--primary-color)
      border-radius: 10px
      transform: scale(1.00)
    type: 'custom:card-modder'

É isto, obrigado a todos que compartilharam, especial ao Jose (@jhbcosta) que pensou na solução e implantou primeiro a ideia.

Abraço

10 Curtidas

Grande @Leonardo!

:heart:

Abraços,
José Henrique.

Leonardo e @jhbcosta , Parabéns pela iniciativa.
Vai a dúvida aos universitários: Como são utilizados somente 2 portas D1 e D2 do NODEMCU, será que daria para usar um ESP01s no lugar do NODEMCU?

1 Curtida

@Wesley,

é um bom ponto! Acho ser possível, sim.
Assim não precisaremos de uma bazuca para matar um mosquito e o projeto fica mais barato ainda.

Se resolver tentar, nos avise!

Abraços,
José Henrique.

1 Curtida

Muito legal parabéns pela iniciativa de documentar isso por aqui.
Só quero relatar que usei 4 células de carga e o primeiro conjunto que comprei veio com defeito, me bati muito tempo para descobrir. Acabei comprando outro conjunto que funcionou lindamente. Usei esse esquema de ligação com nodemcu.

4 Curtidas

Saberia informar como ficaria a ligação de somente 2 células de carga? E também se os números usados para a calibração seriam os mesmos?

Acredito que a calibração vai alterar, pois a base que irá utilizar vai ter peso diferente.

Puxa… que legal que alguem conseguiu fazer isso. Eu comecei mas parei no meio e não retomei. Uma dúvida e uma dica: o esphome funcionou direitinho? quando eu tentei o hx711 retornava uns valores esquisitos. Outro usuário do forum HA até me escreveu contando o mesmo problema, então devem ter resolvido isso em alguma versão mais nova do esphome. Agora a dica: dá para usar uma balança de banheiro. Eu tinha uma com display estragado e vi que os sensores de pressão são os mesmos. Se fizer a conta direitinho é possivel que comprar uma balança pra aproveitar os sensores sai mais barato que comprar os próprios sensores!

Se o sensor de balança de banheiro for o mesmo, dá sim para usar… basta fazer as conexões corretas no ESP. Essa balança sua tem quantos sensores?

Se for possível… posta uma foto da balança e do sensor

opa, demorei, mas tá aqui. Balança multilaser.

Tem um desafio de descobrir que fio é o que, mas pelo menos eles já estão até soldados. Na primeira foto, o que tá pendurado com cabinho dupont é o hx711.

dá para usar sim… e realmente sai mais barato comprar a balança do que os sensores… pena que não vi isso antes.

Bom dia pessoal, estou querendo comprar deste link:

Acredito que seja este modelo referido aqui no tópico, você quem vende @douglas bem de Criciúma, acho que vive é de lá certo?

Qual o Grupo do Telegram? Obrigado

pra fazer com a balança usa alguma placa a mais ? tenho uma dessa aqui em casa e gostei da ideia :smiley:

Você pode ligar a um ESP 8266 ou ESP 32 pode usar wemos, nodemcu…

Poderia ser por exemplo essa. https://produto.mercadolivre.com.br/MLB-1215585235-modulo-esp8266-nodemcu-v3-wifi-80211-arduino-lua-_JM?matt_tool=79246729&matt_word&gclid=CjwKCAjw5vz2BRAtEiwAbcVIL_Bh5AxEJdLRbbClapB8lF2w9P1GyJLF2eV5VpVmyXnBwrLFatqDWBoCBKAQAvD_BwE&quantity=1

e ai seguir as ligaçoes acima. Certo?

isso mesmo, e pode ser wemos também, qualquer um baseado em esp8266 ou 32 existem varios microcontroladores, o nodemcu e wemos são mais famosos pela praticidade de participação, ou seja, só plugar na usb do pc configurar o básico e já gravar a firmware, existem outros modelos de menor tamanho caso seja este o seu proposito também.

Que boa ideia, tenho uma balança aqui parada… Vou ver se aproveito :+1:

1 Curtida