Balanças Xiaomi Miscale e Miscale Body Composit no HA

Ora boas.

Trago-vos aqui uma pequena explicação de como colocar os dados das balanças inteligentes da xiaomi no Ha, nomeadamente as balanças Xiaomi Miscale, e Xiaomi Miscale body composite 2 .

Screenshot_90 Screenshot_239

Estas balanças são compativeis com a integração Bluetooth Low Energy Monitor em que basta termos na mesma máquina do HA um ble tracker( tendo o PC bluetooth integrado muito possivelmente será compactível) .

Mas entretanto saiu também na versão stable do esphome a compatibilidade destas balanças, e gostando bastante desta integração e tendo já um esp32 como ble tracker para outros devices xiaomi ( termometros) a decisão foi fácil.

Requisitos:

. Ter um esp32 ( nodemcu ou wemos)
Screenshot_242

. Ter esphome instalado e com a ultima versão do add-on

. Ter uma das duas balanças xiaomi compactivéis : esta ou esta

. Ter o Hacs instalado.

. e mais… nada !

A partir daqui para quem está à vontade com esphome pode também seguir as indicações que tem na pagina dos links que coloquei atrás, porque basicamente foi isso que fiz.

Mas vamos lá ao passo a passo:

Criar um novo node no esphome com o seguinte código ou acrescentar os sensores do código que vou partilhar a seguir, caso já tenham algum device a fazer de ble tracker .( tenho vários tipos de devices ble da xiaomi e a balança parece-me ter pouco alcance, em relação a outros devices )

esphome:
  name: bluele2
  platform: ESP32
  board: nodemcu-32s

wifi:
  networks:
      ssid: !secret wifi_ssid          
      password: !secret wifi_password  

#  manual_ip:       # ao descomentar estas 4 linhas seguintes podem escolher ip fixo para o devices, coloquem os dados pretendidos, senão deixem comentado.
#    static_ip: 192.168.1.122
#    gateway: 192.168.1.1
#    subnet: 255.255.255.0 

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "bluele2 Fallback Hotspot"
    password: "6O5eBFSluFjG"

captive_portal:

# Enable logging
logger:

# Enable Home Assistant API
api:

ota:



# Configuration entry
esp32_ble_tracker:


sensor:

  - platform: xiaomi_miscale2
    mac_address: '5C:CA:D3:C7:B7:4C'
    weight:
      name: "Peso mi scal"
      id: weight_miscale
      on_value:
        then:
          - lambda: |-
              if (id(weight_miscale).state >= 75 && id(weight_miscale).state <= 95) {
                return id(weight_user1).publish_state(x);}
              else if (id(weight_miscale).state >= 50 && id(weight_miscale).state <= 70) {
                return id(weight_user2).publish_state(x);}

    impedance:
      name: "Xiaomi Mi Scale Impedance"
      id: impedance_xiaomi
      on_value:
        then:
          - lambda: |-
              if (id(weight_miscale).state >= 75 && id(weight_miscale).state <= 95) {
                return id(impedance_user1).publish_state(x);}
              else if (id(weight_miscale).state >= 50 && id(weight_miscale).state <= 70) {
                return id(impedance_user2).publish_state(x);}


  - platform: template
    name: Peso Ricardo
    id: weight_user1
    unit_of_measurement: 'kg'
    icon: mdi:weight-kilogram
    accuracy_decimals: 2
  - platform: template
    name: Impedancia Ricardo
    id: impedance_user1
    unit_of_measurement: 'ohm'
    icon: mdi:omega
    accuracy_decimals: 0
  - platform: template
    name: Peso Sandra
    id: weight_user2
    unit_of_measurement: 'kg'
    icon: mdi:weight-kilogram
    accuracy_decimals: 2
  - platform: template
    name: Impedancia Sandra
    id: impedance_user2
    unit_of_measurement: 'ohm'
    icon: mdi:omega
    accuracy_decimals: 0

Têm de adaptar o código a vocês , ou seja, por cada user que queiram gerar terão de inserir o intervalo de peso possível para essa pessoa. Por exemplo eu tenho o user1 “Ricardo” com intervalo de peso entre 75 e 95 e o user2 “Sandra” com intervalo de peso de 50 a 70.

Atenção que têm de colocar essas mesma condições de peso no sensor de impedância, para através do peso saber qual a pessoa que está a ser medida.

Se usarem a balança xiaomi mi scale não terão este valor de impedância, assim não precisam de colocar isso no código. Exemplo de código

Depois terão de compilar o código e flashar o esp32 com esphomeflasher ou mesmo através do add-on . ( não vou explicar esta parte ao detalhe pois não é essa a intenção do tutorial)

Ir ás integrações no HA e no Esphome deve ter aparecido um novo device.

Screenshot_243 Screenshot_244

E há-de aparecer um sensor de impedância e peso (mi scale body composite2 ) ou só de peso ( mi scale) Por cada utilizador que criaram.

Prontos nesta altura já têm os valores de peso e impedância(miscale2) no HA

Agora com estes dados podemos obter os indicativos de análise corporal e tê-los num card no HA para acompalhár-mos a evolução e sabermos em que nível estamos, está a chegar o verão temos de estar em forma :sunglasses:

- Então agora vamos instalar este reposítório no HACS, tem de ser adiccionado como repositório personalizado em Hacs/intergrações , como na imagem abaixo

Depois , seguir as indicações desse repositório, resumindo:

. colocar

bodymiscale: !include components/bodymiscale.yaml

no ficheiro configuration.yaml ;

. criar um ficheiro com o seguinte directório:

/config/components/bodymiscale.yaml

e dentro desse ficheiro colocar os dados de cada utilizador que tenham criado entidades no esphome:

ricardo:  # este código para a versão miscale, sem valor de impedância
  sensors:
    weight: sensor.peso_ricardo # aqui é a entidade criada pelo esphome
  height: 176
  born: "1990-04-10"
  gender: "male"
  model_miscale: "181D"
ricardo:   # este código para a versão miscale 2 , com valor de impedância
  sensors:
    weight: sensor.peso_ricardo    # estas duas entidade criadas pelo esphome
    impedance: sensor.impedancia_ricardo
  height: 176
  born: "1990-04-10"
  gender: "male"
  model_miscale: "181B"

Como exemplo coloquei só um, mas é só repetir a ideia por baixo, colando os dados de cada user.

Depois de reinicar o Home assistant , se tudo estiver bem, irá aparecer-vos uma entidade por cada Pessoa (bodymiscale.ricardo) com vários atributos .

Agora vamos colocar alguns destes dados num card do lovelace:

Screenshot_248

Deixo em baixo o código, em que utilizo um custom card bastante conhecido Bar Card

Neste código terão de editar as entidades e também as várias escalas que foram feitas neste meu exemplo conforme o que aparece na app mifit como tabela indicada para mim, logo estes valores de referência irão mudar de pessoa para pessoa. Neste card é a opção “severity”

Actualizado em 02/10/22 ---- Agora o componente bodymiscale cria uma entidade para cada parametro

type: custom:bar-card
entity_row: true
align: split
positions:
  title: 'off'
  minmax: 'off'
  value: inside
  indicator: outside
  icon: outside
entities:
  - entity: sensor.ricardo_bmi
    min: '0'
    max: '45'
    target: '22'
    severity:
      - from: '0'
        to: '18.5'
        color: blue
      - from: '18.5'
        to: '25'
        color: green
      - from: '25'
        color: yellow
        to: '28'
      - from: '28'
        to: '32'
        color: orange
      - from: '32'
        to: '45'
        color: red
    name: BMI
    positions:
      minmax: 'off'
      indicator: outside
    height: 50%
    width: 120%
    icon: mdi:human-handsup
  - entity: sensor.ricardo_body_fat
    min: '0'
    max: '45'
    target: '22'
    severity:
      - from: '0'
        to: '12'
        color: aqua
      - from: '12'
        to: '18'
        color: blue
      - from: '18'
        color: green
        to: '23'
      - from: '23'
        to: '28'
        color: darkkhaki
      - from: '28'
        to: '45'
        color: orange
    name: Gordura
    height: 50%
    width: 120%
  - entity: sensor.ricardo_water
    min: '0'
    max: '100'
    target: '63'
    severity:
      - from: '0'
        to: '55'
        color: orange
      - from: '55'
        to: '65'
        color: green
      - from: '65'
        color: lime
        to: '100'
    name: Água
    width: ' 120%'
    height: ' 50%'
    icon: mdi:water-alert
  - entity: sensor.ricardo_basal_metabolism
    min: '0'
    max: '3800'
    target: '2000'
    severity:
      - from: '0'
        to: '1851'
        color: orange
      - from: '1851'
        to: '3800'
        color: green
    name: Meta. Basal
    width: ' 120%'
    height: 50%
    icon: mdi:run
  - entity: sensor.ricardo_visceral_fat
    min: '0'
    max: '30'
    target: '9'
    severity:
      - from: '0'
        to: '10'
        color: green
      - from: '10'
        to: '15'
        color: orange
      - from: '15'
        color: darkkhaki
        to: '23'
      - from: '23'
        to: '28'
        color: red
      - from: '28'
        to: '45'
        color: orange
    name: Gordura Visc.
    width: ' 120%'
    height: 50%
    icon: mdi:hamburger
  - entity: sensor.ricardo_muscle_mass
    min: '0'
    max: '80'
    target: '55'
    severity:
      - from: '-2'
        color: orange
        to: '49.4'
      - color: green
        from: '49.4'
        to: '59.5'
      - color: lime
        to: '80'
        from: '59.5'
    name: Músculo
    width: ' 120%'
    height: 50%
    icon: mdi:weight-lifter
  - entity: sensor.ricardo_protein
    min: '0'
    max: '40'
    target: '20'
    severity:
      - from: '0'
        to: '16'
        color: orange
      - from: '16'
        to: '20'
        color: green
      - from: '20'
        color: lime
        to: '40'
    name: Proteína
    width: ' 120%'
    height: 50%
    icon: mdi:food-steak
  - entity: sensor.ricardo_bone_mass
    min: '0'
    max: '10'
    target: '3'
    severity:
      - from: '0'
        to: '2'
        color: orange
      - from: '2'
        color: green
        to: '4.20'
      - color: lime
        to: '10'
        from: '4.20'
    name: Massa óssea
    height: 50%
    width: ' 120%'
    icon: mdi:bone
  - entity: sensor.ricardo_weight
    name: Peso
    min: '40'
    max: '110'
    target: '77'
    severity:
      - from: '40'
        color: aqua
        to: '57.3'
      - from: '57.3'
        to: '77.4'
        color: green
      - from: '77.4'
        to: '86.7'
        color: darkkhaki
      - from: '86.7'
        to: '99.1'
        color: orange
      - from: '99.1'
        to: '110'
        color: red
    width: ' 120%'
    height: 50%
    icon: mdi:weight-kilogram
title: Ricardo
columns: '2'
animation:
  state: 'on'
  speed: '15'
decimal: '1'



E prontos basicamente é isto, de relembrar que este exemplo foi feito com a miscale2 , quem tiver a miscale1 as entidades terão menos atributos.

Agora podem colocar os valores também num gráfico, e por exemplo usar este tutorial para guardar estes dados a longo prazo e mais tarde ver a evolução ( ou a inflação :grin: )

Por fim podem também fazer algumas brincadeiras simples, com a alexa por exemplo:

Screenshot_250

[{"id":"771c5bfe.150ba4","type":"api-call-service","z":"df7ae171.a2e26","name":"1 de cada vez","server":"","version":1,"debugenabled":false,"service_domain":"notify","service":"alexa_media_3_r_echo_dot_de_ricardo","entityId":"","data":"{\"data\":{\"type\":\"announce\"},\"message\":\"<voice name='Ines'><lang xml:lang='pt-PT'> Um de cada vez na balança, por favor.</lang></voice>\"}","dataType":"json","mergecontext":"","output_location":"","output_location_type":"none","mustacheAltTags":false,"x":360,"y":940,"wires":[[]]},{"id":"dd199bfe.5515b8","type":"trigger-state","z":"df7ae171.a2e26","name":"BMI","server":"","exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityid":"bodymiscale.ze_pedro","entityidfiltertype":"exact","debugenabled":false,"constraints":[{"targetType":"this_entity","targetValue":"","propertyType":"property","comparatorType":">","comparatorValueDatatype":"str","comparatorValue":"10","propertyValue":"new_state.attributes.BMI"}],"outputs":2,"customoutputs":[],"outputinitially":false,"state_type":"str","x":150,"y":940,"wires":[["771c5bfe.150ba4"],[]]}]

Recursos paralelos e notas finais :

Se utilizarem a integração Bluetooth Low Energy Monitor terão de criar os vários utilizadores em yaml ou nod red, deixo aqui um link de um tópico no forúm internacional onde partilham código em yaml para users com peso diferente - link

Existe ainda outra possibilidade , esta em node red, que também abrange outra questão que pode vos acontecer, que é de er utilizadores com peso muito próximo e então precisa de existir outro tipo de confirmação para saber quem está a ser pesado, deixo aqui esse outro link
( hei-de precisar disto ou algo parecido no futuro, se alguém precisar de ajuda nesta questão em concreto posso também desenvolver mais este aspecto)

Como nota final espero que gostem deste pequeno tutorial, que serve nada mais do que dar a conhecer a possibilidade de integrar as balanças ble da xiaomi no Ha, pois o resto é fácil de seguir.

Um abraço ao pessoal do CPHA e aos utilizadores do grupo domótica portugal do telegram, pois aqui estão ideias também discutidas nesses canais.

3 Curtiram

@finipini excelente tutorial. Agora que baixei dos três digitos já posso meter os valores no HA…

:wink:

1 Curtiu

@finipini já agora uma pergunta, com o BLE a funcionar continuas a conseguir ver os dados na app ou só funciona um de cada vez?

Boas.

Primeiro que tudo obrigado pelo comentário, e já agora é bom começar a registrar quando estamos muito mal ( o meu caso) para ser mais fácil melhorar :grin:.

Aparece também na app. Neste tema em concreto o esphome é totalmente passivo, não faz request nenhum à balança só capta a info que a balança envia normalmente.

Não sei se é o caso da integração ble monitor. No esphome nestes devices ble fazem sempre questão de referir que os dados são “captados” de forma passiva e também fazem questão dizer " ao contrário de outras soluções". Eu não sei qual a diferença para outras soluções, para ser sincero.

1 Curtiu

Isso já é um bom principio e deverá dar para eu fazer o que quero. Obrigado!

Bom trabalho!!! uma questão o esphome necessita de estar relativamente perto da balança correto? eu instalei o HA via proxmox num portátil antigo que tinha e que tem bluehooth no entanto não estou a conseguir utilizar o bluetooth do portátil

Boas. Para usar o bluetooth do portátil tens de instalar esta integração do hacs https://github.com/custom-components/ble_monitor.

Agora tendo proxmox o teu problema pode ser não estares a conseguir passar o bluetooth para a máquina onde tens o HA, se for isso não te consigo ajudar que nunca usei proxmox. Com esphome tem de se usar um esp32 .

E sim a balança parece ter pouco alcance ble, pode ser também do meu esp32 , embora consiga obter dados de termometros noutras divisões. A balança tem de estar pelo menos na mesma divisão do esp, senão o esp não consegue receber os dados.

Yep, mas é mesmo assim. A potencia BLE de alguns equipamentos do género (balanças, medidores de pulsação, etc) é fraca para aumentar a duração das pilhas. Usei um medidor de batimento cardíaco quando andava de bicicleta e a bateria (CR2032) durou mais de 4 anos.


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


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