Home Automation System for @hecomi room
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
services
settings
test
tool
utils
.gitignore
README.md
bower.json
package.json
tsubakumi

README.md

TSUBAKUMI 2

はじめに

@hecomi 家のホームコントロールシステムの2世代目です。iRemocon、WeMo、hue、Netatmo などの各種ガジェットの機能を WebAPI 化し、そこから操作できる機器や動作の組み合わせを更に WebAPI 化しています。これにより、他のガジェット(PCやスマホ、Pebble など)から一通りの家電操作を可能とするシステムとなっています。 例えば、以下の様な URL を叩くと家電を操作することが出来ます。

また、これらの API を利用して、人の動きを検知すると自動でつく照明や、音声認識による家電操作をしています。

環境

  • Mac OS X 10.9.1
  • Node.js 0.10.4

設定

./setting.js に一通りの設定(機器の IP など)を記述しています。また、hue のユーザー ID の様に公開したくないものに関しては、./settings.secret.js に記述し、.gitignore で除外しています。

Device API

直接操作できる機器の WebAPI になります。iRemocon、WeMo Switch、WeMo Motion、hue に現在対応しています。

IR MAP

機器のほとんどは IR で操作します。そのため ./settings/ir-map.js に、iRemocon に学習させる IR の番号および、その機能を定義しています。

module.exports = {
	1  : ['light high', 'light on'],
	2  : 'light medium-high',
	3  : 'light medium-low',
	4  : 'light low',
	5  : 'light midget',
	6  : 'light off',
	7  : 'monitor off',
	8  : 'monitor on',
	9  : ['projector on', 'projector off'],
	...
};

これらは tool/iremocon/learn.js で学習することが出来ます。 そして Device/iRemocon API で /device/iremocon/is/1 や、/device/iremocon/is/projector/on といった形で呼び出すことが出来ます。

Alias API

Device API を単純に組み合わせたり、ユーザフレンドリーにリネームした API です。 ./settings/alias-map.js に記載した通りにルーティングを行います。

module.exports = {
	...
	'/entrance/light/on'  : '/device/hue/on/1',
	'/kitchen/light/on'   : ['/device/hue/on/2', '/device/hue/on/3'],
	'/room/light/on'      : '/light/on',
	'/all/light/on'       : ['/entrance/light/on', '/kitchen/light/on', '/room/light/on'],
	...
};

ここでは、/device/hue/on/1/entrance/light/on という名前に書き換えたり、これらを組み合わせて同時に実行する /all/light/on などの API を定義しています。

Macro API

Device API を複雑に組み合わせた API になります。 条件分岐などが発生する単純なリダイレクトでは制御できない内容を取り扱う API を定義しています。./settings/macro-map.js に一連のマクロを定義しており、./settings/macro-map.js に定義されています。 例えば下記例では、1 秒おきに二度続けて同じ IR 信号を発信する例になります。

module.exports = function(app) {
	return {
		...
		'projector/shutdown': function(req, res) {
			_(2).times(function(n) {
				setTimeout(function() {
					var req = request.get(app.get('address') + '/projector/off');
					if (n === 1) req.pipe(res);
				}, 1000 * n);
			});
		}
		...
	};
};

Word Recognition API

自然言語に対する処理と応答を行います。

  • **http://192.168.0.4:23457/:word 与えられた自然言語に対する処理を行います。ルールは、./settings/word-map.js にて定義しています。
module.exports = [
	{
		word: [ 'ワード1', 'ワード2' ],
		rule: {
			reply: 'ほげほげを実行します', // 応答で喋る言葉
			api: '/hogehoge' // 実行する API
		},
	},
	{
		word: '(明日の|今日の)?天気(教えて)?',
		rule: {
			func: function(str) {
				// return で返した言葉を喋る
				return str + 'だって?、ググれカス!';
			}
		}
	},
	...
];
  • **http://192.168.0.4:23457/status 「認識停止」や「認識開始」で、内部の認識するか否かフラグを設定することが出来ます。/status ではこういった現在の状態について問い合わせることができます。

Voice Recognition

Julius を利用したルールベースの音声認識を利用して操作を行います。 認識する言葉は Word Recognition API に依存します。 処理は ./speech.js が行い、音声認識結果に対する応答は、OpenJTalk によって音声合成された声で返ってきます。

Twitter

Twitter からの操作を ./twitter.js で行います。 当該アカウントがフォローしているユーザがコマンド(自然言語)を mention すると、それを実行しリプライで返信します。 動作は Word Recognition API に依存します。

Gmail

Gmail での着信を ./mail.js で行います。 コマンド(自然言語)を記述したタイトルを見て、それを実行します。

IFTTT

IFTTT のアクションを Gamil でのメール送信とすれば、上述の Gmail 連携機能で IFTTT のトリガと結びつけることが出来ます。例えばスマホの位置に連動して電気の ON/OFF などが可能です。

TOOLs

各種ガジェットの設定に必要なスクリプトが tool 以下に入っています。

  • /iremocon/search.js

    • iRemocon の発見に使います。au コマンドを利用しています。
    • 使用例: $ node ./tool/iremocon/search.js '192.168.1.'
  • /iremocon/learn.js

    • ./settings/ir-map.js に記述された情報を元に赤外線リモコンの対話的学習を行います。
    • 使用例: $ node ./tool/iremocon/learn.js -f 50 -t 60
  • /wemo/search.js

    • WeMo の発見に使います。SSDP で探します。
    • 使用例: $ node ./tool/wemo/search.js
  • /hue/search.js

    • hue の発見に使います。
    • 使用例: $ node ./tool/hue/search.js
  • /hue/register.js

    • hue へユーザー ID の発行を依頼します。
    • 使用例: $ node ./tool/hue/search.js

TODO

  • エアコンの赤外線の形式は特殊なので、現状の IR MAP だと上手く行っていないかもなので調べる
  • OpenJTalk は API 化する

LICENSE

  • NYSL License