お手軽に出来合いのものを組み合わせて赤外線リモコン操作する(Google Homeもあるよ!)

この記事はCPS Lab Advent Calenderの18日目の記事です。 17日目は「ゲームパッドをMIDIコントローラーとして使おうとした」でした。

こんにちは、赤外線リモコンの機器ってなかなか多いですよね。こっちはHTC Viveを設置してしまったものだからベースステーションから出る赤外線で家中のリモコンの危機です。

さて、赤外線リモコンで操作できる機器は例えばどんなものがあるでしょう。まずエアコン、ちょっと高いPCのディスプレイ、LEDシーリングライト……

色々あるのですが、今回はLEDシーリングライトを操作できるようにしました。しかも強い先人たちの築き上げたリソースをフル活用したら、殆どコードを書かずに実現できてしまいました。(しかしお手軽ではあるものの微妙な点もたくさん有りますのであしからず)

使ったもの

ESP8266-HTTP-IR-Blaster

実際の赤外線を発光する部分はESP-WROOM-02に接続した赤外線LEDから行います。 雑にユニバーサル基板上に実装しました。汚すぎてお見せできません…… まず最初の先人の成果物をまるっと利用させて頂くポイントがこちら

github.com

このスケッチでは赤外線受光素子からの赤外線パターンの記録と指定したパターンの発光を無線LAN経由から行うことができます。

ここまでcloneしてきて書き込むだけ。LAN内からは自由自在に赤外線リモコンとして操作できるようになりました。さて、次はどうしましょう?

timer(systemd)

最初に一番やりたかったことである決まった時間に照明をつけたり消したりをできるようにしました。 無駄に大掛かりだと自分でもおもっているのですが、自宅で動いているサーバのtimerタスクでESP-WROOM-02に決まった時間にHTTPリクエストを送るようにしました。 これによって、朝目が覚める時には明るい部屋になっている上に、そろそろ寝ないといけない時間帯には強制的に照明が消えます。 悩みの種であった睡眠リズムが若干改善するかもしれません。

Google Home

さて、その後Google Homeを購入したので、こいつからも操作できたら楽しいよねと思うようになりました。 しかし、Google Home経由で操作するにはDialogFlowにしろIFTTTにしろいっぺん外に出てから戻ってくるような通信経路になります。 今回はお手軽に何も考えず適当にやりたいことを実現するのが趣旨なので、もっといい方法あるんじゃないかとか思いつつ自宅IPにDDNSのアドレスを設定し自宅鯖にnginxを立ててLet's Encryptで証明書を取得して、nginxで外からの通信を受けることにしました。

とりあえずSSLBASIC認証を設定して(IFTTTだとBASIC認証しか使えなかった気が)、IFTTTのWebHookでそのまま自宅に返ってくるような感じにしました。

反応しない

冒頭でも挙げたのですが、HTC Viveが起動している間はベースステーションが部屋中に赤外線を照射するため、赤外線リモコンが一切使えなくなります。 何度もこれで照明のコントロールができずあれーおかしいなーとか言いながら数分間立ち尽くしてました。終了すれば普通に使えるし諦めました。

まとめ

とりあえずお手軽に照明をコントロールしてみましたが、ぶっちゃけ融通が聞かないと感じることも多くこの用途ならラズパイかなんかで自前実装するほうが色々コンパクトにできて楽かもしれません。

何も考えずにググるだけでやるとこうなるよ、という例ということで見ていただけると幸いです。でも何気に実用的に仕上がったのでやって見る価値はあると思いました。

Android Design Support LibraryのSnackbarはユーザ補助機能が有効だとアニメーションしない

個人的にはあのアニメーション大好きなのですが……

Snackbarを使ったアプリケーションをデバッグ中、あのおしゃれな表示・非表示時アニメーションがバッサリなくなっていることに気づきました。

原因はアクセシビリティ設定が有効になっていることで、今回はLastPassが提供する自動入力用のサービスだったのでそれを切ればすんなりアニメーションが再生されてます。

正直LastPassは使ってるしちょっと変わったことをするアプリだと思ううえにアクセシビリティサービスでアニメーションを無効にする理由もわからなくないのですが、Snackbarだけアニメーション無効化されるのもなんだかなあという気持ちです。

ちなみに、普段からLastpass有効で使ってる→Snackbar実装→アニメーションしないことに気づく→ググるという手順を経て以下の記事に気がついたことによってこの問題の存在を知りました……

stackoverflow.com

PostmanでCookieを使いたいときはPostman Interceptorを有効にしないといけない

ただのメモ。結構ハマったので書いときます f:id:haru2036:20170611185948p:plain Interceptorをここで有効にするのを知らなくてずっと悩んでました

【たすけて】Dagger2の導入でつまづく【ハマった】

Dagger2を自作のAndroidアプリに導入する中で躓いたことをまとめようと思います。現在進行形でハマっているのでこれからも加筆修正が入る予定……

前提条件

  • Kotlin
  • Android Studio2.2

✓ハマりその1 そもそもaptが動かなくて困る

アノテーションプロセッシングがうまく動かなかったみたいだったのですが、今回はKotlinを使っているのが原因だったようです。結果的にkaptを利用することにより解決できました。

✓ハマりその2 Activity内でInjectしてもうまく注入されない

これはまだ未解決で結構激しくハマっているのですが、ComponentやModule等を定義した状態で、依存性を注入したいlateinit varで定義したフィールドに@Injectアノテーションを付けActivityのonCreate内でInjectメソッドを呼んでも正しく依存性が注入されていない結果、そのフィールドを参照したときに例外が発生してクラッシュするという問題にぶち当たっています。 とりあえず目下これをなんとかしたいと思っているのですが、なんとかなったらここに追記しようかと……

追記

これは僕の根本的な勘違いが原因だったようです。 正しい理解としては以下の様なものになると思います(@yuyakaidoさんありがとうございます!)

  • Component内のInjectメソッドは依存性を注入する対象を指定する
  • ModuleはComponent内のInjectメソッドで必要とされるものに対して(注入する中身)providerを定義する

ここらへんの理解が曖昧だったため上記のActivityを引数に取るメソッドを用意しなかった結果コケてしまったみたいでした。

FreeNAS機を組んだ

FreeNAS機を組みました。 WD Red 3TB*6でRaid Z2を組んでいます。

一台引っこ抜いて遊んでみたりしましたが少なくとも大丈夫そうです。

今のところ有り余っているストレージ容量を何に使うか、それは多分写真とかに当てられるんじゃないかなあと思っています。あとMacのTimeMachineのバックアップ先にも指定しました。それでも多分余るのでまあゆっくり使っていこうと思います。

あ、あとブートドライブに指定してミラーリングしてあるUSBメモリのうち一方がすぐ脱落してたんですが、別のUSBメモリに取り替えたら正常に動き出しました。

HHKB Pro2を買った

HHKB Pro2を買いました。

友人がType-Sを使っていて遊んでいた墨無刻印モデルを安く譲ってくれたのですが、これはもっと早く買っとけばよかったと思います。

お決まりの無刻印でキーがどこだかわからないということも何度か発生してはいるのですが、どちらかというとそういうときには適当にキーを 押して正しいキーを探すタイプの人間なのでそこまで困ったりはしていません。

一日使ってやっと慣れてきたところなので、これからガッツリ使っていこうと思います。

譲ってくれた友人氏ありがとうでした。

HomeBrewでcurl: (51) SSL: certificate verification failed (result: 5) になって困った

HomeBrewを使ってるのですが、先日brew updateした時にcurl: (51) SSL: certificate verification failed (result: 5) とのエラーが出て全部ソースからビルドしようとしてたので困っていました。

似たような問題はいろいろなところであるらしく、ぐぐったらいろんな解決法が引っかかったのですが結局一つを除いてどれも効果がありませんでした。

export SSL_CERT_FILE=""

が唯一効果があった解決法です。個人的メモ。