MicroBlocks 是快乐制造平台 – 阿立

前言

之前在 MicroBlocks 分享会上演示了如何使用 MicroBlocks 制作物联网设备(兼容 Home Assistant)。 将 MicroBlocks 与 Home Assistant 结合, 提供了一条通往 CodeLab 可编程空间 的理想途径。

本文将分享演示中涉及的代码,并提供教程帮助大家复现之前的演示。

接下来的内容分为以下 3 个部分:

安装并配置 Home Assistant 本地开发环境

安装 Home Assistant

Home Assistant 是个成熟的开源项目, 由于社区的努力, 每天都在变得更好。

要在本地运行 Home Assistant, 有许多种方式, 最简单的方式可能是使用 Docker。

首先安装 Docker, 把 Docker 看成一个普通软件安装在本地即可。

安装好 Docker 之后, 在命令行里运行以下命令,安装并启动 Home Assistant:

1
docker run -d --name homeassistant --restart=unless-stopped -e TZ=Asia/Shanghai -v config:/config -p 8123:8123 ghcr.io/home-assistant/home-assistant:2022.11.4

等待这条命令运行完, Home Assistant 就在本地运行起来了。

在浏览器中打开 http://127.0.0.1:8123。 第一次打开,需要填写一些信息,完成后便可进入 Home Assistant 控制面板。

管理 Home Assistant

如果需要管理正在运行的 Home Assistant, 以下命令或许有帮助:

  • docker start homeassistant: 启动 Home Assistant
  • docker stop homeassistant: 停止 Home Assistant
  • docker ps: 显示正在运行和已停止的 docker 容器

配置 Home Assistant

为了让 MicroBlocks 编程的物联网设备能够兼容 Home Assistant(在 Home Assistant 中管理它们), 我们需要在 Home Assistant 与设备之间建立沟通桥梁,有多种方式可以做到这点,出于以下原因,我选择 MQTT 作为通信管道:

  • 能够突破局域网的限制(只需要把 MQTT 服务器放到公网)
  • 能够获知设备是否离线(MQTT 遗言机制)
  • 方便调试(可使用 MQTT Explorer观察通信中的产生的消息)

为了建立 Home Assistant 与设备之间的通信管道,需要进行以下 2 个操作:

  1. 将 Home Assistant 连接到 MQTT 服务器上(考虑到通信的安全性, 我们应该使用独立的 MQTT 账号)
  2. 在 MicroBlocks 中将设备连接到 MQTT 服务器 (使用同样的的 MQTT 账号)

让我们先进行第 1 个操作, 在 Home Assistant 将 MQTT 集成进来。

首先打开集成页面(/config/integrations).

输入mqtt, 选择 MQTT。

我们需要一个 MQTT broker 和账号, 在这个实验里我使用的是 CodeLab MQTT broker

  • 服务器: mqtt.longan.link
  • 端口: 1883
  • 用户名: ha_mb
  • 密码: ha_mb

将这些信息填到页面:

至此就完成了在 Home Assistant 里配置 MQTT 的工作。

提醒: 建议使用独立的 MQTT 账号,如果你使用公开的账号(就像本文里的), 每个拥有用户名/密码的人都能够控制你的设备! 如果你需要独立的 MQTT 账号, 可以给我发邮件索要。 由于 MQTT 是标准协议,你也可以部署自己的 MQTT 服务器(MQTT broker)。

使用 MicroBlocks 为设备编程

接下来让我们使用 MicroBlocks 为物联网设备编程。

由于设备需要通过网络与 MQTT 服务器通信,你需要准备一个能够连接网络的编程板,我使用的是 ESP32。

在 MicroBlocks 中为板子刷入固件后,就可以开始编程了。

建议从这个程序模版开始 Demo template

我们先让这段程序运行起来,然后简单解释下这段程序做了什么。

为了让它运行起来,需要填入 wifi 信息。完成后就可以运行程序了!

程序运行之后,设备就会连到 MQTT 服务器上,由于 Home Assistant 也连到了同一个 MQTT 账号,于是我们就可以在 Home Assistant 上管理这个设备了!

MicroBlocks 会实时将程序刷到设备里,所以你可以随时断开 usb 连接。只要设备通上电,它就会运行这些程序。

提醒: 如果你不想使用本文公开的 MQTT 账号,你还需要填入你自己的 MQTT 账号信息。如果你使用自己的 MQTT 账号,也要修改 loop 积木里头的 MQTT 积木。

整合以上工作

顺利完成了以上工作后,设备应该已经接入到 Home Assistant。

怎么找到设备呢?

打开实体注册表(/config/entities), 你将看到这两个设备:

设备既然已经接入 Home Assistant, 接下来我们就可以把它们放到仪表盘上。

仪表盘 里添加你要的设备(实体):

完成后你就可以在仪表盘上管理风扇,并查看温度。

解释细节

前边 MicroBlocks 的程序,为何能够将设备注册到 Home Assistant 里, 并允许 Home Assistant 管理它呢?

答案是这个 MicroBlocks 程序实现了 Home Assistant 兼容的 MQTT 协议。

Home Assistant 公开了一份MQTT 协议, 任何实现这个 MQTT 协议的程序(无论是否运行在硬件上), 都能够与 Home Assistant 交互, 包括以下交互:

  • 发现设备: 将设备注册到 Home Assistant
  • 获取传感器信息、控制执行器
  • 更新离线与在线状态

通过查看 MicroBlocks 程序的自定义积木,对照着 Home Assistant 的 MQTT 协议,你可以弄懂具体是怎么实现的。

弄懂这些以后,你就可以将任何设备接入进来了!

为了帮助你弄懂它们,让我们进一步深入到细节里。

MicroBlocks 程序管理着两个设备(典型的做法可能是只管理一个设备):

  • 风扇(fan)
  • 温度传感器(temperature)

展开 loop 积木, 你就能够看到来自 Home Assistant 的 MQTT 消息是如何控制风扇的:

温度传感器相关的代码在这里:

进阶

长期运行

为了让你的物联网系统长期运行,你需要将 Home Assistant 跑在一个不关机的设备上,社区里流行的做法是跑在树莓派上

提醒: 如果你在安装 Home Assistant 操作系统 时遇到困难(通常是因为没有翻墙导致的), 可以试试采用 Docker 安装, 和前头一样,安装完 Docker 之后, 只需一行命令即可安装 Home Assistant。

完成之后, 在浏览器里访问 http://树莓派的IP:8123, 即可访问到树莓派里的 Home Assistant。

API & AI

Home Assistant 开放了它的 API:

使用 MicroBlocks 将设备变为 Home Assistant 兼容设备之后,我们就可以使用 Home Assistant 的 API 驱动这些设备。通过简单包装这些 API(诸如使用 Python/Snap/Scratch), 就可以将可编程空间变为一个教学环境。

由于这些 API 整洁而通用, 你可以将它们投喂给大语言模型, 这样一来, 就可以让 AI 来管理你的可编程空间了。

如果你想探索 AI 与物联网之间的协作,我最推荐的做法是, 把这些 API 包装为 LangChain 的 Agent(Tool), 然后让 GPT-3.5/GPT-4 操作它。

还有一个与 AI 有关的有趣方向是,将 Home Assistant 语音/意图(今年是 Home Assistant 的语音之年)与大语言模型结合。

参考