自習室

こもります

blink(1) mk2 使い方のメモ - blink1control アプリ編

はじめに

前回記事では blink(1) mk2 がどう言った物かと、写真をおおざっぱに上げて興奮をお伝えしたので、今回はまじめに開発に関する記事にします。

ライブラリが超豊富

公式githubに行くと、対応言語の多さに驚かされます

上から順に

という感じになっています。

まずはWindows版 blink(1) control アプリを使ってみる

f:id:AMANE:20140710211611j:plain

何はともあれまずはこれから。

ボタンを押したらとりあえずBlink(1)が光ってくれます。

Help タブのガイダンスに従って進めると、IFTTT連携も登録できます。

このアプリ上からはblink(1)一個しかコントロールできない

Blink(1)Control アプリは、いまのところ一つのBlink(1)端末のみ制御できるようです。

(公式のフォーラムでも開発者が3週間ほど前にそのように答えているので1年前と状態は変わっていない様子)

せっかく三つも買ってしまったので、複数個連携して動作させてみたいので、blink1-tool 等を駆使してチャレンジしてみることにします(その内容は次回)

blink(1) control アプリの GUIからinputを登録する

IFTTT : IFTTTで登録したblink(1)のレシピと対で使う

標準では15秒に1回、IFTTT web serviceから来ているメッセージを見て、何かあったらblink(1)を光らすなどする。詳細はアプリ内 Help タブを参照

試しにGmailでメールを受信したら、IFTTTを経由してBlink(1)を光らせるレシピを書いて登録してみました。

f:id:AMANE:20140711134515j:plain

設定がおかしいのかな?となんども設定をし直してしまうくらい、反応が遅いです でもこれ、IFTTTの仕様なんですよね。そういえば、他にもいくつかblink1絡みではないレシピ回してますが、だいたい15分くらいは遅れて通知が来るイメージです。

メールの場合は特に、既にiPhoneのバイブだかなんかで通知が来ているので、15分遅れでライトが光られても役に立ちません。これは考え物。

URL : ウェブ上の任意のファイルを読み込む

標準では30秒に一度URLのファイルを見に行って、変更があったらファイルに記載された指令を実行する。詳細はこちら参照

試しにnodeでサーバを作ってみる。

このサーバは、 hoge.txt 中の色の情報をを9.9 秒に一度書き換える。

var express = require('express'),
  fs = require('fs');
var app = express();

var FILENAME = "./public/hoge.txt";
var COLORS = [ "#ffff00", "#00ffff", "#ff00ff", "#ff0000", "#00ff00","#0000ff" ];

// 定期的に hote.txt 中の色情報を書き換える
var changeColor = function() {
  var fd = fs.openSync( FILENAME, "w" );
  var color = COLORS[Math.floor( Math.random() * COLORS.length)];
  console.log( color );
  fs.writeSync(fd, color, 0);
  fs.closeSync(fd);
  setTimeout(changeColor, 9900);
};

app.use(express.static(__dirname + '/public'));

changeColor();

app.listen(3000);

これが、ネットワーク上の別のコンピュータ "192.168.0.11:3000" で動いているとする。 blink1control の Tools タブでinputを新規作成し

Type: Url
Path: http://192.168.0.11:3000/hoge.txt

と指定すると、9.9秒ごとに変更されるhoge.txtを見て、最新の色でblink1が光る。

ちなみに、ファイルを書き換えて見せるようなサーバではなく、レスポンスに直接色情報など含めれば良いかと思って初めは以下の様なサーバでやろうとしたのだけど、二度目以降のアクセスでは Not Modified (変更無し) になってしまい、blink1が反応しません。

var responses = [
  { pattern: "calmdown"},
  { pattern: "blue falshes"},
  { pattern: "groovy"}
];

app.get('/', function (req, res) {
  var response = responses[Math.floor(Math.random() * responses.length)]
  res.json(response);
  console.log(response);
});

「URLを見て変更があったら」の意味がややあやふやですが、いまのとここういう理解。静的なファイルの変更は分かる、レスポンスで直接値が返ってきたら、その内容が変わっていても関知できない。

うーむ、良い感じなサーバの書き方分かった人居たら教えて下さい。

File : ローカルにある任意のファイルを読み込む

標準では15秒に一度指定のファイルを見に行って、変更があったらファイルに記載された指令を実行する

これは上の場合と違って分かりやすく、更新があれば利用する、というシンプルな設計のようです。試しに以下の様なファイルを書いて、内容を一切更新せずに touch hoge.txt とするだけでも、タイムスタンプが変更されるため、次のチェック時に実行されます。

{ 
  "pattern":"blink3_red"
}

Script : ローカル(~/Document/blink1-script/フォルダ)にあるスクリプト( bat / sh ) を標準では15秒に一度実行する

Windows だと、こんな感じ。時刻を見て、秒数が偶数だったら緑、奇数だったら赤 を標準出力するbatファイルです

@ECHO OFF

SET SEC=%TIME:~6,2%
SET /A SECNUM=%SEC%
SET /A AMARI=%SECNUM%%%2

IF %AMARI% EQU 0 (
  ECHO #00ff00
) ELSE (
  ECHO #ff0000
)

これを windowsなので C:\Users\自分\Documents\blink1-scripts\test.bat などとして置いておくと、15秒に一度読みに行って、Blink1が反応します。

Hardware: CPU/RAM/Battery利用状況を見てイベントを起こす

f:id:AMANE:20140710230448p:plain

Windowsだとdisableな感じ。(もしくはソフトのバグ?) Macだと下の画像のようにセッティングが可能。CPU利用状況の場合。サーバの監視業務とかだと嬉しい機能なのかな。

同様に、RAM と Battery も登録可能。

APIサーバを試す

f:id:AMANE:20140710212659j:plain

タスクトレー中のblink(1)アイコンをクリックしたら出てくるメニューの中から Enable API Server しておくと、Blink(1)に命令を送るサーバが立ち上がります。

URL APIの概要とサンプル

URL APIの詳細(コマンド一覧)

この状態でブラウザでアドレス打つなり ターミナル から curl するなりすると、blink(1) が反応してくれます。

# #FFCC00 で光ってちょ
curl 'http://localhost:8934/blink1/fadeToRGB?rgb=%23ffcc00'
{
  "rgb": "#ffcc00",
  "status": "fadeToRGB: #FFCC00 t:0.100",
  "time": "0.100"
}

# 君が習得したパターン教えてちょ
$ curl 'http://localhost:8934/blink1/pattern' 
{
  "patterns": [
    {
      "name": "blink3green",
      "pattern": "3,#00FF00,1.5,#000000,0.5",
      "playcount": 0,
      "playedColor": "#000000",
      "playing": false,
      "playpos": 0,
      "repeats": 3
    },
    {
      "name": "policeflash",
      "pattern": "0,#FF0000,0.5,#0000FF,0.5",
      "playcount": 0,
      "playedColor": "#000000",
      "playing": false,
      "playpos": 0,
      "repeats": 0
    }
  ],
  "status": "pattern results"
}

APIサーバからいろいろ覚えさせる

先ほどGUIからいろいろ覚えさせたinputを、httpリクエストに乗せて登録することが出来ます。詳細は上記ドキュメントを参照なさって下さい。GUIでやった方が楽デスネ。

WindowsからだとGUIでCPUloadが設定できなかったので URL API なら可能かと思ったけど、"unknown command" と返ってきてしまってしょぼーん

ダメだったコマンド→ http://localhost:8934/blink1/input/cpuload?iname=cpu99&arg1=90

やはり blink1一個しかコントロールできない

これも blink1control アプリの配下なので、URL API越しでも、blink1 は一個しか操作できません。

Blink1Control の構成をざっくりまとめると

こんな感じになっているかと思います。自分の頭整理用に図にしてみました

f:id:AMANE:20140710231318p:plain

ツヅク

今回は blink1Control アプリを中心に記事にしてみました。このままでもかなり楽しい感じですが、次回からはもう少しlow levelなAPIコマンドラインツールを使ってみようと思います。

blink1 二個を別々に制御する方法も試してみようと思います。