星路

追寻那一缕星光,在漆黑夜晚前行

0%

精简下斐讯TC1固件

某天百度发现有大佬把斐讯TC1的固件(基于MiCO开发)给做出来了,犹豫再三还是剁手了,因为家里的排插真的好多了,又需要新的编程器。不过真香,六插孔+USB充电确实实用。想着原来固件的功能有的自己用不上,看了下代码结构挺简单的,于是精简了一下功能,分享下折腾记录吧。


0. update

  • 2019-09-27
    经反馈会有断外网重启的bug,查看代码貌似只有SNTP同步时间会联外网,于是尝试调整了一下SNTP相关代码(编译固件也可以把main.csntp_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 bash

    Tips

    后续进入容器可以用命令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/MiCoder

    Tips

    mico-cube是MXCHIP的MiCO项目开发管理工具包;MiCoder是MiCO编译和调试系统必须的工具软件包。


3.编译固件

  • 创建一个空项目,名为TC1,自己开发则自定义

    1
    2
    3
    #容器bash
    cd /workdir && \
    mico new TC1 --create-only

    Tips

    命令执行完后,会在当前目录生成名称为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
    //自定义
    #define ZTC_NAME "tc1_%s" //设备名称模板,默认生成的设备名称为tc1_{{MAC地址}},PS:如修改要保留%s,将填充MAC地址
    #define CONFIG_SSID "wifi_ssid" //WiFi名称
    #define CONFIG_USER_KEY "wifi_password" //WiFi密码
    #define CONFIG_MQTT_IP "mqtt_ip" //MQTT服务器IP
    #define CONFIG_MQTT_PORT 1883 //MQTT服务器端口
    #define CONFIG_MQTT_USER "mqtt_user" //MQTT用户名
    #define CONFIG_MQTT_PASSWORD "mqtt_password" //MQTT密码
    #define STATE_UPDATE_INTERVAL 10000 //功率上报间隔,单位ms
    #define MQTT_CLIENT_SUB_TOPIC "cmnd/%s" //命令控制接收topic,%s取ZTC_NAME(默认tc1_{{MAC地址}}),PS:请勿修改此处,可修改ZTC_NAME
    #define MQTT_CLIENT_PUB_TOPIC "stat/%s" //状态信息topic,%s取ZTC_NAME(默认tc1_{{MAC地址}}),PS:请勿修改此处,可修改ZTC_NAME
    #define USER_CONFIG_VERSION 3 //修改为与上次固件不同,触发重新加载信息(线刷可忽略)
  • 编译项目代码

    1
    2
    3
    #容器bash
    #/workdir/TC1
    mico make TC1@MK3031@moc

4.刷固件

  • 编译成功后的固件文件

固件路径

主机映射目录/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文件。另外文件名不要含特殊符号。


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语言看着真的头大,又感觉到了被指针支配的恐惧,还好原固件作者代码的业务逻辑还是比较清晰,于是就简单地改一改。