某天百度发现有大佬把斐讯TC1的固件(基于MiCO开发)给做出来了,犹豫再三还是剁手了,因为家里的排插真的好多了,又需要新的编程器。不过真香,六插孔+USB充电确实实用。想着原来固件的功能有的自己用不上,看了下代码结构挺简单的,于是精简了一下功能,分享下折腾记录吧。
0. update
- 2019-09-27
经反馈会有断外网重启的bug,查看代码貌似只有SNTP同步时间会联外网,于是尝试调整了一下SNTP相关代码(编译固件也可以把main.c
的sntp_init();
去掉不要sntp功能),要是还解决不了我也木办法了{摊手}
1. 改动说明
基于原固件v0.10进行修改:
- 设定WIFI和MQTT设置直接烧录,懒得再装APP了
- 去掉UDP通信功能,只保留MQTT通信功能
- 去掉插座命名、定时功能,这块用Home Assistant来管理
- MQTT通信协议根据自己使用习惯进行了调整:调整topic、增加上线下线通知、使用qos
- 把编译的warning警告基本去掉了
注意
因为精简掉UDP通信协议,使用上会造成不方便,精简带来的好处实际也不明显,请自行权衡。
2. 编译环境
使用docker,docker安装方法传送门。
拉一个python2.7的镜像
1
docker pull python:2-slim-stretch
启动容器并进入容器
1
2#自己调整主机映射目录/home/mico;容器内工程目录设置为/workdir,可根据喜好调整,但注意后续命令也要调整。
docker run -it --name mico -v /home/mico:/workdir python:2-slim-stretch bashTips
后续进入容器可以用命令docker exec -it mico bash,更多docker命令介绍传送门。
更新源、安装软件
1
2#容器bash
apt update && apt install git wget lib32ncurses5一个坑
不安装lib32ncurses5库编译会报"arm-none-eabi-gcc: not found"错误。
python bin
1
ln -s /usr/local/bin/python /usr/bin/python
一个坑
不设置软链接编译会报"/usr/bin/python: not found"错误。
安装MiCo编译环境(mico-cube、MiCoder)
1
2
3
4
5
6
7#容器bash
pip install mico-cube && \
cd /workdir && \
wget http://firmware.mxchip.com/MiCoder_v1.1.Linux.tar.gz && \
tar -zxf MiCoder_v1.1.Linux.tar.gz && \
rm MiCoder_v1.1.Linux.tar.gz && \
mico config --global MICODER /workdir/MiCoderTips
mico-cube是MXCHIP的MiCO项目开发管理工具包;MiCoder是MiCO编译和调试系统必须的工具软件包。
3.编译固件
创建一个空项目,名为TC1,自己开发则自定义
1
2
3#容器bash
cd /workdir && \
mico new TC1 --create-onlyTips
命令执行完后,会在当前目录生成名称为TC1项目目录。
添加mico-os组件
1
2
3#容器bash
cd /workdir/TC1 && \
mico add https://code.aliyun.com/mico/mico-os.git/#6c465211d3ff8797cd835e400ec54a06530dd476注意
需要在项目目录下执行。
添加项目代码,代码目录在项目目录下的
项目同名目录
,/workdir/TC1/TC1,自己开发则自定义1
2
3
4#容器bash
git clone https://github.com/cnk700i/tc1_mqtt.git && \
mv tc1_mqtt/TC1 . && \
rm tc1_mqtt -r手动解压
下载zip解压后再拷贝进去也可以。
设置WiFi及MQTT,修改项目代码main.h文件
1
2
3
4
5
6
7
8
9
10
11
12//自定义
编译项目代码
1
2
3#容器bash
#/workdir/TC1
mico make TC1@MK3031@moc
4.刷固件
- 编译成功后的固件文件
/workdir/TC1/build/TC1@MK3031@moc/binary/TC1@[email protected]
,用于线刷/workdir/TC1/build/TC1@MK3031@moc/binary/TC1@[email protected]
,用于OTA
固件路径
主机映射目录/home/mico/TC1/build/TC1@MK3031@moc/binary内可找到固件。
线刷方法略,见原固件教程的固件烧录
OTA则使用MQTT客户端,例如MQTT.fx,发送消息给TC1触发OTA。
- topic
1
"cmnd/tc1_{{MAC地址}}"(如修改设备名称模板ZTC_NAME,则填写"cmnd/{{设备名称}}")
- content
1
2
3
4
5
6{
"setting":
{
"ota":"{{ota.bin的http下载地址}}"
}
}http服务
可以用Http File Server之类的免安装工具搭建http服务器,使用浏览器测试打开链接可以直接下载bin文件。另外文件名不要含特殊符号。
- topic
5.接入homeassistant
启用homeassistant的mqtt组件的自动发现,重启HA,再重启TC1(断电再接电)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15{{HA配置目录}}/configuration.yaml
mqtt:
mqtt:
# MQTT Broker的IP地址或者域名
broker: xx
# MQTT Broker的端口号,缺省为1883
port: xx
# 用户名
username: xx
# 密码
password: xx
# 自动发现
discovery: true
# 自动发现topic前缀,与固件设置的一致
discovery_prefix: homeassistant
Tips
TC1在启动的时候往Topic{discovery_prefix}/{component}/{node_id}/{object_id}/config
发送配置信息,HA根据配置信息生成entity。
5.小结
- MiCo开发平台比之前DC1用的ESPHome容易上手好多,搭建环境也简单些,遇到一些小坑还是比较快就解决了。
- C语言看着真的头大,又感觉到了被指针支配的恐惧,还好原固件作者代码的业务逻辑还是比较清晰,于是就简单地改一改。