IRMQTT-X12红外空调windows环境下接入homekit

前言

本文主要讲解如何利用论坛的某动x12(irmqtt)接入homekit实现空调控制。
开篇先感谢iob论坛,以及nrhb、iob群里的各位大佬,是你们造好的轮子才让我们的车跑了起来。
此篇教程针对0基础的小白,目的是为了让更多对智能家居有兴趣的同学可以项目为目标来学习和理解智能家居的基本运作方式和原理,因此很多自定义的设置文章并未展开说明,避免同学们遇到自己无法解决的问题而对智能家居敬而远之。
同时此文也是为了作为自己的学习笔记梳理思路,如有理解错误的地方,还希望大佬们能够指正。

本教程外部网络环境已处于科学状态,因为很多组件是命令行模式下自动安装的,默认连接的地址有可能在网络不科学的情况下很慢,所以建议要跟着教程学习的同学,先把自己的网络环境变为科学最佳。否则可能会进行不下去。

一些学习

mqtt

相信很多刚开始想学习智能家居的同学在浏览论坛或者其他文章的时候经常会发现这个词,那么它究竟是什么呢?

百度百科:MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个消息中间件

更详细的介绍,大家可以自行查阅,通俗地打个比方,你可以把mqtt当作机器与机器之间(m2m)使用的微信,它让机器相互之间可以传递消息,因为有特定的协议,所以也就消除了不同机器、平台、语言之间的隔阂,它可以“私聊”,也可以“群发”,总之通过这个一套规范,让不同的机器之间有了一个统一的信息交流平台。简而言之,就是只要你的机器是用mqtt来传递消息,那么就能与其他也使用mqtt规范的设备进行通信。

irmqtt

irmqtt是论坛大佬开发一个项目,其原理如上所说,其实就是把红外转换成了mqtt,你可以把它理解为一个翻译机,它通过集成一套完整的红外码库,并对应成规范的mqtt消息。也就是说你家里“乡下”来的空调,通过它,就能立刻成为一名英语流利,听说读写与国际接轨的大家闺秀。irmqtt能帮空调遥控器的红外指令“你最近在搞锤子哦”优雅地翻译成"how are you",反之把"stay hungry,stay foolish"通俗地告诉你的空调:“你还是太年轻”。

x12:一个中国某动出产的空调伴侣,论坛的大佬通过更改固件,让其变成了通用版本的irmqtt,你可以理解为一个越狱的空调伴侣。

homebridge

Homebridge is a lightweight NodeJS server that emulates the iOS HomeKit API.

一个轻量级的nodejs服务器,用于模拟 iOS HomeKit API。通俗讲就是一个模拟homekit设备的服务器应用平台,通过它来接入廉价的第三方未得到homekit认证的设备。通常简称hb。

nodejs

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。 Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型。 [1]

Node 是一个让 JavaScript 运行在服务端的开发平台,它让 JavaScript 成为与PHPPythonPerlRuby 等服务端语言平起平坐的脚本语言。 [2] 发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装。

Node对一些特殊用例进行优化,提供替代的API,使得V8在非浏览器环境下运行得更好。V8引擎执行Javascript的速度非常快,性能非常好。Node是一个基于Chrome JavaScript运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node 使用事件驱动, 非阻塞I/O 模型而得以轻量和高效,非常适合在分布式设备上运行数据密集型的实时应用。

简而言之就是一个非常适合iot的运行环境。

npm

一句话解释就是nodejs环境里的appstore。

mosquitto

一款轻量级的mqtt服务软件。

理清思路

我对自己家里的家居智能话大体思路就一条,尽可能地全部接入homekit,这主要是个人使用习惯,家庭成员都是使用的苹果手机,homekit有简洁的外观,siri的支持,以及苹果公司作为背书,虽然有一些方面可能比不上国内的米家,天猫精灵之类的智能家居平台,不过萝卜青菜各有所爱,在此不再赘述。

那么当我们想把一台古董空调接入进homekit的时候,我们该怎么办呢?

古董空调原运作模式

优雅的空调运作模式

物料准备

刷好论坛固件的x12(直接联系盐巴购买或者直接购买irmqtt再或者自行制作irmqtt),正常部署好的局域网环境(2.4g无线局域网环境),Windows10主机,古董空调。

环境部署

部署MQTT Broker

下载Mosquitto

我们使用mosquitto来作为mqtt broMker,mosquitto的windows版本直接到官网进行下载。
下载地址:http://mosquitto.org/download/
选择对应的windows-x64版本。

安装Mosquitto

安装没用任何难度,直接一路下一步,安装路径可以改为自己喜欢的目录,注意一定要勾选Service,这样Mosquitto会同时作为Windows的服务进行安装,方便开机自动运行。安装后最好重启电脑,重启后电脑会自动启动mosquitto。

installmosquitto

安装完成后,Mosquitto会自动为Windows添加一个Mosquitto Broker的服务,确保这个服务每次开机都会自动运行。

测试Mosquitto

进入mosquitto的安装目录,运行cmd

首先我们先运行一个订阅端
执行命令mosquitto_sub -t test/# -v
testm2

然后我们再在mosquitto的安装目录下另外开一个cmd窗口,运行一个发布端
执行命令mosquitto_pub -t test/test/ -m 成功了!

如果你能在之前运行的订阅端看到发布端的消息,那么恭喜你,你的mqtt broker已经部署好了。这里稍微解释一下命令,-t是指主题(topic),订阅端的话就是订阅主题(topic),发布端就是发布主题(topic)。实际在智能家居的相关应用场景下,我们的主题都是有很多层级的,那么我们就需要用到层级分隔符/和多层通配符#,大概的意思就是例子中我们订阅的-t test/#是订阅了包括test,以及test/下面的所有层级的。-v则是显示详细信息(包括主题名和消息)。

经过这个小测试,相信你对mqtt的认识更为直观了,其实在目前智能家居应用当中,mqtt是应用极为广泛的,因为其轻量化和协议标准化的特点,很方便地让设备与设备之间进行通信。区别设备信息的方式就是靠主题的区分,每一个设备发出的mqtt都应当有其特有的主题(topic),这样服务端就能区分出不同设备的消息以及状态了。例如我卧室和书房的空调,在后面会分别设置其主题(topic)为irmqttb和irmqttw。

这里如何设置broker的用户名和密码以及端口号不做展开说明,也就是说目前这个mqtt broker是运行在当前主机下的,用户名和密码均为空,端口号默认为1883
所以其他设备在访问这个mqtt broker的时候只需要设置ip地址+端口为当前这台电脑的内网地址即可,例如:192.168.1.10:1883

部署nodejs和npm

下载nodejs

进入官网:https://nodejs.org/en/download/

下载对应的Windows(x64)LTS版本

安装nodejs和npm

然后进行安装,这里提一下,建议没有太多基础的同学不要更改nodejs的默认安装目录,因为有一些应用(例如Homebridge)在调用npm的时候是调用的默认路径,如果路径更改了的话是需要去到配置文件里面更改的,未避免撞到不必要的墙,强烈建议不要更改安装路径。

installnodjs

一路默认,到最后一部的时候,也是同样强烈建议勾选此处,这将会让nodejs安装程序自动安装一些必需的环境,如果不勾选,有可能导致某些环境的缺失,最终引起一些奇怪的报错。

installnodejs2

然后一路默认安装,nodejs主体安装结束后会自动弹出命令窗,告诉你接下来它将会自动安装一些常用的环境和组件,这里直接按任意键让它开始自动下载以及安装。

installnodejs3

接下来它会自动打开Power Shell,开始下载以及安装环境

耐心等待一会儿,大概10分钟左右,安装完成后会出现提示,按照提示输入ENTER关闭窗口,然后重启电脑。

重启后,在开始菜单输入Node.js command prompt,找到nodejs的命令行工具,选择以管理员身份启动(强烈建议每次运行这个窗口的时候都以管理员身份启动,以避免权限不够引起的错误)。

输入指令:node -vnpm -v,如果你和我一样正常的返回了版本号,那么恭喜你,你的nodejs以及npm已经成功部署了!

设置IRMQTT(X12)

就像IRMQTT的名字一样,我们需要先设置IR(红外)部分,再设置(MQTT)部分。

配置网络信息

第一步就是让你的IRMQTT(X12)连入家中的无线网络中,如果你是购买的论坛版的x12的话,还需要进行激活,具体的配置方法可以参考以下帖子,这里不详细说了。

iobroker设备接入-IRMQTT-USB 红外遥控器 你值得拥有!

X12开箱使用,接入各平台

X12 某动红外遥控插座改IRMQTT

红外(空调)收发码测试

请同学们再次认真阅读上面的帖子,尤其是配置网络和测试空调收发码的部分,确保你通过web端发送指令后,空调能够发出一声清脆悦耳的“滴”声。

这里有个地方提示一下,有些同学可能看到空调析构这里有很多空调的品牌,认为只要选择了对应自己空调的品牌就可以了,其实并不是这样,比如格力空调具体到每一台空调的小型号都很可能不同,包括家里哪怕长的一模一样的空调都有可能红外码是不一样的。这里记住一点,我们一定要以遥控器发出的信号为准,如果家里有多个遥控器,那么最好都按照下面步骤逐一来测试!

首先我们进入IRMQTT的web端,点开日志,然后我们使用遥控器,对着IRMQTT(X12)进行指令发送,可以多按几次,每次按不同的键。

在日志中找到这样以Incoming IR message开头的记录,可以看到,我的红外码序号是20,那么按照huex给出的定义对照表(对照表),我是MITSUBISHI_AC。接下来返回到web端的红外界面,空调析构里选择MITSUBISHI_AC,型号从上到下挨着试试,下面的命令每次发送的时候都变动一下模式或者温度,不出意外,在你某一次鼠标点击发送指令后,空调会传来清脆悦耳的“嘀”声,此时空调收发码就测试完毕了。

配置MQTT

进入IRMQTT(X12)的web端的设置选项,可以看到这里有一栏MQTT设置,这里地址我们就填写之前部署MQTT Broker的主机地址,端口默认1883,用户名和密码都为空,前缀也就是上文提到的主题(topic)。这里根据自己的需要为每你手里的每一个IRMQTT设置一个不同的主题。设置后保存,并重启IRMQTT(X12)。

然后我们在部署MQTT Broker的主机上运行一个mqtt订阅端,订阅主题填写刚才设置的主题名。例如我刚才设置的是irmqttw,那么我们订阅的主题则为irmqttw/#,如果订阅端能够正常收到消息,那么恭喜你,IRMQTT(X12)已经配置完毕了!

Homebridge

安装Homebridge

安装homebridge非常简单,只要你的nodejs环境已经部署好了的话,那么以管理员身份打开Node.js command prompt

输入命令npm install -g --unsafe-perm homebridge homebridge-config-ui-x

NPM就会自动开始下载安装最新版本的Homebridge。怎么样,是不是觉得npm就是命令行下的app store,只不过它只是nodejs环境里的app store。

安装完成后会看到如下的提示

接下来不要关闭这个窗口,我们继续安装homebridge的服务,这样homebridge就可以随着每次开机自动启动了。

输入命令hb-service install

看到Homebridge Setup Complete,就代表Homebridge的服务已经安装完成了,同时也已经自动启动了,这个界面里告诉了你web后台的地址及端口。
打开浏览器输入地址+端口号,就可以看到Homebridge漂亮简洁的web后台了,初始的用户名和密码都是admin,填写后进入后台。

安装Homebridge Mqtt Acpartner插件

点选顶部的插件选项卡,在搜索框输入homebridge mqtt ac(不知道为啥输入全称反而搜索不到),看到abc大佬制作的插件,点击安装。

这时候会自动跳出npm的命令窗,然后它自动执行下载以及安装

安装完成后会在homebridge的插件里面看到已安装homebridge mqtt acpartner插件。

配置Homebridge

点击顶部的配置选项,我们来到了Homebridge的配置编辑页面,这里一定记得所有的符号和标点一定要用英文的,中文的符号是不正确的。初始的配置我们不要去改动它。

我们在配件这个定义里面添加内容,也就是"accessories": [],的中括号里面加入如下的代码

{
   "accessory": "acpartner",
   "name": "书房空调",
   "serviceType": "HeaterCooler",
   "mqtt": {
   "server": "192.168.50.201:1883",
   "prefix": "irmqttw",
   "username": "",
   "password": ""
            }
}

根据我们的MQTT Broker部署的情况,我们这里只修改其中的name、server、prefix这三个字段

name 为在homekit里显示的配件名称
server 为MQTT Broker的主机地址及端口
prefix 为mqtt消息的主题(topic)

如果有多台空调需要接入,则中间以,进行分隔,最后完成的配置如下

{
    "bridge": {
        "name": "Homebridge 9950",
        "username": "0E:EC:43:A1:99:50",
        "port": 51406,
        "pin": "595-04-854"
    },
    "accessories": [
        {
            "accessory": "acpartner",
            "name": "书房空调",
            "serviceType": "HeaterCooler",
            "mqtt": {
                "server": "192.168.50.201:1883",
                "prefix": "irmqttw",
                "username": "",
                "password": ""
            }
        },
        {
            "accessory": "acpartner",
            "name": "卧室空调",
            "serviceType": "HeaterCooler",
            "mqtt": {
                "server": "192.168.50.201:1883",
                "prefix": "irmqttb",
                "username": "",
                "password": ""
            }
        }
    ],
    "platforms": [
        {
            "name": "Config",
            "port": 8581,
            "auth": "form",
            "theme": "auto",
            "tempUnits": "c",
            "lang": "zh-CN",
            "platform": "config"
        }
    ]
}

切记不要多打或者少打括号和逗号,完成后点击保存。

保存后,返回状态页面,点击右上角开关,重启homebridge服务。

重启服务登录后,看到配件加载的日志。同时配件页面下,也出现了两个空调。

Homebridge配置就完成啦!

接入Homekit

返回到状态栏,打开你手中的iPhone家庭app,点右上角+号,点击添加配件。

扫描Homebridge状态页面左上角显示的二维码

显示未认证配件,点击仍然添加。

添加成功,随后出现配件设置页面,选择空调所在的房间。

点击完成,空调就接入到你的家庭APP啦!

这里有个小问题就是空调始终显示的是0度,这是因为红外遥控的设备都是没有反馈的,也就是说我们只能给空调发指令,而空调并不能告诉我们它现在的状态,我们再来复习一下这个运作模式图,就明白了。

可以看到,所有的红外指令都是单向的,那么仅仅依靠空调和irmqtt是不没有办法让homekit读取到当前的温度状态的,如果想要正确显示当前温度的状态,那么只能额外添加一个支持mqtt的温度传感器,来告诉homebridge此时的温度状态。abc大佬的插件是支持温度显示的,这里如果有需要的同学,设置好了温度传感器的mqtt主题后,只需要在刚才的配置文件里的这两行之间添加"mqtttemp": ''temp_topic(温度传感器设置的主题)",就可以了。例如

 {
   "accessory": "acpartner",
   "name": "书房空调",
   "serviceType": "HeaterCooler",
   "mqtttemp": ''temp_topic(温度传感器设置的主题)",
   "mqtt": {
   "server": "192.168.50.201:1883",
   "prefix": "irmqttw",
   "username": "",
   "password": ""
            }
}

最后

聪明的你看完了这篇文章,应该已经成功设置好了你家里古董空调,同时轻描淡写地在朋友圈发个“hi,siri,打开空调”的装逼小视频,并获得了满满的成就感。那么恭喜你,你已经迈出了你在智能家居的第一步,也是最重要的一步!

通俗易懂,感谢分享,入门必看!!!

请问,我这个悟空M1 温度怎么接入HB呢???不是很懂MQTT配置,方便联系一下么?? :exploding_head: :dizzy_face:

谢谢楼主分享,写的很详细,让我这种小白都看懂了。

1赞

我是使用node-red做了一个温度mqtt消息的格式转换。