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 .
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)
. 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:
1º 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)
2º Ir ás integrações no HA e no Esphome deve ter aparecido um novo device.
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
- 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:
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 )
Por fim podem também fazer algumas brincadeiras simples, com a alexa por exemplo:
[{"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.