2012年10月13日土曜日

外部温度センサー異常

先週修理した雨センサー+南側の外気温センサーですが、どうも外気温センサーがおかしな値を示しています。
5分おきにlogをとってグラフにしてみました。



直射日光が当たるので60度近くまで上がるのは、まぁいいのですが、たまに電圧がドロップするのか異常に低い値を出すことがあります。
この温度センサーは温度=(電圧(mV) - 500)/10という式で値をとっているのですが、150mV程度になることが度々あるようです。
もしかするとどこか断線していて周辺の温度で収縮して接触不良が起きているのかもしれません。
雨センサーの動作確認ができたらもう一度修理してみます。

東京アメッシュ

センサーだけに頼るのではなく、うちの近くに雨が降ってきたことを検知して窓を閉めるために東京アメッシュのデータを利用できないか調べてみました。
SafariのDebug機能を使ってアメッシュのページ構造を見てみます。

一番下に地形図レイヤー(http://tokyo-ame.jwa.or.jp/map/map000.jpg)が配置されて、その上に降水量を表すレイヤー(http://tokyo-ame.jwa.or.jp/mesh/000/201210130020.gif)、さらにその上に行政区画のレイヤー(http://tokyo-ame.jwa.or.jp/map/msk000.png)が載っている構造のようです。
なんでjpg,gif,pngの3種類も使っているのか判りませんが、真ん中のgifのレイヤーのファイルを取得すれば降雨情報が取れそうです。

gifファイルのファイル名は現在時刻から5分刻みの直前の時間を求めればいけそうです。

とりあえず、行政区画のレイヤーをgoogle mapと比べながら左上と右下の緯度経度座標を調べてみます。
socketでhttpのportを開いてgifファイルを取得し、libgifを使ってメモリ上に展開します。
そのデータを使って、うちの座標から位置を割り出してそこを中心に5km以内の雨の強さとうちからの距離で重み付けして降雨指数を作ってみました。

ここまでテストプログラムを組んだのですが、一向に雨が振りません。この間まで毎日夕方に降っていたのに。
東京アメッシュのデータは雨が無いと透明レイヤーのみなのでよく判りません。
多分、ちゃんと動いていそうなのですが.....
うまく動いていることが確認できたら定期的に監視するようにしてMacMiniに組み込んでみます。
今週中に雨が振って動作確認できるか?


2012年10月7日日曜日

降雨センサーの修理

設置していた降雨センサーがおかしくなってきたので修理しました。

今までのセンサーの回路は流用したセンサー基板にADの入力最大電圧1.2Vに収めるために3.3Vを分圧する回路を追加した下記のような回路でした。

この回路だと、乾燥状態でAD-INが1.1Vくらい、雨が降ると徐々に電圧が低下して0Vに近くなるというものです。
ADの読み値は0Vで0、1.2Vで1023という10bitAD なので、数値を変換して(1023-AD)/103として0〜99の値で雨の状態を返していました。数値が20以下だと大体乾燥している状態でした。
ところがこの状態だとVCCの電圧のブレや配線の電圧降下でばらついてしまいます。
さらに、先日の台風の時の雨が染みこんでしまったのか、晴れていても80くらいの値を指している状態が続いていました。

今回は、センサー部分の極性を逆にして、乾燥状態で0V、雨が降ると電圧が1.1Vに近くなる回路に変えました。


回路部分をコーキングして設置しなおしてみます。
これでも雨が染みこんで値がおかしくなるようなら、中継基板を途中につけて抵抗等の回路部分を屋内側に置くように変えるつもりです。


2012年10月6日土曜日

スケジュールによる動作

ControlDaemonにスケジュール動作の機能を追加しました。
設定ファイルに下記のような記述をすることで指定された時間にcommandを実行します。


event:
#month  day             time            condition       command
*       weekday2        08:00           *               east_shutter_open
*       *               sunset-00:30    *               east_shutter_close

*       *               08:00           *               center_shutter_open
*       *               sunset-00:30    *               center_shutter_close

*       *               08:00           *               west_shutter_open
*       *               sunset-00:30    *               west_shutter_close

11-5    weekday1        06:00           cold1           floor_heater_dining_on
11-5    weekday1        06:30           cold2           aircon_heater_20
11-5    weekday1        07:30           *               floor_heater_dining_off
11-5    weekday1        08:00           *               aircon_stop

例えばcenter_shutter_openの行は毎月、毎日、朝08:00に実行することを表しています。
center_shutter_closeの行のtimeの項目のsunset-00:30は日没時間の30分前に実行することを表しています。
monthに11-5を指定されているところは11月〜5月の間だけ実行されます。
dayにweekday1と指定されているところは下記の設定のカレンダーによって指定された曜日のみ実行されますが、holidayで指定された日は休日なので実行されないようになっています。

# week holiday
weekday:
weekday1 mon tue wed thu fri
weekday2 wed thu fri

holiday:
1/1 2/11 4/29 5/3 5/4 5/5 11/3 11/23 12/23 # month/day
1/2mon 7/3mon 9/3mon 10/2mon # month/week dayofweek
2012/3/20 2012/9/22 # year/month/day

conditionの項目は下記の設定項目で指定された条件を満たしているときだけ実行されます。


condition:
cold1   internal_2f_temp < 100 # 10.0
cold2   internal_2f_temp < 150 # 15.0
hot1    internal_2f_temp > 280 # 28.0


floor_heater_dining_onの行は11月〜5月の月曜日〜金曜日で休日でない日の朝06:00に2Fリビングの室内の温度センサーが10°Cよりも下回っていたら実行されます。
今のところ順調に動作していそうです。

XBeeの制御サーバーの構造

XBeeを制御しているMacMiniのサーバーdaemonの機能を整理しました。
下記のような構成になっていて、まずはControlDaemonの方を作っています。
EventDaemonはControlDaemonのほうが一段落したらとりかかるつもりです。
現状はEventDaemonからの接続portに対してtelnetでコマンドを投げて動作確認しています。



ControlDaemonの仕事はsocketのportを監視してコマンドを解釈、それをXbeeのコマンドやiRemoconのコマンドに置き換えて送信、応答を確認してNGの場合はretryをすること。
XBeeモジュールを定期的にWatchして異常が起きた時の対応、温度センサーや降雨センサーの状態を監視して、指定されたしきい値を超えた時のコマンド発行。
指定された時間が来た時にコマンドを発行することです。

EventDaemonは外部のWebPageの監視をして、コマンドを発行する担当で考えています。

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アダプタを取り付け壁の中にアンテナの位置に注意しながら収めます。