『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 16308|回复: 3

[基础教程] 小米体重秤通过ESP接入HASS

[复制链接]

19

主题

166

帖子

1678

积分

论坛技术达人

积分
1678
金钱
1497
HASS币
40
发表于 2021-5-11 20:08:15 | 显示全部楼层 |阅读模式
本帖最后由 yunsean 于 2021-5-15 09:02 编辑

注意,是小米体重秤,不是体脂秤。
描述:
本来esphome已经支持小米体重秤的接入,但是有两个问题:
第一个,搞不懂写这个代码的人是没有理解中国斤和公斤的换算关系还是其他原因,反正就是逻辑有问题,上原始代码原图:
WX20210511-195328.png
测试开始的时候一直感觉数据不对,看这个代码,没搞懂是要换算成公斤还是斤或者其他单位。
然后,就想办法修改他的代码,直接在系统环境中搜索xiaomi_miscale.cpp文件,找到位置:
/usr/local/lib/python3.8/site-packages/esphome/components/xiaomi_miscale/xiaomi_miscale.cpp
打开修改之:
``` c++
  // weight, 2 bytes, 16-bit  unsigned integer, 1 kg
  const int16_t weight = (uint16_t(data[1]) | (uint16_t(data[2]) << 8));
  if ((data[0] & 0x10) == 0x10)
    result.weight = weight * 0.01f * 0.5;  // unit 'jin'
  else if ((data[0] & 0x03) == 0x03)
    result.weight = weight * 0.01f * 0.453592;  // unit 'lbs'
  else
    result.weight = weight * 0.01f;

  return true;

```
修改后,按照esphome官网的介绍,基本可以工作了(注意。
但是:
第二个问题:没有处理稳态和人下来后的问题,现象就是人在上边晃(还没有稳定的时候),home assistant中的数据一直在变,如果自动化检测数据变化就播报,会把TTS给累死。
当然,可以继续修改,不过这个时候发现esphome还有一个强大之处:可以使用esp32_ble_tracker直接读取蓝牙的广播消息,所以,想到上边这种修改esphome源码的方法,如果esphome升级,那么就得重新修改,毕竟不是长远之计,所以打算绕路:
放弃xiaomi_miscale组件,直接使用esp32_ble_tracker的on_ble_service_data_advertise来实现,官网说明:
https://esphome.io/components/es ... vice-data-advertise

最终实现(注意是修改esphom配置,不再改源码了,上边的修改也不需要了,因为压根儿不用它):globals:
  - id: is_stabilized
    type: bool
    restore_value: no
    initial_value: '0'  
  - id: load_remove
    type: bool
    restore_value: no
    initial_value: '1'  
  - id: last_weight
    type: float
    restore_value: no
    initial_value: '0'  

esp32_ble_tracker:
  on_ble_service_data_advertise:
    - mac_address: '88:0F:10:99:5D:CC'
      service_uuid: 181D
      then:
        - lambda: |-
            bool isStabilized = ((int)x[0] & 0x20) != 0;
            bool loadRemoved = ((int)x[0] & 0x80) != 0;
            float weight = (int(x[1]) | (int(x[2]) << 8)) * 0.01;
            if (((int)x[0] & 0x10) == 0x10)
              weight = weight * 0.5;
            else if (((int)x[0] & 0x03) == 0x03)
              weight = weight * 0.453592;
            if (isStabilized)
              id(weight_mi_scale).publish_state(weight);
            else if (loadRemoved && !id(load_remove) && id(last_weight) > 0)
              id(weight_mi_scale).publish_state(id(last_weight));
            id(last_weight) = weight;
            id(load_remove) = loadRemoved;
            id(is_stabilized) = isStabilized;


sensor:
  - platform: template
    name: Weight Mi Scale
    id: weight_mi_scale
    unit_of_measurement: 'kg'
    icon: mdi:weight-kilogram
    accuracy_decimals: 2
    on_value:
      then:
        - lambda: |-
            if (id(weight_mi_scale).state >= 60 && id(weight_mi_scale).state <= 70) {
              return id(weight_dad).publish_state(x);
            } else if (id(weight_mi_scale).state >= 20 && id(weight_mi_scale).state < 30) {
              return id(weight_baby).publish_state(x);
            } else {
              return id(weight_other).publish_state(x);
            }
  - platform: template
    name: Weight Dad
    id: weight_dad
    unit_of_measurement: 'kg'
    icon: mdi:weight-kilogram
    accuracy_decimals: 2
  - platform: template
    name: Weight Baby
    id: weight_baby
    unit_of_measurement: 'kg'
    icon: mdi:weight-kilogram
    accuracy_decimals: 2


后边的根据体重识别人,的方式,来自于xiaomi_scale组件,参考:
https://esphome.io/components/sensor/xiaomi_miscale.html

esphome很神奇!


评分

参与人数 1金钱 +16 收起 理由
dscao + 16 感谢楼主分享!

查看全部评分

回复

使用道具 举报

25

主题

640

帖子

2913

积分

金牌会员

Rank: 6Rank: 6

积分
2913
金钱
2263
HASS币
40
发表于 2021-5-12 02:09:08 | 显示全部楼层
我擦,佩服楼主精力无限!
回复

使用道具 举报

30

主题

493

帖子

4795

积分

论坛元老

佑桑

Rank: 8Rank: 8

积分
4795
金钱
4287
HASS币
156

教程狂人

发表于 2021-5-12 11:36:31 | 显示全部楼层
result.weight = weight * 0.01f * 0.5;  // unit 'jin'

這裡的斤感覺比較像台斤
一台斤 = 0.6 公斤
ASRock H370 PRO4, 48GB, 8TBx3 + 2TBx3
ESXi 6.7 + Ununtu + Docker + HASS.IO -> Homeassistant OS
(Home Assistant Supervised 官方文件)
回复

使用道具 举报

19

主题

166

帖子

1678

积分

论坛技术达人

积分
1678
金钱
1497
HASS币
40
 楼主| 发表于 2021-5-12 16:27:54 | 显示全部楼层
chinyaolin 发表于 2021-5-12 11:36
這裡的斤感覺比較像台斤
一台斤 = 0.6 公斤

好吧,原来如此,但这和体重秤本身的斤就不匹配了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-27 04:22 , Processed in 0.197663 second(s), 30 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表