Balança Xiaomi Mi Body Composition Scale 2: Integração com vários perfis de usuário no Home Asssistant

image image

Este tutorial mostra como integrar a balança Xiaomi Mi Body Composition Scale 2 ao home assistant utilizando vários perfis de usuário, mesmo que o peso dos usuários sejam próximos.

Materiais utilizados:

Para integrar a balança ao Home assistante utilizei o ESPHome em um NodeMCU ESP-WROOM-32, detalhes da integração pode ser visualizada na documentação do ESPHome. O código utilizado para possibilitar vários perfis está disponível mais a frente neste tutorial.

https://esphome.io/components/sensor/xiaomi_miscale2.html

A seleção do usuário que está sendo pesado é através de um switch na interface do Home Assistant. Após registrar o peso, o switch retorna automaticamente para a posição desligada.

IMG_1788

Caso os usuários tenham pesos em uma faixa diferente, é possível configurar para a seleção automática do perfil. Essa opção está disponível na documentação do ESPHome.

1. Código do ESPHome:

No código abaixo deve ser alteradas as informações de rede (rede wifi, senha e endereço IP) e o endereço MAC da balança.

O endereço MAC da balança deve ser consultado no aplicativo Mi Fit.

substitutions:
  #Configurações:
  Plataforma: ESP32
  TipoPlaca: esp32dev
  hostname: 'casa_esp_ble' #Hostname do dispositivo na rede
  PrefixoNome: "BLE - "
  RedeWifi: !secret RedeWifi #Nome da rede wifi que o dispositivo irá se conectar
  SenhaWifi: !secret  SenhaWifi #Senha da rede wifi que o dispositivo irá se conectar
  SenhaWifiReconfig: !secret SenhaWifiReconfig #Senha do AP Wifi para reconfiguração do wifi do dispositivo
  EndConfig: ${hostname}.local #192.168.1.50 #Endereço para configuração (IP que o esp está acessível atualmente na rede), especialmente usado quando quer alterar o hostname via OTA
  WifiOculto: 'False' #Se a rede wifi está oculta defina como 'True'
  WifiFastConnect: 'False' #Se o esp realizará a conexão à rede wifi sem escanear as redes disponíveis defina como 'True'

  SenhaAPI: !secret SenhaAPI #Senha para adicionar o esp no HA
  SenhaOTA: !secret SenhaOTA #Senha para atualizar o firmware do esp via OTA

  BalancaMAC: !secret BalancaMAC
  
esphome:
  name: $hostname
  platform: ${Plataforma}
  board: ${TipoPlaca}
  
wifi:
  networks:
  - ssid: ${RedeWifi}
    password: ${SenhaWifi}
    hidden: ${WifiOculto}
  fast_connect: ${WifiFastConnect}
  use_address: ${EndConfig}
  
  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: ${hostname}_WIFI
    password: ${SenhaWifiReconfig}

#Habilita um AP Wifi para reconfigurar em caso de perda de conexão com a rede configurada
captive_portal:

#Habilita a api para comunicar com o Home Assistant
api:
  password: ${SenhaAPI}

#Habilita a atualização de firmware por OTA
ota:
  password: ${SenhaOTA}
  
logger:
  baud_rate: 0

esp32_ble_tracker:

switch:
  #Comando reinicilizar esp remotamente
  - platform: restart
    id: ${hostname}_restart
    name: ${PrefixoNome} Reiniciar
    icon: mdi:restart
  
  #Switich Ativar Registro Pesagem Douglas
  - platform: template
    id: switch_pesagem_douglas
    name: Pesagem Douglas
    icon: mdi:toggle-switch
    lambda: return id(bs_pesagem_douglas).state;
    turn_off_action:
      - lambda: id(bs_pesagem_douglas).publish_state(false); #Desativa o sensor auxiliar de pesagem do Douglas
    turn_on_action:
      - lambda: id(bs_pesagem_douglas).publish_state(true); #Ativa o sensor auxiliar de pesagem do Douglas
      - lambda: id(bs_pesagem_jose).publish_state(false); #Desativa o sensor auxiliar de pesagem do José
      - lambda: id(bs_pesagem_maria).publish_state(false); #Desativa o sensor auxiliar de pesagem da Maria
      
  #Switch Ativar Registro Pesagem Maria
  - platform: template
    id: switch_pesagem_maria
    name: Pesagem Maria
    icon: mdi:toggle-switch
    lambda: return id(bs_pesagem_maria).state;
    turn_off_action:
      - lambda: id(bs_pesagem_maria).publish_state(false); #Desativa o sensor auxiliar de pesagem da Maria
    turn_on_action:
      - lambda: id(bs_pesagem_maria).publish_state(true); #Ativa o sensor auxiliar de pesagem da Maria
      - lambda: id(bs_pesagem_jose).publish_state(false); #Desativa o sensor auxiliar de pesagem do José
      - lambda: id(bs_pesagem_douglas).publish_state(false); #Desativa o sensor auxiliar de pesagem do Douglas
      
  #Switch Ativar Registro Pesagem José
  - platform: template
    id: switch_pesagem_jose
    name: Pesagem José
    icon: mdi:toggle-switch
    lambda: return id(bs_pesagem_jose).state;
    turn_off_action:
      - lambda: id(bs_pesagem_jose).publish_state(false); #Desativa o sensor auxiliar de pesagem do José
    turn_on_action:
      - lambda: id(bs_pesagem_jose).publish_state(true); #Ativa o sensor auxiliar de pesagem do José
      - lambda: id(bs_pesagem_douglas).publish_state(false); #Desativa o sensor auxiliar de pesagem do Douglas
      - lambda: id(bs_pesagem_maria).publish_state(false); #Desativa o sensor auxiliar de pesagem da Maria

text_sensor:
  #Informações da conexão wifi
  - platform: wifi_info
    #Endereço IP
    ip_address:
      id: ${hostname}_IP
      name: ${PrefixoNome} Endereço IP
      icon: mdi:ip-network
    #Nome da Rede
    ssid:
      id: ${hostname}_SSID
      name: ${PrefixoNome} Rede Wifi
      icon: mdi:wifi
  #Informação da versão da compilação
  - platform: version
    id: ${hostname}_versao
    name: ${PrefixoNome} Versão
    icon: mdi:information

binary_sensor:
  #Status (conectado ou desconectado)
  - platform: status
    id: ${hostname}_status
    name: ${PrefixoNome} Status
    device_class: connectivity

  - platform: ble_presence
    mac_address: ${BalancaMAC}
    name: ${PrefixoNome} Balança Status

  #Sensor auxiliar de pesagem do Douglas
  - platform: template
    id: bs_pesagem_douglas
    internal: true

  #Sensor auxiliar de pesagem do José
  - platform: template
    id: bs_pesagem_jose
    internal: true
  
  #Sensor auxiliar de pesagem da Maria
  - platform: template
    id: bs_pesagem_maria
    internal: true
    
sensor:
  #Sensor Intensidade Sinal Wifi
  - platform: wifi_signal
    id: ${hostname}_wifi_sinal
    name: ${PrefixoNome} Intensidade Wifi
    icon: mdi:signal
    update_interval: 10s

  #Intensidade sinal bluetooth da balançan
  - platform: ble_rssi
    mac_address: ${BalancaMAC}
    name: ${PrefixoNome} Balança Sinal

  #Sensores do perfil de Douglas
  - platform: template
    name: MIScale Douglas Peso
    id: douglas_peso
    unit_of_measurement: 'kg'
    icon: mdi:weight-kilogram
    accuracy_decimals: 2
  - platform: template
    name: MIScale Douglas Impedância
    id: douglas_impedancia
    unit_of_measurement: Ω
    icon: mdi:omega
    accuracy_decimals: 0
    
  #Sensores do perfil de Maria
  - platform: template
    name: MIScale Maria Peso
    id: maria_peso
    unit_of_measurement: 'kg'
    icon: mdi:weight-kilogram
    accuracy_decimals: 2
  - platform: template
    name: MIScale Maria Impedância
    id: maria_impedancia
    unit_of_measurement: Ω
    icon: mdi:omega
    accuracy_decimals: 0
    
  #Sensores do perfil de José
  - platform: template
    name: MIScale José Peso
    id: jose_peso
    unit_of_measurement: 'kg'
    icon: mdi:weight-kilogram
    accuracy_decimals: 2
  - platform: template
    name: MIScale José Impedância
    id: jose_impedancia
    unit_of_measurement: Ω
    icon: mdi:omega
    accuracy_decimals: 0
    
  #Sensores da balança
  - platform: xiaomi_miscale
    mac_address: ${BalancaMAC}
    #Sensor de peso da balança  
    weight:
      name: ${PrefixoNome} Balança Peso
      id: balanca_peso
      #Define o valor de peso do perfil selecionado se maior que zero
      on_value:
        then:
          - lambda: |-
              if (id(bs_pesagem_douglas).state and x>0) {
                id(douglas_peso).publish_state(x);
              } else if (id(bs_pesagem_maria).state and x>0) {
                id(maria_peso).publish_state(x);
              } else if (id(bs_pesagem_jose).state and x>0) {
                id(jose_peso).publish_state(x);
              }
    #Sensor de impedância da balança
    impedance:
      name: ${PrefixoNome} Balança Impedância
      id: balanca_impedancia
      #Define o valor de impedância do perfil selecionado se maior que zero
      on_value:
        then:
          - lambda: |-
              if (id(bs_pesagem_douglas).state and x>0) {
                id(douglas_impedancia).publish_state(x);
              } else if (id(bs_pesagem_maria).state and x>0) {
                id(maria_impedancia).publish_state(x);
              } else if (id(bs_pesagem_jose).state and x>0) {
                id(jose_impedancia).publish_state(x);
              }
          #Retorna os sensores auxiliar de pesagem para false após concluir a pesagem
          - lambda: id(bs_pesagem_douglas).publish_state(false); #Desativa o sensor auxiliar de pesagem do Douglas
          - lambda: id(bs_pesagem_jose).publish_state(false); #Desativa o sensor auxiliar de pesagem do José
          - lambda: id(bs_pesagem_maria).publish_state(false); #Desativa o sensor auxiliar de pesagem da Maria

Todas essas informações importantes (senhas OTA e API, configuração da rede wifi, endereço MAC da balança, etc) estão armazenadas no arquivo secrets.yaml (ver aqui e aqui para mais detalhes de configuração e uso).

2. Sensores no Home Assistenat (Template):

Devido os sensores de peso e impedância de cada usuário ficar indisponível caso o hub bluetooth ficar offline (nodemcu), criei sensores template para cada usuário que irá verifica se o valor está disponível antes de atualizar. Basta incluir no arquivo configuration.yaml.

  sensor:
  - platform: template
    sensors:
      #Sensor de peso do Douglas
      douglas_peso:
        friendly_name: Douglas Peso
        unit_of_measurement: kg
        icon_template: mdi:weight-kilogram
        value_template: >-
          {%if (states('sensor.miscale_douglas_peso')!="unknown" and states('sensor.miscale_douglas_peso')!="unavailable") %}
            {{states('sensor.miscale_douglas_peso')|float(2)}}
          {% else %}
            {{states('sensor.douglas_peso')}}
          {% endif %}
      #Sensor de impedância do Douglas
      douglas_impedancia:
        friendly_name: Douglas Impedância
        unit_of_measurement: Ω
        icon_template: mdi:omega
        value_template: >-
          {%if (states('sensor.miscale_douglas_impedancia')!="unknown" and states('sensor.miscale_douglas_impedancia')!="unavailable") %}
            {{states('sensor.miscale_douglas_impedancia')|float(2)}}
          {% else %}
            {{states('sensor.douglas_impedancia')}}
          {% endif %}

      #Sensor de peso da Maria
      maria_peso:
        friendly_name: Maria Peso
        unit_of_measurement: kg
        icon_template: mdi:weight-kilogram
        value_template: >-
          {%if (states('sensor.miscale_maria_peso')!="unknown" and states('sensor.miscale_maria_peso')!="unavailable") %}
            {{states('sensor.miscale_maria_peso')|float(2)}}
          {% else %}
            {{states('sensor.maria_peso')}}
          {% endif %}
      #Sensor de impedância da Maria    
      maria_impedancia:
        friendly_name: Maria Impedância
        unit_of_measurement: Ω
        icon_template: mdi:omega
        value_template: >-
          {%if (states('sensor.miscale_maria_impedancia')!="unknown" and states('sensor.miscale_maria_impedancia')!="unavailable") %}
            {{states('sensor.miscale_maria_impedancia')|float(2)}}
          {% else %}
            {{states('sensor.maria_impedancia')}}
          {% endif %}

      #Sensor de peso do José
      jose_peso:
        friendly_name: José Peso
        unit_of_measurement: kg
        icon_template: mdi:weight-kilogram
        value_template: >-
          {%if (states('sensor.miscale_jose_peso')!="unknown" and states('sensor.miscale_jose_peso')!="unavailable") %}
            {{states('sensor.miscale_jose_peso')|float(2)}}
          {% else %}
            {{states('sensor.jose_peso')}}
          {% endif %}
      #Sensor de impedância do José
      jose_impedancia:
        friendly_name: José Impedância
        unit_of_measurement: Ω
        icon_template: mdi:omega
        value_template: >-
          {%if (states('sensor.miscale_jose_impedancia')!="unknown" and states('sensor.miscale_jose_impedancia')!="unavailable") %}
            {{states('sensor.miscale_jose_impedancia')|float(2)}}
          {% else %}
            {{states('sensor.jose_impedancia')}}
          {% endif %}     

3. Card Simples no Lovelace

Um card simples com as informações do hub bluetooth, da balança e dos perfis de usuários no lovelace:

Código do lovelace:

type: grid
columns: 1
title: Balança Mi Scale 2
cards:
  - type: entities
    entities:
      - entity: binary_sensor.ble_balanca_status
      - entity: sensor.ble_balanca_sinal
      - entity: sensor.ble_balanca_peso
      - entity: sensor.ble_balanca_impedancia
    title: Balança
    state_color: true
  - type: grid
    columns: 3
    title: Sensores de Peso ESPHome
    cards:
      - type: entities
        entities:
          - entity: switch.pesagem_douglas
            name: ' '
          - entity: sensor.miscale_douglas_peso
            name: ' '
          - entity: sensor.miscale_douglas_impedancia
            name: ' '
        title: Douglas
        state_color: true
      - type: entities
        entities:
          - entity: switch.pesagem_maria
            name: ' '
          - entity: sensor.miscale_maria_peso
            name: ' '
          - entity: sensor.miscale_maria_impedancia
            name: ' '
        title: Maria
        state_color: true
      - type: entities
        entities:
          - entity: switch.pesagem_jose
            name: ' '
          - entity: sensor.miscale_jose_peso
            name: ' '
          - entity: sensor.miscale_jose_impedancia
            name: ' '
        title: José
        state_color: true
    square: false
  - type: grid
    columns: 3
    title: Sensores de Peso Home Assistant
    cards:
      - type: entities
        entities:
          - entity: sensor.douglas_peso
            name: ' '
          - entity: sensor.douglas_impedancia
            name: ' '
        title: Douglas
        state_color: true
      - type: entities
        entities:
          - entity: sensor.maria_peso
            name: ' '
          - entity: sensor.maria_impedancia
            name: ' '
        title: Maria
        state_color: true
      - type: entities
        entities:
          - entity: sensor.jose_peso
            name: ' '
          - entity: sensor.jose_impedancia
            name: ' '
        title: José
        state_color: true
    square: false
  - type: entities
    entities:
      - entity: binary_sensor.ble_status
      - entity: sensor.ble_rede_wifi
      - entity: sensor.ble_intensidade_wifi
      - entity: sensor.ble_endereco_ip
      - entity: switch.ble_reiniciar
      - entity: sensor.ble_versao
    title: Informações do Device
    state_color: true
square: false

4. Integração personalizada para informações adicionais da composição corporal:

Utilizando o custom component Body Metrics for Xiomi é possível incluir informações adcionais sobre a composição corporal a partir do peso e da impedância medida pela balança.

Detalhes podem ser condultados na documentação:

Para adicionar a integração deve-se instalar o custom componente via HACS ou manualmente conforme instruções na documentação, reiniciar o Home Assistant e incluir o código abaixo com as informações de cada usuário no arquivo configuration.yaml (incluir após instalar o custom component e reiniciar o HA) e realizar nova reinicialização do Home Assistant:

bodymiscale:
    jose:
      sensors:
        weight: sensor.jose_peso #Informar o sensor do peso criado através do template do Home Assistant (se informar o proveniente do ESPHome, quando ele for reinicializado ou estiver offline o sensor de composição corporal irá retornar erro)
        impedance: sensor.jose_impedancia #Informar o sensor de impedância criado através do template do Home Assistant (se informar o proveniente do ESPHome, quando ele for reinicializado ou estiver offline o sensor de composição corporal irá retornar erro)
      height: 177 #Altura em centímetros do usuário
      born: "1990-01-27" #Informar a data de nascimento do usuário no formato AAAA-MM-DD
      gender: "male" #Informar o sexo do usuário: male ou female
      model_miscale: "181B" #Informar o modelo da balança (181D para Mi Scale ou 181B para Mi Scale 2)

Após a reinicialização do Home Assistant um sensor com as informações estará disponível.
O status do sensor informa se há algum erro no cálculo e as informações estarão nos atributos do sensor.

5. Card personalizado com a composição corporal

type: custom:body-miscale-card
entity: bodymiscale.jose
image: /local/images/miscale2.jpg
model: true
unit: true
show_name: true
show_states: true
show_attributes: true
show_toolbar: true
show_body: true
show_buttons: true
entity_row: true
buttons:
  registrar_peso:
    icon: mdi:scale-bathroom
    label: Registrar Peso
    service: switch.toggle
    service_data:
      entity_id: switch.pesagem_jose
4 Likes

Muito bom, esperando minha balança chegar para testar.

2 Likes

Ela está na lista de dispositivos compatíveis com o Passive BLE Monitor, veja na documentação da integração personalizada:

Testei aqui e funcionou perfeitamente com o Passive BLE Monitor. Eu estava utilizando os sensores no HA conforme o tutorial e a documentação, mas toda vez que reiniciava perdia os valores. Um usuario do grupo no telegram deu a ideia de criar os sensores pelo NodeRed que quando reiniciar ele retorna com os valores antigos e funcionou perfeitamente.

Aproveitei e acabei criando um input para ativar caso alguem diferente de casa vá pesar, assim não corremos o risco de registrar essas informações no nosso perfil.

A integração com o Passive BLE Monitor tras esses sensores:
image

Meu Dashboard acabou ficando desta maneira:

Fluxo no NodeRED ficou da seguinte maneira:

[{"id":"85d1732bacd2b5c2","type":"tab","label":"BALANÇA","disabled":false,"info":"","env":[]},{"id":"ebc0e2c93ffefd13","type":"group","z":"85d1732bacd2b5c2","name":"Cria e atualiza os sensores de peso da balança automaticamente de acordo com o peso.","style":{"stroke":"#000000","fill":"#dbcbe7","label":true,"color":"#000000"},"nodes":["14e84d9f8b413a89","60ee50e065030f6a","162765e6d20dd1e9","02f8671a109ac15d","1c4c1d6eeaf72333","4790ebad6602e7bd","0a202599a55b9e96","3acf6de15594fc26","4b212620a1b622de","14f85ec93c53cf93"],"x":334,"y":119,"w":832,"h":262},{"id":"14e84d9f8b413a89","type":"api-render-template","z":"85d1732bacd2b5c2","g":"ebc0e2c93ffefd13","name":"Peso Estabilizado","server":"48089071.a66eb","version":0,"template":"{{ states('sensor.ble_weight_balanca_mi_scale') | float }}","resultsLocation":"payload","resultsLocationType":"msg","templateLocation":"template","templateLocationType":"msg","x":790,"y":160,"wires":[["14f85ec93c53cf93"]]},{"id":"60ee50e065030f6a","type":"server-state-changed","z":"85d1732bacd2b5c2","g":"ebc0e2c93ffefd13","name":"Pesou?","server":"48089071.a66eb","version":4,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"sensor.ble_weight_balanca_mi_scale","entityidfiltertype":"exact","outputinitially":false,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":true,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":true,"ignoreCurrentStateUnavailable":true,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":410,"y":260,"wires":[["162765e6d20dd1e9"]]},{"id":"162765e6d20dd1e9","type":"switch","z":"85d1732bacd2b5c2","g":"ebc0e2c93ffefd13","name":"> 65?","property":"payload","propertyType":"msg","rules":[{"t":"lte","v":"65","vt":"str"},{"t":"gte","v":"66","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":570,"y":260,"wires":[["14e84d9f8b413a89","02f8671a109ac15d"],["0a202599a55b9e96","3acf6de15594fc26"]]},{"id":"02f8671a109ac15d","type":"api-render-template","z":"85d1732bacd2b5c2","g":"ebc0e2c93ffefd13","name":"Impedancia","server":"48089071.a66eb","version":0,"template":"{{ states('sensor.ble_impedance_balanca_mi_scale') | float }}","resultsLocation":"payload","resultsLocationType":"msg","templateLocation":"template","templateLocationType":"msg","x":770,"y":220,"wires":[["1c4c1d6eeaf72333"]]},{"id":"1c4c1d6eeaf72333","type":"ha-entity","z":"85d1732bacd2b5c2","g":"ebc0e2c93ffefd13","name":"Impedancia da Pessoa1","server":"48089071.a66eb","version":2,"debugenabled":false,"outputs":1,"entityType":"sensor","config":[{"property":"name","value":"Impedancia da Pessoa1"},{"property":"device_class","value":""},{"property":"icon","value":"mdi:omega"},{"property":"unit_of_measurement","value":"ohm"},{"property":"state_class","value":""},{"property":"last_reset","value":""}],"state":"payload","stateType":"msg","attributes":[],"resend":true,"outputLocation":"","outputLocationType":"none","inputOverride":"allow","outputOnStateChange":false,"outputPayload":"","outputPayloadType":"str","x":1030,"y":220,"wires":[[]]},{"id":"4790ebad6602e7bd","type":"ha-entity","z":"85d1732bacd2b5c2","g":"ebc0e2c93ffefd13","name":"Peso da Pessoa2","server":"48089071.a66eb","version":2,"debugenabled":false,"outputs":1,"entityType":"sensor","config":[{"property":"name","value":"Peso da Pessoa2"},{"property":"device_class","value":""},{"property":"icon","value":"mdi:weight-kilogram"},{"property":"unit_of_measurement","value":"kg"},{"property":"state_class","value":""},{"property":"last_reset","value":""}],"state":"payload","stateType":"msg","attributes":[],"resend":true,"outputLocation":"","outputLocationType":"none","inputOverride":"allow","outputOnStateChange":false,"outputPayload":"","outputPayloadType":"str","x":1010,"y":280,"wires":[[]]},{"id":"0a202599a55b9e96","type":"api-render-template","z":"85d1732bacd2b5c2","g":"ebc0e2c93ffefd13","name":"Peso Estabilizado","server":"48089071.a66eb","version":0,"template":"{{ states('sensor.ble_weight_balanca_mi_scale') | float }}","resultsLocation":"payload","resultsLocationType":"msg","templateLocation":"template","templateLocationType":"msg","x":790,"y":280,"wires":[["4790ebad6602e7bd"]]},{"id":"3acf6de15594fc26","type":"api-render-template","z":"85d1732bacd2b5c2","g":"ebc0e2c93ffefd13","name":"Impedancia","server":"48089071.a66eb","version":0,"template":"{{ states('sensor.ble_impedance_balanca_mi_scale') | float }}","resultsLocation":"payload","resultsLocationType":"msg","templateLocation":"template","templateLocationType":"msg","x":770,"y":340,"wires":[["4b212620a1b622de"]]},{"id":"4b212620a1b622de","type":"ha-entity","z":"85d1732bacd2b5c2","g":"ebc0e2c93ffefd13","name":"Impedancia da Pessoa2","server":"48089071.a66eb","version":2,"debugenabled":false,"outputs":1,"entityType":"sensor","config":[{"property":"name","value":"Impedancia da Pessoa2"},{"property":"device_class","value":""},{"property":"icon","value":"mdi:omega"},{"property":"unit_of_measurement","value":"ohm"},{"property":"state_class","value":""},{"property":"last_reset","value":""}],"state":"payload","stateType":"msg","attributes":[],"resend":true,"outputLocation":"","outputLocationType":"none","inputOverride":"allow","outputOnStateChange":false,"outputPayload":"","outputPayloadType":"str","x":1010,"y":340,"wires":[[]]},{"id":"14f85ec93c53cf93","type":"ha-entity","z":"85d1732bacd2b5c2","g":"ebc0e2c93ffefd13","name":"Peso da Pessoa1","server":"48089071.a66eb","version":2,"debugenabled":false,"outputs":1,"entityType":"sensor","config":[{"property":"name","value":"Peso da Pessoa1"},{"property":"device_class","value":""},{"property":"icon","value":"mdi:weight-kilogram"},{"property":"unit_of_measurement","value":"kg"},{"property":"state_class","value":""},{"property":"last_reset","value":""}],"state":"payload","stateType":"msg","attributes":[],"resend":true,"outputLocation":"","outputLocationType":"none","inputOverride":"allow","outputOnStateChange":false,"outputPayload":"","outputPayloadType":"str","x":1010,"y":160,"wires":[[]]},{"id":"48089071.a66eb","type":"server","name":"Home Assistant","version":4,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":"30","areaSelector":"friendlyName","deviceSelector":"friendlyName","entitySelector":"friendlyName","statusSeparator":"at: ","statusYear":"hidden","statusMonth":"short","statusDay":"numeric","statusHourCycle":"h23","statusTimeFormat":"h:m"}]

poderia disponibilizar o codigo do card do seu Dashboard?

Segue o codigo:

type: custom:config-template-card
entities:
  - sensor.leidy_medidas_weight
card:
  type: entities
  show_header_toggle: 'off'
  style: |
    .card-header {
      padding: 0px 0px 0px 0px !important;
    }
  entities:
    - type: custom:hui-element
      card_type: vertical-stack
      cards:
        - type: custom:button-card
          layout: icon_name
          name: Leidy 
          icon: mdi:human
          styles:
            grid:
              - grid-template-areas: '"n i"'
              - grid-template-columns: 1fr 20%
            icon:
              - align-self: end
              - color: var(--text-primary-color)
              - height: 35px
            card:
              - padding: 4px
              - height: 40px
              - background: var(--primary-color)
            name:
              - color: var(--text-primary-color)
              - justify-self: start
              - padding-left: 10%
              - font-weight: 400
              - font-size: 18px

        - type: horizontal-stack
          cards:
            - type: custom:mushroom-entity-card
              entity: sensor.leidy_medidas_weight
              name: Peso
              layout: vertical
              fill_container: false
            - type: custom:mushroom-entity-card
              entity: sensor.leidy_medidas_bmi
              name: IMC
              layout: vertical
              fill_container: false
            - type: custom:mushroom-entity-card
              entity: sensor.leidy_medidas_weight
              layout: vertical
              fill_container: false
              secondary_info: last-changed
              icon: mdi:clock-check
              primary_info: name
              name: Atualizado

        - type: custom:bar-card
          show_icon: true
          align: split
          columns: 1
          positions:
            icon: inside
            name: inside
            value: inside
            indicator: inside
          animation: 'on'
          style: |
            ha-card {
                --paper-card-background-color: 'rgba(0, 0, 0, 0.0)';
                --ha-card-background: "rgba(0, 0, 0, 0.0)";
                --paper-item-icon-color: 'var(--text-primary-color';
                --ha-card-box-shadow: 'none';
            }
          entities:
            - entity: sensor.leidy_medidas_body_fat
              min: '0'
              max: '50'
              direction: left-reverse
              target: '32'
              severity:
                - from: '0'
                  to: '27'
                  color: blue
                - from: '27'
                  to: '35'
                  color: green
                - from: '35.1'
                  color: orange
                  to: '40'
                - from: '40.1'
                  to: '50'
                  color: red
              icon: mdi:human-handsup
              name: Gordura Corporal
              unit_of_measurement: '%'
            - entity: sensor.leidy_medidas_water
              min: '0'
              max: '100'
              target: '63'
              severity:
                - from: '0'
                  to: '45'
                  color: orange
                - from: '45.2'
                  to: '60'
                  color: green
                - from: '60.1'
                  color: blue
                  to: '100'
              icon: mdi:water
              name: Agua
              unit_of_measurement: '%'
            - entity: sensor.leidy_medidas_basal_metabolism
              min: '0'
              max: '2000'
              target: ''
              severity:
                - from: '0'
                  to: '1170'
                  color: red
                - from: '1171'
                  to: '1900'
                  color: green
                - from: '1900'
                  color: lime
                  to: '3000'
              icon: mdi:silverware-variant
              name: Meta. Basal
              unit_of_measurement: kcal
            - entity: sensor.leidy_medidas_visceral_fat
              min: '0'
              max: '17'
              direction: left-reverse
              target: ''
              severity:
                - from: '0'
                  to: '9'
                  color: green
                - from: '10'
                  to: '15'
                  color: orange
                - from: '16'
                  color: red
                  to: '30'
              icon: mdi:hamburger
              name: Gordura Visc.
              unit_of_measurement: ''
            - entity: sensor.leidy_medidas_muscle_mass
              min: '0'
              max: '60'
              target: ''
              severity:
                - from: '0'
                  to: '32'
                  color: red
                - from: '32.1'
                  to: '38'
                  color: green
                - from: '38.1'
                  color: blue
                  to: '60'
              icon: mdi:weight-lifter
              name: Músculo
              unit_of_measurement: kg
            - entity: sensor.leidy_medidas_protein
              min: '0'
              max: '40'
              target: '22'
              severity:
                - from: '0'
                  to: '16'
                  color: red
                - from: '16.1'
                  to: '20'
                  color: green
                - from: '20.1'
                  color: blue
                  to: '40'
              icon: mdi:food-steak
              name: Proteina
              unit_of_measurement: '%'
            - entity: sensor.leidy_medidas_bone_mass
              min: '0'
              max: '5'
              severity:
                - from: '0'
                  to: '1.79'
                  color: red
                - from: '1.80'
                  to: '3.90'
                  color: green
                - from: '3.91'
                  color: blue
                  to: '10'
              icon: mdi:bone
              name: Massa óssea
              unit_of_measurement: kg
          entity_row: true

        - type: horizontal-stack
          cards:
            - type: custom:mushroom-entity-card
              entity: sensor.leidy_medidas_metabolic_age
              name: Idade
              layout: vertical
              fill_container: false
            
            - type: custom:mushroom-entity-card
              entity: sensor.leidy_medidas_body_score
              name: Pontuação
              layout: vertical
              fill_container: false

        - type: custom:mini-graph-card
          height: 100
          align_state: center
          update_interval: 300
          line_width: 1
          font_size: 70
          hours_to_show: 336
          points_per_hour: 0.3
          show:
            extrema: true
            fill: true
          entities:
            - sensor.leidy_medidas_weight
          name: Peso
1 Like

oi pessoal, sou novo aqui :slight_smile:

Eu segui o tutorial e tudo está funcionando, só que quando eu reinicio meu home assistant o dash fica sem dados, igual na imagem abaixo.

Vocês sabem se é possível resolver esse problema de alguma forma?

Olá,
Resolvi utilizando uma integração do node-red.

Os sensores de peso e impedancia passados pela balança são criados no node-red e não são perdidos com a reinicialização.

Esse é o fluxo que utilizei em casa:

Ele basicamente faz as seguintes etapas:
1º Pega o peso da balança
2º Verifica se é maior ou menor que 65kg
3º verifica se o botão de convidado não esta ativo para não registrar a informação de uma visita que esta em casa pesando por exemplo e fuder com tudo kkkk
4º cria os sensores e depois notifica a pessoa que esta pesando com um link para abrir a pagina com as informações caso ela queira ver os detalhes.

Assim é a pagina com as informações das pessoas aqui em casa.

Em um comentario ai pra cima tem o fluxo que postei na epoca.

As vezes acontece do meu driver de bluetooth não ser reconhecido pelo HA (comprei um bluetooth USB pra ver se melhora) e com isso todos meus sensores BLE ficam desconectados, veja se não é isso.

entendi, boa, acho que não é o meu caso porque só acontece realmente se eu reiniciar o HA.
se eu não reiniciar fica mais de semana e não acontece nada.
mas valeu amigo!

Entendi, é, eu estou usando o fluxo que você postou mesmo.

Eu atualizei o sensor de peso para o sensor que é criado pelo nodered, ai nesse campo deu certo, porém todos os outros dados vem dos sensores da BodyMiScale.
Como que você fez, criou um sensor no nodered para cada sensor do BodyMiScale?
Ex: no dash tem o sensor sensor.leidy_medidas_metabolic_age é um sensor que foi criado via nodered?

Se puder compartilhar a tua regra do nodered novamente, a que você postou antes não tem essa configuração do “convidado”, e eu sou bem novo com nodered, não faço ideia de como que faz :confused:

Obrigado mano!

Sim mas acontece com reinício do HA ou certas atualizações também. Se não mexer em nada fica de boa.

Chegando em casa eu reposto a configuração, mas ela não altera em muita coisa o funcionamento dos sensores, é apenas um complemento caso alguma visita vá usar a balança, não zoar as informações do meu perfil ou da esposa.

Quanto ao sensor “sensor.leidy_medidas_metabolic_age” quem fica encarregado de preencher ele é a integração “BodyMiScale”. A propósito nela você configurou para pegar os sensores que está gerando no node-red né? Você não deve selecionar os sensores criados pela integração do BLE/Balança.

Esses sensores do print abaixo devem ser os criados no nodered

aaaah tá, vou fazer isso, boa!

eu também não tinha me atentado que tinha como configurar duas pessoas nessa integração do BodyMiScale.

Show!

Mas no seu caso se mais ninguém utiliza a balança, tem uma solução muito mais simples.

Você pode configurar a integração do BLE para restaurar o estado após a reinicialização.

Agora se mas de uma pessoa utiliza é melhor manter os sensores criados no nodered mesmo. Pois ele vai restaurar a informação apenas de uma pessoa e a outra vai continuar perdendo tudo na reinicialização.

deu certo! era porque eu não tinha colocado os sensores do nodered no BodyMiScale mesmo.

agora eu reinicio e fica certinho, valeu demais.

1 Like

Olá, não estou a conseguir que apareça o valor da impedância.

Alguma ideia?

@guilherme-cespedes estou comprando a balana e vou comprar o NodeMCU, você montaria este card? Quanto cobra? São 03 pessoas aqui na minha casa… NodeRed nem tenho instalado no meu HA que não manjo nada de NodeRed rsrsrs

Achei muito TOP… Obrigado…

Qualquer outra balanca com Bluetooth seria possível usar? Esta por exemplo? https://www.mercadolivre.com.br/balanca-de-bioimpedncia-relaxmedic-rm-bd1904a2-digital-app/p/MLB15702180

Olá Amigo!
Eu compartilho com você o flow no NodeRed, é só você ajustar para a sua realidade.

A integração funciona muito bem, inicialmente tive alguns problemas da balança se desconectar, só que era um problema com o BT do meu Mini-PC, comprei aqueles USB e funciona muito bem até hoje.

Não sei informar se funciona com todas as balanças BT, aqui eu uso exatamente a que consta nesse tópico.

A proposito, não é necessário nodeMCU, Apenas seu HA com acesso ao BT do PC e a balança em um local que de raio de funcionamento do BT são suficientes para funcionar. A parte mais difícil é o ajuste do fluxo para sua realidade.