积木化编程与智能家居

1.1 世界是事实的总和,而非物(das Ding)的总和 -- 维特根斯坦《逻辑哲学论》

我在上篇文章: Scratch3 Lab: 将Scratch3接入开源硬件及AI的实验项目里写道:

我们的兴趣是将Scratch3.0连接到有趣的开源硬件和AI上,甚至也包括接入你童年的那辆玩具四驱车

但你知道,有趣的硬件开源有时候不是并肩而行的,好在开放似乎正在成为一种趋势和竞争优势,商家们即便不开源他们的硬件,却也为了扩大自己的影响力和市场份额,积极地以各种方式开放自己的一部分,以便与外部连接。为了让事情变得更有趣,我们决定进一步扩大Scratch3.0的连接范围,除了开源硬件之外,也接入遵循标准协议或提供sdk的硬件

我们最近接入的一套硬件是米家的智能家居礼品装,它长这样

套件里包含:

  • 米家多功能网关
  • 米家智能插座
  • 米家无线开关
  • 米家人体传感器
  • 米家门窗传感器

智能家居

在这个被媒体称为人工智能的时代,每个人对智慧/智能都能说出自己的一堆见解、偏见或幻想

以至于一大堆标着智慧前缀的酒瓶里,有卖假酒的、有卖碳酸饮料的、有卖来自阿尔卑斯山脉的矿物质水的,以及卖梦想的

维基百科上与智能家居最近的一个词条是智慧家庭,其中这个阐述,我觉得很清晰:

家庭自动化 (Home automation) ,是指家庭中的建筑自动化,也被称作智慧家庭 (Smart home)

相比于智能,自动化的可操作性要强很多

在技术视角下,今天的智能家居往往是那些用于实现家庭自动化的家庭设备,他们是一些传感器和执行器。它们与网关进行通信,所以智能家居一般作为物联网的子概念

智能家居的痛点

碎片化

目前市面上有琳琅满目的智能家居设备,碎片化问题十分严重

如维基百科所言:

虽然目前有很多竞争厂商,然而却没有多少世界共通的工业标准,智慧家庭空间严重的被碎片化。[2] 制造商有时会透过扣留文件以及诉讼来阻止独立的实作。[3]

这些散落的设备虽然像莱布尼茨的单子一样受到欲求(appetition)的驱动(主要是受到提高销量的欲求的驱动),但却不像莱布尼茨的单子那样,肯多去和其他单子交流

如果你买到手的智能家居之间无法协同工作,那它们和咸鱼有什么区别,那它们还怎么用来实现家庭自动化?仅仅是因为你买了A厂家的智慧灯泡,B厂家的智慧开关,你按下开关,得到的却是404,你此刻得到的除了对google的思念之外还有啥。你恨不能拿一瓶涂改液把外包装上的智能改为智障

智能家居目前处在诸侯割据,度量衡没有统一的战国。这个问题该如何是好?

要有光

让我们抡起技术的锤子,来看看有什么钉子值得敲一敲。

对一个程序员来说,首先想到的可能是thefuck代理(proxy),我们只要把各家的硬件放在代理之下,似乎就能在上层抽象地调用它们,你在代理中去实现各个硬件的通信细节,对外都暴露统一的的接口,对于一盏灯,我至少应该能调用两种接口/服务:

  • open
  • close

对于功能更强的,还可以控制亮度和颜色。

至于功能更强的,我还可以让它播放一首歌,购买一个商品,或是让它去兜售我的隐私,哦不对,兜售隐私似乎是个互联网软件都能做,不需要很强的功能;对于更强的,我还可以对他说hi 神灯,我能实现你的三个愿望, 再做下去,功能冗杂得要像某宝和某信了,我们不需要一个伪装成操作系统的电灯:)

事实上,如果一件事值得做,很可能已经有人在做它了,你与这些成熟项目的距离只差google和github。一个叫Paulus的程序员实现了上边的这些,他构建了一个叫home-assistant的Python程序,把各个碎片拼在了一起,home-assistant可以接入所有主流的智能家居设备

home-assistant的核心是个事件系统,它使用状态机来管理设备,系统代理了设备,对外提供服务,它的架构图如下:

架构图

关于home-assistant,Paulus的这个演讲十分精彩,视频的20:49中,Paulus熄灭hello,world文件被创建的一瞬,Paulus如同表演了一场街头魔术,观众的掌声里,Paulus的反应十分有趣: 从惊喜到羞涩再到得意。演示亲手构建的程序有时候和表演一场魔术带来的喜悦是很相似的:你对精心设计的魔法颇为自得,观众在演出里,被你带入预设的情境下,他们陷入谜团,感受震撼和惊喜

home-assistant的架构和我为Scratch3插件系统做的架构设计十分相似

这两个系统本质上都是事件系统,也都基于Python构建

生命苦短,我用Python

我把事件构建在消息之上(zeromq的世界观是everything is message),我想让这个插件系统是跨语言的,而zeromq是我觉得最佳的解耦方案。Paulus选择在Python语言层做这件事,当然Paulus也做到了跨语言,通过对外提供服务实现。

维特根斯坦在《逻辑哲学论》的第一个论题里说

1 世界就是所发生的一切东西

接着他阐述:

1.1 世界是事实的总和,而非物(das Ding)的总和

他在论题2中阐述

2 那发生的东西,即事实,就是原子事实的存在

这或许可以解释为何事件系统和状态机拥有如此强大的表现力

自动化规则

智能家居允许你自定义规则来实现家庭自动化,你可能会定义出如下的规则:

  • 当我到家的时候,把空调打开
  • 当我离开房间的时候,把灯关了

如何为普通用户提供一个友好的的界面,让他们方便地定义规则,这不是件容易的事。

定义规则,听起来很适合用代码来做这件事,但大众不会编程,这句话没有指责或沾沾自喜的意味,在此我并不是说大众是麻瓜。会编程是一件挺酷的事,它极大地赋予了你创造的可能,但这个和会写作、会钢琴、会滑雪没有本质区别,你通过练习获取一项技能来取悦自己。另有些人把时间花在了博览言情小说或纸飞机制作上。每个人的际遇和兴趣各不相同,并不是所有人都有机会写代码,也不是所有人都觉得这是一件和旅行、看电影一样有趣的事。

我们这些会编程的人如何为他人提供一个不错的工具,就像他们为我们提供的好看的旅行照片和影评那样,让他们解决家庭自动化的问题同时也领略编程乐趣。

市面上的解决方案,我觉得都不大理想,如果你用过米家你就知道我在说什么(事实上它已经是这个行业目前最好的方案之一了),在米家中你为你的智能家居设备们编写规则,仿佛是在进行中文编程,一个页面只够你表达一个if-else逻辑,为了实现如果开关打开,就把灯打开这个逻辑,你可能需要来回切换5、6个页面。这里只连接了2设备,只有一个if逻辑!

如果你有3个房间的设备,为它们编写一天时段里的自动化规则,你可能需要先考虑升级一下大脑

同样是上边的规则,我把米家的智能家居套件接入Scratch3之后,可使用如下积木来表达

你在米家里拖拽来回切换5、6个页面折腾出的东西,和上边拖2个积木表达的语义是完全相同的。但撰写规则的过程要舒服很多。不仅编程规则要直观和舒适很多,你还可以在Scratch中即时对每个不熟悉的积木做实验,而不必等你把规则一次写完才能看效果,这很像程序员使用REPL时的愉快感受。你对每个积木的属性一览无余,之后在一个界面中,去拼搭组合它们,而不必在多个页面中来回切换。撰写规则变成了轻松的堆叠积木

Scratch社区有许多案例和报告,解释为何积木化是适合普通人编程的方式,关于这点,之后有空细说

我们把米家的智能家居套件接入Scratch3之后,它获得了更多的扩展性,诸如下边的视频里,我们演示如何让你徒手隔空为水壶通电并开灯

我在Scratch的舞台上中拖拽了两个按钮,当我的手在视频里按下左边的按钮,则开灯并让水壶开始烧水,而我隔空按下右边的按钮,就将它们都断电

技术层面,通过运动检测来做到这点,而运动监测在scratch3里也只是一个积木块而已

在Scratch3 Lab中,我们将把各类有趣的开放硬件和AI接入,允许你做各种有趣的事情,目前接入的硬件和AI在陆续增多,米家的智能家居套件是我门接入智能家居的第一步

空间编程

空间编程是一个让我着迷的概念,你的空间会对你的行为做出相应的反应,诸如在你的房间里,当你睡觉的时候,灯光自动熄灭,当你起床时,窗帘自动打开。

可如何判断你何时是"睡觉模式"呢?

你当然可以用一些生物传感器来做(事实上我正准备买这些东西),或者简单地使用机器视觉来做,你可以教会机器什么时睡觉模式,诸如你躺下盖了被子时候,告诉Scratch这是睡觉状态,起床掀开被子后告诉Scratch,这是起床模式,这变成了一个很简单的二值分类问题,你需要的样本数据和计算量都很小,目前在本地网页里很轻松就做到了,如果使用我之前设计的Scratch插件系统,更复杂的机器视觉可以移到另一台机器做也没问题,对用户你只需暴露出Scratch3的积木。这块我在自己的房间里实现了,目前还没有上线到Scratch3 Lab。

为一个空间编程常常需要AI和物联网的配合

AI善于提取出模式,对这个模式做出怎样的响应,可以通过调度物联网里的硬件实现。而空间所拥有的智慧,则是这些彼此响应的事件关系网。

我和几个朋友一起在南京开了家青旅,开业小半个月,还蛮热闹的,我们想在这个空间里做一些好玩的尝试。我们都是二楼南书房的忠实粉丝,我们在青旅里做了很多有意思的小空间,让大家方便看书和讨论,也会定期组织一些周末沙龙和电影放映活动。如果你也喜欢看书或旅行,你有好的想法,都欢迎过来玩

我准备在青旅里边做一些有意思的空间编程尝试,诸如当你夜里坐下翻开书的瞬间,灯才为你打开,而你合上书思考的时候,灯将熄灭,你将沉浸在自己的世界里 :)

Just for fun




Fork me on GitHub