ちょっと思うところあって、HDMI を USB Video Class (UVC) に変換するキャプチャデバイスを買ってみました。簡単にいうと HDMI 出力をウェブカメラとして扱うことができるというものです。

この手のものは基本的に結構高価なのですが、この製品は AliExpress で $108 とかなり安い (というか 1080p USB 3.0 対応だと市場最安ぐらい?) です。

軽く使ってみる

PS3

とりあえず PS3 の HDMI 出力をこのデバイス経由で MacBook に入力して QuickTime Player で見てみました。

QuickTimer Player 側で画質を「最高」に設定すると 1080p で綺麗な画像が出てきます。また、音声もちゃんとキャプチャできていました。

この状態でゲームを起動したりしてみましたが、繋いだ状態でプレイできる感じではありません。後述しますが遅延があります。まぁその手の用途には使えないと思います。

デジカメの HDMI 出力

こんな感じです。カメラ側で 1080p 出力ができないのでしょぼいです。ビデオカメラならできると思うんですが、持ってないので……

実装

中をちょっと見てみましたが、数個の IC と FPGA っぽいものがありました。FPGA っぽいものにヒートシンクがついてました。大きいところの型番を検索してみました。

  • Analog Devices ADV7611 (HDMI レシーバ)
  • Micron D9LHT (64MB DDR2らしい/商品説明より)
  • Cypress CYUSB3014-BZXI (USB3.0 コントローラ)

ヒートシンクで FPGA の型番がわかりませんが、個人で普通に作ってケース込みで$100に収めるのは不可能に近いので、割とお得な気はします。

ところで4本のビスを外せば開けられるのですが、止めているビスがおそろしく柔らかい素材で、サイズぴったりのドライバで回しても1本は折れて、もう1本はネジ山がなめてしまいました。

発熱

結構発熱します。ケースはアルミなので、全体的に暖かくなります。15分ぐらい使うと40度ぐらいかな。だいたいこれぐらいの温度で安定してます。

遅延

ちょっとややこしいですが、キャプチャしている Mac 自身のディスプレイの1つとしてこのデバイスに出力して計測してみます。UVC 経由で Mac デスクトップが拡張されている状態です。Mac 側からの出力解像度は 1080p にしています。

requestAnimationFrame(function me(){document.body.textContent=new Date().getTime();requestAnimationFrame(me)});

するウィンドウを2つ作って、1つは DisplayPort から表示 (リファレンス)、もう1つはこのデバイスを経由して HDMI -> USB 3.0 -> QuickTime Player とした状態です。この2つのウィンドウを近付けてスクリーンショットを記録したのは以下の画像です。

左が通常 (DisplayPort)、右が UVC を QuickTime Player で見ているものです。

これで確かめてみたところ、約100msの遅延がありました。QuickTime Player や USB での処理遅延も含まれるので純粋に製品の遅延とは言えませんが、だいたいこんなもんなようです。これはマウスポインタとかでも結構気になるレベルです。

  1. トップ
  2. tech
  3. 中華製 HDMI -> USB 3.0 UVC キャプチャデバイス

ZenFone3 (Android M) にしてからブラウザのフォントが Source Hans Sans になったのですが、このサイトの漢字がどうも中華フォントになってておかしいので調べていました。

で、結局どうやら

text-rendering: optimizeLegibility; 

をつけると字形が中華フォントになってしまうようでした。

修正方法

text-rendering: optimizeLegibility をやめる

どういう理由かわかりませんが指定をやめれば日本語字形になります。

optimizeLegibility

このオプションはUAがフォントレンダリングを読みやすさに最適化せよという指定なのですが、このような弊害があるようです。

lang="ja" 指定する

これでも直ります。optimizeLegibility すると OS のロケールを無視してしまうんでしょうか?

しかし lang="ja" を指定すると、なぜかアルファベットに Source Hans Sans じゃないフォントが使われるようになって死にます。

とりあえずの解決方法

lang="ja" にするのがいいかと思ったんですが、アルファベットがおかしいので text-rendering: optimizeLegibility をやめるだけにしました。

  1. トップ
  2. tech
  3. ZenFone 3 上の Chrome for Android でサイトが中華フォントになる

家庭内 Slack とかやってる人は結構いますね。羨しいなと思ってましたが、うちの妻は英語と技術的なことがさっぱりわからないので Slack ですら敷居が高く、インストールしたり説明 (チャンネルの概念とか、それがどういうノリで機能するかとか……) するのもめんどうなので家庭内チャットボットみたいなのは全くやる気がしなかったわけですね。Slack って英語だったけ?と思うかもしれませんね。普通気にもとめないでしょうが英語なんです。ウェブ系IT企業のノリって一般的じゃないんですよ、知っていましたか。

それはともかく、最近 IFTTT の通知先に LINE が増えたり、LINE への通知の API ができたりしたので、家庭内チャットでワンチャンアルデと思ってちょっと頑張って試すことにしました。

つくった IFTTT レシピ

エリアを抜けたらグループへ通知

帰宅しはじめを自動的に伝えるようにというやつです。

出勤時にエリア近くに入ったときにも通知されることがあってやや難があります。あとなんかちゃんと通知されないこともある。まぁでもこれぐらい曖昧なぐらいが位置トラッキングではちょうどいいのではないか……

どちらかというと、定時になっても会社にいるとき30分ごとに通知とかのほうがいいかもなあ。IFTTT ではできなそう。

Dropbox の共有ディレクトリに写真が追加されたら通知

子供の写真を Dropbox で共有してるけど、今まで特に通知する方法がありませんでした。自動的にプッシュされるようになって便利になりました。追加されると LINE に写真もちゃんと表示されたので、基本的に Dropbox 見なくても良いぐらいです。

共有カレンダーに予定が追加されたら通知

これも特に今まで通知する方法がなくて、口頭で伝えるなりこまめにカレンダーをチェックする必要がありましたが、プッシュできるようになりました。良い。

IFTTT 以外の通知

Gmail をパースする系

  • Amazon.co.jp 配達中 通知
  • 佐川配達通知
  • ヤマト配達通知

これらは VPS に置いた gmailnotify.pl (そのうち公開しますが未公開) という自作スクリプトを cron でキックすることで、LINE Notify 経由で通知するようにしたもの。Gmail に OAuth + IMAP でアクセスして、必要なメールを検索してパースしています。

アマゾン通知はいいんですが、妻へのプレゼントをアマゾンで買えなくなるという罠があります。

アマゾンに登録している住所とヤマトに登録している住所が微妙に違うせいか、アマゾンからの荷物に対してはヤマトの配達通知がこない状態なので、通知が重複することはありません。

キーワード反応

LINE Notify と IFTTT だけでも簡単な割にはまあまあ便利ですが、LINE Notify だと誰かの発言をひろって反応するみたいなのは不可能なので、そこらへんだけ Messaging API でやってみることにしました。いちばんチャットボットって感じのトコです。

全体のアーキテクチャ

VPS で Webhook を受けていますが、実際には家庭内サーバ (Raspberry Pi) で応答を生成したいので、以下のように若干ややこしいことをしています。

  • VPS 上のサーバは WebSocket で待ち受けている
  • 家庭内にある Raspberry Pi から VPS 上の WebSocket で繋ぎにいく
  • VPS 上のサーバは LINE から Webhook を受けとったら接続済みの WebSocket にイベントをそのまま送る
  • 家庭内にある Raspberry Pi がイベントを処理し、リプライを送るように WebSocket 経由で通信する。

なぜこんなことをしているかというと

  • 経路を暗号化したい (websocket のサーバも h2o の裏にいて、https / wss での通信になっています)
  • DDNS とかを使いたくない

からです。WebSocket は接続時のヘッダで認証をかけています。

なお特定グループの発言にだけ応答するようになっています。

エアコンのオン/オフ

IrKit を設置しているので、それのAPIを呼びます。

IrKit に関してはウェブサービス経由でもAPIを呼べるので、VPS 経由から直接叩けますが、うちでは上記のように家庭内の Raspberry Pi でメッセージを処理するようにしてあるので、直接呼んでます。

なんとなくテンプレートメッセージでやってみました。ボタンをタップした結果自分の発言として再度発言できる (発言内容が再度 Webhook に通知される) のでチャットボット的には実装が楽です。

自宅の室温

「室温」で自宅の現在の室温をかえします。Raspberry Pi に I2C 接続の温度センサーをつけてます。

単体では実用性ないけど、センサー類は増やしていきたい。エアコンのオンオフするときの目安として使えるかなという意図です。

喋らせる

Raspberry Pi に OpenJTalk を入れて喋るようにしてあるので、これを LINE 経由で呼べるようにしてあります。自宅にいると案外 LINE を見てないことが多いのと、通知がきても無視しがちなので、より強めの通知をかけるという用途です。

まぁ使わない気がします。 意外と面白がって使ってます。。。

その他やりたいこと

おくすり手帳連携

今のところおくすり手帳がデジタル化されてないので難しい。家族の服薬状況とかいちいち把握するのは面倒くさいけど、万が一のときは把握してないと困るので、さくっとBOTから教えてもらえるようにしたい。

災害連携

なんらかの災害情報と連携して、災害時の連絡手段・集合場所を自動的にプッシュさせたい。普段からプッシュしておけば万が一 LINE もろとも使えなくても刷り込みで覚えられないかという感じ。Yahoo からくるメールをトリガにするかとかで考えている。

電気料金の通知

1日のはじまりに前日の電力消費量および概算料金を LINE Notify 経由で通知。節約意識高める用。でもあんま意味ない気もするので保留。

スマートメータから値を読み出したいんだけど、設置場所まで電波が届かないので難儀してる。

クレカ使用通知

インフラ料金系は即座に通知してもよさそう。全部通知するとDMMでエロ動画買ったのが自動でバレるみたいになって辛いのでなにかしらのフィルタが必要。パーサーはあるんだけど、まだやってない。

感想

技術系のノリがわからない人向けだと、技術的にはおもしろいけど微妙な機能つけてもウザがられるだけで辛いので特にプッシュ通知に関しては実用的なことしかできない。

テンプレートメッセージが思ったより面白いので、もうちょっとなんかしたい。

  1. トップ
  2. tech
  3. IFTTT の通知チャンネルに LINE が増えたので家庭内BOTを作った