2016年1月30日土曜日

homebridgeと接続してsiriで家をコントロール

最近homebridgeというopen sourceのHomeKitのブリッジソフトが流行っているようなので、自宅のシステムと仮接続してみました。
とりあえず、まだTVのon/offだけですが動作させることが出来ました。
ただ、siriがどんなコマンドを受け付けてくれてサービスをどう登録するのかがよく判りません。
「テレビをonして」「テレビをoffして」は動きますが「テレビをつけて」はダメでした。
放送局とかを指定したりボリュームをコントロールするには何と言えばいいんですかね?

とりあえず、呼び出される関数の中でhomebridge.hap.Serviceをdumpすることで
     AccessoryInformation: { [Function] super_: [Circular] },
     AirQualitySensor: { [Function] super_: [Circular] },
     BatteryService: { [Function] super_: [Circular] },
     BridgingState: { [Function] super_: [Circular] },
     CarbonDioxideSensor: { [Function] super_: [Circular] },
     CarbonMonoxideSensor: { [Function] super_: [Circular] },
     ContactSensor: { [Function] super_: [Circular] },
     Door: { [Function] super_: [Circular] },
     Fan: { [Function] super_: [Circular] },
     GarageDoorOpener: { [Function] super_: [Circular] },
     HumiditySensor: { [Function] super_: [Circular] },
     LeakSensor: { [Function] super_: [Circular] },
     LightSensor: { [Function] super_: [Circular] },
     Lightbulb: { [Function] super_: [Circular] },
     LockManagement: { [Function] super_: [Circular] },
     LockMechanism: { [Function] super_: [Circular] },
     MotionSensor: { [Function] super_: [Circular] },
     OccupancySensor: { [Function] super_: [Circular] },
     Outlet: { [Function] super_: [Circular] },
     SecuritySystem: { [Function] super_: [Circular] },
     SmokeSensor: { [Function] super_: [Circular] },
     StatefulProgrammableSwitch: { [Function] super_: [Circular] },
     StatelessProgrammableSwitch: { [Function] super_: [Circular] },
     Switch: { [Function] super_: [Circular] },
     TemperatureSensor: [Circular],
     Thermostat: { [Function] super_: [Circular] },
     Window: { [Function] super_: [Circular] },

     WindowCovering: { [Function] super_: [Circular] } } }
といったサービスの種類があることは分かりました。
現状はSwitchにTVのon/offを接続しているだけなのですが、少しずつ他のWindowとかDoorやLightあたりを掘っていってみようかと考えています。

2016年1月15日金曜日

バーチカルブラインドの電動化その後

以前電動化したバーチカルブラインドですが、やはりちょっとモーターの出力に対して負荷が重いようで、たまにきちんと閉まらなかったりしてました。

現在使っているモーターはSWITCHSCHIENCEさんで売っているPololuの75:1ギアドモーターなのですがギア比をもう少し高くして低速化することでトルクを確保しようかと検討してみました。

たまたま立ち寄った千石電商でダイセン電子工業の132:1ギアドモーターが置いてあったのですが3.3V品でパワーがあまり出なさそう。
しかもPololuのモーターでエンコーダーを取り付けている後ろ側のシャフトが出ていません。
ただ、ギア部分の寸法が同じなのでうまく組み替えてPololuのモーターを132:1に出来るかもしれないと買ってみました。

ギアボックス部のネジ2本をはずして取り外して見てみたところ軸に付いているギアの歯数が違うので圧入されているギアも一度外して組み替える必要がありました。




なんとか外して組み替えてPololuのモーターに132:1のギアボックスを組み合わせ、取り付けてみました。



これを組み付けて







取り付けます。

ちゃんと速度が半分くらいになって多少の負荷でもきちんと開閉出来るようになりました。





2016年1月4日月曜日

node.js foreverをRaspberryPi起動時に自動起動するように設定する

node.jsをRaspberryPiでnvm管理下で使っていたのですが、サービスを常時動かしておこうとするとforever等で管理することになります。
ところが、foreverはinit.dに登録されているわけではないのでRaspberryPiを再起動すると自動で動いてくれません。
最初nvmを使ってnode.jsをinstallしていたのですが、nvmだと自分のアカウントのhomeの.nvmというディレクトリ以下に色々とinstallされてしまいシステムの起動スクリプトに記述するには気持ち悪い事になってしまいます。(まぁ、そこはそういうものだと割りきってしまっても良いのですが)
nvmは開発用の環境であって運用のための環境ではないということかと思います。
次に考えたのはapt-getでnode.jsをinstallすることですが、versionが0.10.29と古いため結局試行錯誤の末node.js自体はnodejs.orgのDOWNLOADSのLTSのv4.2.4を入れることにしました。
今回は/usr/local/にダウンロードしてきたイメージを展開して/usr/local/nodeにシンボリックリンクを張って運用しています。
ダウンロードの実体は/usr/local/node-v4.2.4-linux-armv7l/以下に展開されて、そこに/usr/local/nodeからシンボリックリンクされているという形です。
$ PATH=/usr/local/node/bin/:$PATH
とpathを通してから
$ npm install -g forever
でforverをinstallします。
これでnode, npm, foreverが準備出来たので、次に/etc/init.d/に起動スクリプトを用意します。

以下の例は/etc/init.d/ha1observerという名前で/var/ha1/ha1observer.jsにパラメータを付けて起動するためのものです。

-----
#!/bin/sh

### BEGIN INIT INFO
# Provides:          ha1observer.js
# Required-Start:    $network $syslog
# Required-Stop:     $network $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: forever running ha1observer.js
### END INIT INFO

USER=ha1observer
SCRIPT=/var/ha1/EventValidate.js
PIDFILE=/var/run/ha1observer.pid
LOGFILE=/var/ha1/ha1observer.log
PATH=/usr/local/node/bin:$PATH
FOREVER=/usr/local/node/bin/forever
NODE=/usr/local/node/bin/node
NODEAPP=/var/ha1/HA1Observer/ha1observer.js

start() {
  $FOREVER start --pidFile $PIDFILE -l $LOGFILE -a -d -c "$NODE $NODEAPP -u $USER -f $SCRIPT"
  RETVAL=$?
}

restart() {
  $FOREVER restart $NODEAPP
  RETVAL=$?
}

stop() {
  $FOREVER stop $NODEAPP
  RETVAL=$?
}

status() {
  $FOREVER list
  RETVAL=$?
}

case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  status)
    status
    ;;
  restart)
    restart
    ;;
  *)
    echo "Usage:  {start|stop|status|restart}" >&2
    exit 1
    ;;
esac
exit $RETVAL

-----

ha1observer.jsは起動後に-uで渡されたユーザーにprocess.setuid()で切り替えて実行されます。
init.dからはrootで実行されるのでsetuidしないと色々と危険です。
これを準備したあと
$ update-rc.d ha1observer defaults 3 1
を実行することでrc?.dにシンボリックリンクが張られます。
再起動して
$ ps aux | grep ha1observer
で確認するときちんと実行されていることが分かります。

2015年12月11日金曜日

KiCad 4.0.1 (bzr6195)

KiCadが立て続けに更新されてます。

KiCad 4.0.1をbuildしたイメージをここにおいておきます。

標準のbuildとは下記の点が異なっています。
- TrackPad/MagicMouseの動作をMacの標準的な動作に変更しています
- Library/Application Support/kicad/internat/ja/のリソースを読むように修正しています
- fontが日本語対応になっています
変更分のpatchはこれです。

イメージをダウンロードして開くとkicadアプリケーションとkicadディレクトリがあります。
kicad.appは/Applications
kicadは/Library/Application\ Support
にそれぞれコピーします。(finderで開いた時の矢印のとおりにDrag&Dropして下さい)

最初の1回めは開発元が未確認のため開けませんと言われてしまうので、/Applicationフォルダを開いてKiCadを右クリックし「開く」を選択して、ダイアログボックスの「開く」を選択すると起動します。

詳細とbuildの手順はRC2.0の時に書いたのでこちらを参照して下さい。

2015年12月8日火曜日

KiCad4.0.0 (bzr6194)

KiCad4.0 stable releaseが出ました。
buildしたのでイメージをここに置いておきます。


標準のbuildとは下記の点が異なっています。
- TrackPad/MagicMouseの動作をMacの標準的な動作に変更しています
- Library/Application Support/kicad/internat/ja/のリソースを読むように修正しています
- fontが日本語対応になっています

イメージをダウンロードして開くとkicadアプリケーションとkicadディレクトリがあります。
kicad.appは/Applications
kicadは/Library/Application\ Support
にそれぞれコピーします。(finderで開いた時の矢印のとおりにDrag&Dropして下さい)

最初の1回めは開発元が未確認のため開けませんと言われてしまうので、/Applicationフォルダを開いてKiCadを右クリックし「開く」を選択して、ダイアログボックスの「開く」を選択すると起動します。

詳細とbuildの手順はRC2.0の時に書いたのでこちらを参照して下さい。

一つだけ、buildするのに引っかかった点を書いておきます。
brewでboostをいれているとpcbnewを起動した時にExceptionで落ちてしまうようです。
自分でbuildする場合はbuildする前にbrew uninstall boostでuninstallしておいて下さい。

2015年11月27日金曜日

スマートロック

ちょっと頼まれて普通の鍵の玄関を電気錠化して遠隔制御を出来るようにしてみました。
自宅は建てた時から電気錠だったのでHA端子接続で簡単につなげられていたため、これまで普通の鍵を置き換える検討をしてませんでした。

今回鍵の電気錠化の部分は㈱ユーシン・ショウワのリ・ボーンIIを使います。




最初はAkerunとかQrioSmartLockとかも検討したのですが、どちらもBluetooth接続で暗号化されているのと鍵という性質上セキュリティが厳しくHack出来ないと考え別のものを探してみました。
リ・ボーンIIは玄関のサムターン部分を外して代わりにつけるタイプで、AkerunやQrioSmartLockと比べて面倒ですが、リモコンキーで制御なのでリモコンキーのボタンを制御できればどうとでもなるはずと考えて、とりあえず入手して検討します。

蓋をあけるとDIP-SWがあります。
今回はAutoLockはこちらで制御するので単純にopen/closeのリモコンでの制御通りに動くモードに設定します。




まず、リモコンキーをバラして確認していきます。



CR2032電池なので公証3Vですが回路は電池の初期電圧とかも当然対応しているので3.3Vでも大丈夫でしょう。



open/closeのpush-swがあって、片方の端子がGNDにつながっています。もう片方がpull-upされているようで、sw-offで3V,sw-onでGNDになります。
なので、ここをコントロールすれば鍵を制御できます。

改造に邪魔なので電池ホルダーをはずして、制御モジュールのコネクタと配線を繋いでいきます。
電源の3.3V,GNDの線とFET-SWの線をopen,closeのpush-swのpull-up側に接続します。
これで鍵自体は制御できました。


これにドアが開いているかを検知するセンサーと内側からドアを開けたい場合に押すスイッチを追加して完成です。




2015年11月20日金曜日

車のバッテリーチェック

以前、車の室内灯を点けっぱなしで一週間おいてしまいバッテリーが上がってしまったことがありました。
室内灯のスイッチがPush-Pushのスイッチなので頭があたったか何かで点いてしまったのかもしれません。
そのときは近所の人にブースターケーブルで繋いでもらい暫く走ってなんとか復活したのですが、なんとかしないとまたやりそうなので対策を作ってみました。
回路は簡単でバッテリーの12VをDC-DCコンバータで3.3Vに落としてXBeeの電源とし、同じ12Vを33Kと2Kで分圧してXBeeのADCに入れています。
DC-DCを使ったのは12Vから3.3Vにレギュレータで落とすとちょと損失が大きくなるためです。
実測するとXBeeの送信時に10mA程度、sleep時には0.1mA程度で30秒に1回500ms程度通信するので問題なさそうです。
サーバーのほうはXBeeが送ってくる電圧が12Vを切ったらメールするように設定したのでバッテリーが上る前に気がつけると思います。

FRISKケースに入れて

 車の中のバッテリー電源に接続します。

金属部品だらけなので電波が飛ぶか心配でしたが家のすぐ前なので大丈夫でした。


2015年11月14日土曜日

KiCad4.0RC2

KiCad4.0RC2が出ました。
buildしたのでイメージをKiCad4.0RC2.dmgに置いておきます。

標準のbuildとは下記の点が異なっています。
- TrackPad/MagicMouseの動作をMacの標準的な動作に変更しています
- /Library/Application Support/kicad/internatが読まれてないので検索パスを追加しています
- fontを日本語対応のものに差し替えています

イメージをダウンロードして開くとkicadアプリケーションとkicadディレクトリがあります。
kicad.appは/Applications
kicadは/Library/Application\ Support
にそれぞれコピーします。
(finderで開いた時の矢印のとおりにDrag&Dropして下さい)

最初の1回めは開発元が未確認のため開けませんと言われてしまうので、/Applicationフォルダを開いてKiCadを右クリックし「開く」を選択して、ダイアログボックスの「開く」を選択すると起動します。

変更の詳細とbuildの手順を以下のとおりです。
今回はKiCadのbuildよりもOS X El Capitanに入れ替えた影響で色々とはまってしまいました。

変更内容はRC1の時にも書きましたが、もう一度書いておきます。

build済みはNightlyBuildがhttp://downloads.kicad-pcb.org/osx/にありますが、TrackPad/MagicMouseの使い勝手がMacの標準的な使い方とあっていません。
具体的にはTrackPadならピンチで拡大・縮小、2本指の操作で指を動かす方向にスクロール、MagicMaouseなら1本指で指を動かした方向にスクロールというのが標準的な使い方かと思います。(人によっては異論があるかもしれませんが、私はこれに慣れてしまっています)
NightlyBuildの方はTrackPadのピンチは効かず、2本指の操作で拡大/縮小、MagicMouseの1本指の操作も拡大/縮小になっています。
これはWindowsマウスのホイール動作に拡大/縮小が割り当てられているためと思われますが、クリック感があり上下にしか動かないホイールの動作とTrackPad/MagicMouseの360°操作では使い勝手が大きく違って、何をするにも画面が大きく拡大/縮小されてしまって使い物になりません。
仕方がないので自分でbuildします。

幸いなことに、この件に関するpatchがKiCadの中に既に含まれていて必要なpatchを当ててbuildしてくれるscriptが用意されています。
以前~gcorral/kicad/osx-trackpad-gesturesというbranchで進んでいたOSXのtrackpad対応が入っているようです。
これでbuildしてみて実行してみましたが、どうも以前のようにうまく行きません。
TrackPadのピンチで拡大/縮小が出来るようになっているのですが、2本指での操作でも拡大/縮小になってしまいます。MagicMouseの方も同様です。
osx-trackpad-gesturesと4.0のツリーを比較してみると関係ありそうな所が数箇所あったので修正してみました。
後々の為にpatchにしておきます。(あとでbuildの詳細でやり方を説明します)
これでbuildすると、当初の目論見どおり2本指の操作でスクロール、MagicMouseでもスクロールに出来ました。
さらに基板に日本語でシルクを入れられるように日本語フォント対応も追加します。
Windows環境が必要ですが、ここの手順どおりで日本語フォントを含んだnewstroke_font.cppを作成出来ます。
 http://wiki.kicad.jp/日本語フォントのマージ手順

ここまででひと通り準備が整ったので、以下buildの詳細手順です。

最初に面倒くさいところからやっていきます。
1.brewの対応のための/usr/local/の作成(これは既にbrewをinstallされてれば存在しているので不要です)
2.boostのbuildの対応のために/usr/libにsymbolic-linkを貼ります
こちらは/usr/libに幾つかdylibが存在しないためエラーになるための対応です。

El Capitanの場合、通常は/usr以下はroot権限でも書込みできません。
そのため以下の手順で一旦書き込みできる状態にして、変更後に書き込みできない状態に戻します。

⌘-Rを押しながら再起動してリカバリーモードに入ります。
ユーティリティのTerminalを起動し
# csrutil disable
を設定し再起動
# sudo ln -s /Applications/Xcode.app/Contents/Developer/usr/lib/*.dylib /usr/lib
でsymbolic linkを作成
もし/usr/local/を作ってない場合は作成します。
# sudo mkdir /usr/local
# sudo chown $(whoami):admin /usr/local
一応セキュリティリスクを減らすためにrootlessをenableに戻します。
再度⌘-Rを押しながら再起動し
Terminalで
# csrutil enable
にもどして再起動

以下はXcodeとCommandLineTools、brewが入っている前提で書きますので無い場合は入れて下さい。

まずはbrewを最新の状態にして必要な物をinstallします。
# brew update
# brew upgrade
# brew install cmake bzr glew cairo swig openssl

bzrに自分の名前とメールアドレスを設定します。
# bzr whoami '自分の名前 <name@example.net>'

適当なところにKiCad build用のdirectoryを掘ります。
# mkdir KiCad4.0
# cd KiCad4.0

KiCad 4.0のソースコード入手
# bzr branch lp:kicad/4.0

wxPythonソースコード入手
http://www.wxpython.org/download.php#source
から下の方にあるwxPython-srcのlinkをたどってtar-ballを取得し先ほどのdirectoryに移動し展開します。ブラウザで辿ってもいいですが下記で取得できます。
# curl -O http://jaist.dl.sourceforge.net/project/wxpython/wxPython/3.0.2.0/wxPython-src-3.0.2.0.tar.bz2
# tar xjvf wxPython-src-3.0.2.0.tar.bz2

展開されたdirectory名を変更しておきます。
# mv wxPython-src-3.0.2.0 wx-src

kicad4.0rc2_macosx_patch.tgzをダウンロードして先ほどのdirectoryに移動し展開します。


kicad_macosx_scroll.patch
kicad_macosx_internat.patch
newstroke_font.cpp_j
の3のつのファイルができます。

TrackPad、MagicMouseのスクロール対応とEl Capitan対応
# cd 4.0
# patch -p0 < ../kicad_maxosx_scroll.patch

このpatchで
common/draw_panel.cpp
common/view/wx_view_controls.cpp
scripts/osx_build_wx.sh
の3つのファイルを修正しています。

/Library/Application Support/kicad/internatのパスを検索していないようなので修正
# patch -p0 < ../kicad_macosx_internat.patch

このpatchで
common/pgm_base.cpp
のファイルを修正しています。

日本語フォント対応
# cp ../newstroke_font.cpp_j common/newstroke_font.cpp

更になぜか私の環境ではbzr-svnで/Library/Python/2.6/site-packages/subvertpy/client.soを呼び出しているところでrpathが設定されておらず下のようなエラーが発生します。

bzr: ERROR: Unable to import library "subvertpy": bzr-svn: Unable to load subvertpy extensions: dlopen(/Library/Python/2.6/site-packages/subvertpy/client.so, 2): Library not loaded: @rpath/lib/libsvn_diff-1.0.dylib
  Referenced from: /usr/lib/libsvn_client-1.0.dylib
  Reason: image not found

これは私の環境だけかもしれないのでエラーが出たら以下の対処をして下さい。
/Library/Python/2.6/site-packages/subvertpy/client.soに細工をします。
# cd /Library/Python/2.6/site-packages/subvertpy
戻せるようにbackupをとって
# sudo cp client.so client.so_org
client.soにrpathを/usrとして追加
# sudo install_name_tool -add_rpath /usr client.so
これでbzr-svnのエラーが出なくなります。

次にwxPythonのbuildです。結構時間がかかります。
# sh scripts/osx_build_wx.sh ../wx-src ../wx-bin ./ 10.11 -j4
# cd ..

kicad本体のbuild。こちらもかなり時間がかかります。
# mkdir build
# cd buld
# cmake ../4.0 \
      -DCMAKE_C_COMPILER=clang \
      -DCMAKE_CXX_COMPILER=clang++ \
      -DCMAKE_OSX_DEPLOYMENT_TARGET=10.11 \
      -DPYTHON_EXECUTABLE=`which python` \
      -DKICAD_SCRIPTING=ON \
      -DKICAD_SCRIPTING_MODULES=ON \
      -DKICAD_SCRIPTING_WXPYTHON=ON \
      -DwxWidgets_CONFIG_EXECUTABLE=../wx-bin/bin/wx-config \
      -DPYTHON_SITE_PACKAGE_PATH=`pwd`/../wx-bin/lib/python2.7/site-packages \
      -DCMAKE_INSTALL_PREFIX=../bin \
      -DUSE_IMAGES_IN_MENUS=ON \
      -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl \
      -DCMAKE_BUILD_TYPE=Release
# make
# make install
# cd ..

次にその他のリソースをNightlyBuildから持ってきて無理やりパッケージし直します。
http://downloads.kicad-pcb.org/osx/のRC2相当はkicad-r6303なのでこれをダウンロードしてマウントします。

# curl -O http://downloads.kicad-pcb.org/osx/kicad-r6303.20151109-045453.dmg

そのままではReadOnlyなのでRW出来るように変換します。

# hdiutil convert kicad-r6303.20151109-045453.dmg -format UDSP -o kicad-r6303.sparseimage
# hdiutil attach kicad-r6303.sparseimage

アプリケーション本体を置き換えるため大文字のKiCadディレクトリを削除します。
# rm -rf /Volumes/KiCad/Kicad
finder上の位置合わせをconsoleからできないのでfinderでbin/KiCad.appを開いているKiCad Volume上のKiCadディレクトリがあったところにコピーします。

フォルダを開いたままの状態でdiskimageをdetachします。
# hdiutil detach /Volumes/KiCad

イメージの未使用領域を開放します。
# hdiutil compact kicad-r6303.sparseimage

最終的なReadOnly圧縮イメージに変換します。
# hdiutil convert kicad-r6303.sparseimage -format UDZO -o KiCad4.0RC2.dmg

このイメージが一番上のほうに置いてあるイメージになります。

2015年11月7日土曜日

KiCad 4.0RC1でESP-WROOM-02用基板作成 その6

次はESP-WROOM-02版です。

RP-3基板





HA-4基板


こちらの基板はXBeeの裏面に書かれているアドレスを読み取れるようにXBeeの下のところに穴を開けてあるのですが、ESP-WROOM-02を載せると丁度放熱用のPadのところが穴に位置してしまってあまりよろしくないかもしれません。

まだ、ESP-WROOM-02をどう使うか悩み中です。ATコマンドのままでうまく使っていくのか、何らかの独自のバイナリのI/Fを定義してAVRと通信させるのか、とか考えてるところです。


2015年10月31日土曜日

KiCad 4.0RC1でESP-WROOM-02用基板作成 その5

基板が上がってきたので部品をマウントしてみます。
まずは従来通りのXBee版です。

RP-3基板
いい感じです。

HA-4基板
こちらもいい感じです。


RP-3基板をRaspberryPi2と組み合わせます。


あれ?

RP-3基板のHA-4基板書き込み用のコネクタがRaspberryPi2のHDMI、Audioコネクタと干渉しています。
CAD上で基板の板端をギリギリで避けたつもりだったのですが、コネクタの出っ張りを考慮するのを忘れてました。
実物確認しなかったためのミスです。
回路動作チェックをしてソフト書いたらもう一度出し直しです.......