2012年9月23日日曜日

制御用のプログラムをdaemon化

以前作ったプログラムはコマンドラインで命令を引数に実行すると、XBeeモジュールに命令を出して、その応答を待って表示して終わるだけのものでした。
XBeeのモジュールが増えてきたせいか、たまに通信のシーケンスがおかしくなって暫く通信できなくなった後に復帰する現象がみられました。

まずXBeeモジュールの通信部分を安定させるため、送ったコマンドと応答のパケットをqueueに積んで照合しながらTimeoutしたものをRetryするように作り直しました。
daemonとしてmac miniで常時動かしておいて、socketでこのdaemonにテキストベースの命令を投げるとconfigファイルで定義されたシーケンスを実行するようにしました。

現在のコマンド一覧です。

south_window_open
south_window_stop
south_window_close
south_window_stat
north_window_open
north_window_stop
north_window_close
north_window_half
north_window_stat
floor_heater_living_on
floor_heater_living_off
floor_heater_living_stat
floor_heater_dining_on
floor_heater_dining_off
floor_heater_dining_stat
entrance_key_open
entrance_key_close
entrance_key_stat
internal_2f_temp
internal_1f_temp
external_south_temp
external_north_temp
external_rain
east_shutter_open
east_shutter_stop
east_shutter_close
center_shutter_open
center_shutter_stop
center_shutter_close
west_shutter_open
west_shutter_stop
west_shutter_close
aircon_cooler_full_27
aircon_cooler_auto_27
aircon_heater_auto_18
aircon_heater_full_18
aircon_cooler_25
aircon_cooler_26
aircon_cooler_27
aircon_cooler_28
aircon_cooler_29
aircon_heater_24
aircon_heater_23
aircon_heater_22
aircon_heater_21
aircon_heater_20
aircon_stop



例えばsocketでdaemonに対してfloor_heater_living_onという命令がきたら、床暖房のコントローラにつけたモジュール経由でHA端子のStatusを読んでonになっていなければonにするパルスを出し、再度Statusを確認して応答を返す。変わらない場合は何回かリトライ。それでもだめならエラーを返す。
という感じです。
後半のaircon系のコマンドはiRemoconへsocket通信で投げています。

まずは家の中からはtelnet経由で制御できるところまでは出来ました。
次はスケジュール管理しながら、定期的にいろんなセンサーの状態を読み取って雨が降ってきたら窓を閉めたりするプログラムを追加していきます。

電動シャッターの制御

1Fの電動シャッター3箇所のモジュール設置です。

スイッチとタイマーモジュールを外すと壁の中に樹脂製のスイッチボックスが見えます。
ボックスの中にはそれほどスペースがないので一度、壁内のボックスを固定しているネジを外して ずらしXBeeのモジュールを落とし込める隙間を開けます。


一式を取り付けて通信確認しますが、うまく通信できません。
2Fの対角のところにXBeeの親機がいるので電波が家の構造物(軽量鉄骨です)に邪魔されているようです。
玄関の鍵制御のモジュールをEndPointからRouterモードに設定し直して中継できるようにしたところちゃんと繋がりました。

ここには1Fの室内温度を測るための温度センサーも一緒につけてます。

すべて壁の中に落としこんでボックスを元通り取り付けます。 

スイッチ類も付け直して完成です。



2012年9月22日土曜日

南側と北側の窓にセンサーを追加

南側の吹き抜けの電動窓はコントロールは出来るのですが、HA端子と違い現在の状態を知ることができません。
そのうちに、窓が開いているときに雨が降ってきたら閉める、外からエアコンを入れるときに室温が高かったら一度換気する、などの機能を追加したいので窓の開閉状態を読めるようにしました。

窓の近くにモジュールを1つ設置し、リードSWと磁石を窓に貼り付けます。
これで窓の状態が読めるようになります。
この窓は2Fリビングの吹き抜けの上なので変なモジュールがあっても気になりません。
ただ、電源が取れないので取り敢えず単3乾電池2本で電源をとっています。
どれ位もつのか見てまた考えます。

同じモジュールのADC入力にセンサーも追加します。
外まで伸ばして、雨滴センサーと温度センサーを貼り付けます。
配線部分が濡れて誤動作しないようにコーキングしています。

窓枠にそって配線を固定します。

北側の電動窓にもリードSWと温度センサーを配置
こちらの窓は下が開くタイプのすべり出し窓なのでよほど強い風の時でないと雨は吹き込みません。雨滴センサーは南側のもので兼用にします。
温度センサーは南側は直射日光で45℃位を示すことがあるので、こちらのほうが正確です。
北側の窓はリビングから目線に入るのでそのうちもうちょっと目立たない様にしたいです。
モジュールを作りながら取り付けていたらすっかり夜になってしまいました。


2012年9月1日土曜日

MacMiniから制御


仮のプログラムとして、MacMiniから家の中のXBeeモジュールの制御をするプログラムを作りました。

下記のようなconfigファイルでコマンド名とその動作を食わせて、引数で指定されたコマンド名に応じてXBeeモジュールとそのポートと動作を定義出来るようにしました。
# ha1_control  /dev/cu.usbserial-A4013FZG  south_window_open
とコマンドを打つと南側の窓が開きます。

あとは、これとwebを繋ぎこめばシステムの完成ですが、まだ先は長そうです。



床暖房、玄関鍵にも取り付け


出来上がったモジュールを床暖房のコントローラに取り付けます。
床暖房のコントローラは2chなのでHA端子を2系統接続します。
ついでに室温も測れるように温度センサーも付けておきます。
壁内のコンセントにACアダプタを取り付けます。
周辺の電線や金属のフレームにXBeeのアンテナが近づかないような位置に押し込んで壁の中に収めます。




玄関の鍵のコントローラもHA端子です。
こちらもACアダプタを取り付け壁の中にアンテナの位置に注意しながら収めます。