如何开发homebridge插件

前言

本篇文章主要介绍如何为homebridge开发插件,并以一个最简单的插件为例,对插件的结构和调试方式进行了讲解.如果你和我一样,使用homebridge平台作为智能家居控制方案,并且想要根据自己的实际需要,开发新的插件或者hack已有的插件,但是又找不到介绍编写homebridge插件的文章,那么这篇文章就是你需要的了:P

贴两张效果图:

关闭.png
打开.png

Homebridge Log.png

Log 中有两句Get on FunctionSe ton Function分别是我在插件中自己添加的log打印.

1. 开发环境

  • 一个homebridge环境,不安装任何插件
  • 一部iOS设备

2. 待开发的插件包

先说一下目录结构,下面的文章基于这个目录结构:

~/piDire/homebridge-dev$ tree
.
├── config
│   └── config.json
├── plugin
│   ├── index.js
│   └── package.json
└── README.md
  • 本地初始化一个Node项目
    首先,在头脑中给插件起一个名字,比如叫做homebridge-plugintest.你也可以叫其他名字,但是一定要以homebridge-前缀开头,因为homebridge在搜索插件时会默认以homebridge-前缀搜索,如果你的插件不带有这个前缀的话,就无法被homebridge识别到.然后本地建立一个文件夹,文件夹名字随意起,我的叫做plugin切换到文件夹路径下运行npm init,自动生成package.json文件,生成文件时会要求输入包的名字,这里要和插件的名字一致,也叫homebridge-plugintest.因为我们的homebridge插件其实也就是一个npm包,要符合npm的插件规范.之后在这个路径下新建index.js文件,在index.js中编写插件框架代码.

  • 编辑代码
    这里主要指index.js文件中的插件框架代码.homebridge的插件是有一套固定框架的,我们主要根据自己的插件功能实现其中的一部分函数即可.

框架关键代码批注1:
module.exports = function(homebridge) {
//    Accessory = homebridge.platformAccessory;
    Service = homebridge.hap.Service;
    Characteristic = homebridge.hap.Characteristic;
    // registerAccessory' 的三个参数分别是 plugin-name, accessory-name, constructor-name
    homebridge.registerAccessory('homebridge-pluginTest', 'Plugin', PluginTest);
}

分别解释一下,plugin-name就是插件的名字,前面已经起好了,和package.json中的插件名一样;accessory-name是在config.json中要用到的Accessory名字,只要记住这里要和config.json保持一致就好了;最后一个是构造函数的名字,这个的作用我也不是很清楚,不过要和下面的class的名称保持一致.

框架关键代码批注2:
// Accessory constructor
function PluginTest(log, config) {
    this.log = log;
    this.name = config['name'];
    this.service = new Service.Switch(this.name);  // Service.Switch means this is a plugin of Switch
    this.informationService = new Service.AccessoryInformation();

    //insert your own-operation in here
    // your code ends here

    this.service
        .getCharacteristic(Characteristic.On)
        .on('get', this.getOn.bind(this))   // get means a functon of read status
        .on('set', this.setOn.bind(this));  // set means a function of set status
}

这里上面的几行表示从config.json配置文件中读取用户设置的配置,比如调用的Accessory名称和使用的pin管脚数.其中的一行this.service=new Service.Switch()这一句代表了这个插件是一个Switch类型,即开关类型的插件.换句话说,这一句决定了你的插件在iOS上面的显示方式,是显示为一个开关还是显示为一个风扇还是显示为一个温度湿度值.因此,在确定你的插件的类型之后,我的建议是先在github上面搜索同类型的插件,然后看一下前辈们的插件中这里使用的是什么Service,来确定这种类型的插件应该使用什么Service.
最下面的一句我觉得应该是设置回调函数,就是当用户点击界面时,homebridge应该调用哪个函数来响应用户的操作.

框架关键代码批注3:
PluginTest.prototype.getServices = function() {
    return [this.service];
}

这一句我也不太懂是什么作用,就先当做是框架的固定格式吧.

添加调试用的config.json

编写完插件之后,需要在config.json文件中为插件补充对应的配件定义.事实上,我建议单独新建一个config.json文件,作为我们调试专用的config.我自己的实现方式是,新建一个文件夹,然后在文件夹下新建一个config.json,json文件中的定义需要和插件中的配置名称保持一致.比如,下面是我调试用的config.json文件:

{
    "bridge": {
        "name": "Homebridge",
        "username": "CC:22:3D:E3:CE:50",
        "port": 55373,
        "pin": "033-73-874"
    },

    "description": "This is an example configuration file with one fake accessory and one fake platform. You can use this as a template for creating your own configuration file containing devices you actually own.",

    "accessories": [
        {
            "accessory": "Plugin",
            "name": "Coffee Maker"
        }
    ],

    "platforms": []
}

和其他插件的config.json文件对比一下可以发现,上面bridge部分的定义相同,具体下面的accessories部分是我们需要根据插件内容定义的地方.结合我上面的框架关键代码1和2部分解释一下:
config.json文件中有accessory字段,homebridge根据这个字段的值来确定这部分accessory配置是给哪个插件来用的,因此这个字段的名称要和我们框架关键代码1部分中的registerAccessory部分第二个参数保持一致.以此来告诉homebridge,这个accessory部分的配置是给homebridge-plugintest插件写的,那么下面config下面部分的name字段就可以和框架关键代码2中的this.name字段匹配上.由此你也应该可以推断出,平时你使用的那些插件中的config.json文件里定义的那些东西的含义了吧.比如我之前用过一个homebridge-gpio-wpi插件,它的配置文件中就有一个'pin'字段,对应待插件代码中一定有一个this.pin字段去读取,进而进行操作.如果你有兴趣,也可以在自己的插件中加上一个pin字段试一下:)

  • 在开发环境上安装,迭代开发
    本地调试插件命令
DEBUG=* homebridge -D -U ~/homebridge-dev/config/ -P ~/homebridge-dev/plugin/

其中/homebridge-dev下面存放本地的调试用config.json文件,/plugin下面为插件的开发目录,一般包含package和index.js文件.

最后给出我的插件代码的github地址homebridge-sampleplugin,你可以直接clone下来,自己运行一下,一定要按照我上面写的目录结构放置文件.

遇到的坑

  • 坑1
    错误关键词:
[11/14/2017, 9:19:05 PM] Error: Plugin /home/pi/plugin does not contain the 'homebridge' package in 'engines'.

出现这个错误的原因是自动生成的package.json不满足homebridge的要求,缺少一个engine字段,需要我们手动补充上

"engines": {
      "node": ">=0.12.0",
      "homebridge": ">=0.2.0"
  }

解决方法来自Google(链接)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,815评论 25 707
  • 点击查看原文 Web SDK 开发手册 SDK 概述 网易云信 SDK 为 Web 应用提供一个完善的 IM 系统...
    layjoy阅读 13,708评论 0 15
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,778评论 6 342
  • 记不得从好久开始,在微信上写些乱七八糟的文字,大概是坚持更文的第19天,拿到了原创;便一发不可收拾,像自己的孩子那...
    艾文洱阅读 1,429评论 3 2