PVE + HomeAssistant + ESPHome
Today let’s try out this ESP32-C3-12F dev board that costs only $5 (domestic shipping included) but has 3 power supply mode (AC 220V, DC 7~12V and microUSB, which is super convenient!) and a relay to turn my ordinary led light strip to be a remote controlled.
记得上次玩Arduino已经是2014年的事情了,那会儿用的还是ATMega系列的MCU,装专用IDE,写的C lang。
近10年后,感觉家用IoT玩的都是ESP和Pico了。至于开发语言,常青树C lang自然还有的,但大多视频教程则是外行更容易上手的Micro Python、Lua乃至只要配个yaml config的ESP Home —— 可见贵圈也很卷。
今天搞的是这块ESP32-C3-12F,带wifi、蓝牙BLE和一路继电器,以上都属于一般配置。比较巴适的是,这货带三模供电,AC 220V、DC 7~12V,以及MicroUSB,这就很方便了,省一个手机充电头。
废话少叙,先看实验结果吧。
服务器自然是Proxmox VE Home Server上的vm,数据内网本地化存储(2C 2G 32G即可),公网使用走ddns没毛病。
【注】HAOS(Home Assistant Operating System)的部署有N多选择。支持X86物理机、至少三种VM(kvm、vbox、vmware)、三种主流操作系统(Linux、Win、MacOS),两种容器(docker、lxc)、以及包括树莓派在内的至少三种SBC…… 这友好程度,你要说自己小白不会安装,都对不起开发者。只是这里要注意,选择安装方式一定要带上Supervisor,否则无法支持ESPHome扩展,详情参阅官网文档。
HAOS装好后,打开web服务,安装ESPHome的插件,打开后就能开始设计ESP固件了。
比如已经上线的这个 lvrm-switch-env-sensors ,具体配置是这样的,跟着官网文档就是分分钟的活儿。
当然如果想写组合、联动也都有范例参考,ESPHome自身可以在单机固件内做联动,然后HA可以多设备之间做场景联动,比乐高还积木有木有。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
esphome: name: "lvrm-switch-env-sensors" platformio_options: board_build.flash_mode: dio esp32: board: esp32-c3-devkitm-1 framework: type: esp-idf # Enable logging logger: # Enable Home Assistant API api: encryption: key: "5fghjkldfghjkl=" ota: password: "4dfghjkldfghjf" wifi: ssid: !secret wifi_ssid password: !secret wifi_password # Enable fallback hotspot in case wifi connection fails ap: ssid: "lvrm-switch-env-sensors" password: "Rfghjkldfghj" time: - platform: sntp id: sntp_time timezone: Asia/Shanghai switch: - platform: gpio pin: 19 name: "power-switch" restore_mode: ALWAYS_ON spi: - id: spi_a clk_pin: 5 mosi_pin: 4 display: - platform: max7219 cs_pin: 7 num_chips: 1 lambda: |- char tm_str[8]; time_t currTime = id(sntp_time).now().timestamp; strftime(tm_str, sizeof(tm_str), "%H.%M", localtime(&currTime)); it.printf(0, "%2.0f.%2.0f.%s", id(bme280_temp).state, id(bme280_humid).state, tm_str); // it.strftime(3, "%H.%M", id(sntp_time).now()); text_sensor: - platform: template name: Uptime Human Readable id: uptime_human icon: mdi:clock-start i2c: - id: bus_a sda: 10 scl: 18 scan: true sensor: - platform: bme280 i2c_id: bus_a address: 0x76 temperature: id: "bme280_temp" name: "BME280 Temperature" pressure: id: "bme280_pressure" name: "BME280 Pressure" humidity: id: "bme280_humid" name: "BME280 Humidity" update_interval: 180s - platform: template name: "BME280 Dew Point" unit_of_measurement: "°C" icon: "mdi:thermometer-water" lambda: |- const float a = 17.625; // const from https://www.omnicalculator.com/physics/dew-point const float b = 243.04; // const from https://www.omnicalculator.com/physics/dew-point float alpha_t_rh = (id(bme280_temp).state * a) / ( b + id(bme280_temp).state) + logf (id(bme280_humid).state/100); return ( b * ( alpha_t_rh ) )/( a - ( alpha_t_rh ) ); accuracy_decimals: 1 update_interval: 180s - platform: wifi_signal name: "WiFi Signal Sensor" update_interval: 300s - platform: uptime name: Uptime Sensor id: uptime_sensor update_interval: 300s on_raw_value: then: - text_sensor.template.publish: id: uptime_human state: !lambda |- int seconds = round(id(uptime_sensor).raw_state); int days = seconds / (24 * 3600); seconds = seconds % (24 * 3600); int hours = seconds / 3600; seconds = seconds % 3600; int minutes = seconds / 60; seconds = seconds % 60; return ( (days ? to_string(days) + "d " : "") + (hours ? to_string(hours) + "h " : "") + (minutes ? to_string(minutes) + "m " : "") + (to_string(seconds) + "s") ).c_str(); |
yaml配置文件校验通过后,选择手动下载,固件会自动开始下载依赖并开始编译。
编译是跑在HAOS上,此处用的是PVE server运算资源(而非浏览器),编译完成后,浏览器自动弹出 .bin文件保存到本地。
第一次下载依然是传统艺能,RS232烧写。但这个浏览器直连serial就有点先进了,看来坚持几十年的串口调试助手没市场了。
板子这边,ESP32-C3-12F是上电时把IO9拉低,进入等待固件状态。浏览器操作串口直接擦除出厂固件,刷入ESPHome。
第一次烧录完成后,下电,IO9置空(去掉拉低),接上BME280传感器(使用了IO3和IO4引脚做I2C的SDA和SCL),上电等板子上线wifi。
板子上线后,就可以直接在线读到板子的log了。板子走2.4G wifi,可以看到ip地址、信号强度、I2C总线扫描结果等细节。
测试结果没问题,自制个小盒,把板子连到220V AC供电,扔到吊顶上控制灯带去。
Web页面编辑一下HA的dashboard,手机装上HA app,地址直接输入过ddns的公网域名就搞定,不管在家在外都一样控制。
至此,一个数据本地化存储的IoT home server的原型就搭建完成了。据说粗粮家的蓝牙传感器也都可以不上云直接走BLE报数据到HA,最近忒忙,以后找机会慢慢搞咯。
文章的脚注信息由WordPress的wp-posturl插件自动生成