FC2ブログ
02-<< 12345678910111213141516171819202122232425262728293031>>04-

自動水溜めの改善とGoogle Homeで時間指定起動

2018-03-04
以前の記事、「水換え用のRO水を自動でためる&ALD」のとおり、APEXを使って土曜日や日曜日に自動的にRO水を溜めるようにしています。たまに連日水換えしたいと思うことがありますが、毎回APEXのプログラムを書き換えていました

今回はGoogle Homeに対して喋るだけで、その日の夜に水を溜めるようにしたいと思います。

■APEXプログラム

ひとまず関連するVirtual Outletはこんな感じです。
20180304_010.jpg

以前使っていた、V_WTChTimeはV_WTCGtgrに名前を変更しています。APEXはOutletの名前を変えると、関連するOutletも名前を自動で変えてくれます

変更のあった箇所は赤字にしてあります

-----自動給水タイマー(電磁弁) ROCharge-----
Fallback OFF
Set OFF
If Outlet WT_Charge = ON Then ON
If Outlet ROSValve = ON Then ON
If ALD_WT CLOSED Then OFF

クロノスレインにある電磁弁と加圧ポンプを制御します。ROSValveはサンプへの自動給水の場合で、一日4回ONになります。バケツで水漏れがあったら問答無用でOFFになります

-----みずため電磁弁 WT_Charge-----
Fallback OFF
Set OFF
If Output V_WTCGtgr = ON Then ON
If Output V_WTFlt = OFF Then OFF
If ALD_WT CLOSED Then OFF

バケツ用の電磁弁です。トリガーでON

-----みずため水流ポンプ WT_Wave-----
Fallback OFF
Set OFF
If Output V_WT_WvHt = ON Then ON
If Output V_WTCHtgr = ON Then OFF

バケツの中の水流ポンプです。今はNWAを使っています。ヒーターと連動はできますが、今はヒーター用意していません

-----みずためから給水 WT_PumpAT-----
Fallback OFF
If Output V_WTCHtgr = ON Then ON
If Output V_WTCHtgr = OFF Then OFF
If Output V_FltUpper = OFF Then OFF
If Output V_WTFlChk = ON Then OFF
If Output V_UpperChk = ON Then OFF
When On > 075:00 Then OFF
Defer 009:00 Then ON

バケツから水槽に入れるためのPMUPです。自動水換えに使うので大きく変更しました

-----みずためヒーター WT_Heater-----
自動水換えにしたので廃止


-----バケツ給水トリガー V_WTCGtgr(旧V_WTChTime)-----
Fallback OFF
Set OFF
If Time 00:01 to 06:00 Then ON
If Output V_WTCGweek = OFF Then OFF
If Output V_WTFlt = OFF Then OFF

バケツに水を溜める時間を制御します。何曜日に水を溜めるかはV_WTCGweekで制御します

-----バケツ手動トリガー V_WTCGnow-----
Fallback OFF
Set ON
When On > 999:00 Then OFF

今日の夜は水を溜めたいって時に使います。普段はOFFにします。Google HomeからONにするのはこれですね。When ONの指定は999分…約16時間までしかONを維持できません。この問題はhubot側で解決します。APEXだけでなんとかする方法は…22時ぐらいまで待って手動でAUTOにするぐらいです

-----水溜めする曜日 V_WTCGweek-----
Fallback OFF
Set ON
If DoW SMTWTF- Then OFF
If Output V_WTCGnow = ON Then ON

水溜めする曜日を定義します。標準では土曜日にしてありますが、V_WTCGnowをAUTOにしていればその日に水溜めも可能です

-----バケツのフロートスイッチ検知 V_WTFlt-----
Fallback OFF
Set OFF
If S_WF1 OPEN Then ON
If S_WF2 CLOSED Then OFF
Defer 000:10 Then ON
Defer 020:00 Then OFF

バケツのフロートスイッチを制御します。フロートスイッチのどちらかがCLOSEDになるとOFFになります。Deferで20分を指定して、水が多めに入るようになっています(ギリギリだとON/OFFを繰り返すことになるので)。また、フロートスイッチをちょっと触るとそれでONに変わることがあったので、ONにするときも10秒の待ちを作ってあります

-----水流ポンプ&ヒーター V_WT_WvHt-----
Fallback OFF
Set OFF
If Output V_WTFlt = OFF Then ON
If Time 09:00 to 23:59 Then OFF
If Output V_WTCGweek = OFF Then OFF

水流ポンプを制御します。曜日の指定と、フロートスイッチを条件にしていますので、9時を過ぎたら自動でOFFになりますし、9時前に水換えをはじめたときでも、水が減ってフロートスイッチがOpenになるので、ちゃんとヒーターは切れます
空焚きしたらヒーターは使えなくなってしまうので重要ですね

■Google Homeで制御

ではGoogle Homeから水溜めを開始できるようにしていきます。

ひとまずbin配下にシェルスクリプトを配置します。ここでは上記で定義しているV_WTCGnowをAUTOにできるようにしています。なお/home/myhubot/binのパスは環境に合わせて変えてください

#!/bin/sh
# 水溜め開始

# 対象のAPEX Outlet
TGT_OUTLET=V_WTCGnow
# 変更したいモード 0=Auto 1=OFF 2=ON
TGT_MODE=$1
# 普段使用しているモード 0=Auto 1=OFF 2=ON
DEF_MODE=1
# 変更したモードを戻すまでの待ち時間(SLEEPへの引数)
WAIT=9h

/home/myhubot/bin/apexcontrol.sh $TGT_OUTLET $TGT_MODE $DEF_MODE $WAIT


そのあと実行権限をつけておきます。
chmod 755 /home/myhubot/bin/apex_wtcgnow.sh

あとの作業のために、関連するモジュールはアップデートしておきます
sudo systemctl stop homebot
sudo npm update
sudo npm update -g
npm install hubot-broadlink-rm@latest

コマンドを登録しておきます
bin/hubot
homebot command apex:wtcgnow bin/apex_wtcgnow.sh "#"

コマンドのテストします。これでOutletがON/OFFされればOKです
homebot send apex:wtcgnow(0)
homebot send apex:wtcgnow(1)
exit

そのあと、DBを保存
redis-cli save

最後にサービスを再起動しておきます
sudo systemctl restart homebot

もしうまくOutletが動かないときは、以下のコマンドでどこでエラーになったのか判りますのでやってみてね(デバッグモードでシェルスクリプトを実行します)
sh -x /home/myhubot/bin/apex_wtcgnow.sh 1

あとはIFTTTで起動キーワードを登録します。(クリックで拡大)
20180304_020.jpg
Google Homeに話しかけてみて、うまく認識されるか試してください。

今回IFTTTでポイントとなるのは[23:55]の部分です。
send [23:55] apex:wtcgnow(0)

hubot-broadlink-rmのバージョンアップで実装されていて、指定した時間になるまで待つことができます。このおかげで、「バケツに水をためて」といったらすぐに水を溜めはじめるのではなく、その日の夜になるまで待ってから水を溜め始めるってことができます。
注意点としては、hubotのサービスを再起動したりするとそれを忘れてしまうことぐらいでしょうか

あとGoogle Homeに任意の言葉を喋らせることができます。
詳細は「Google_Homeの喋らせ方」を見てください。

ただしうちではうまくsay.jsが動かなかったので、Google Homeを検索せずにIPアドレスを直接指定する方法にしています。
#!/usr/local/bin/node
const home   = require('google-home-notifier');
const argv   = process.argv;
const text   = argv[2] || '';
const lang   = argv[3] || 'ja';
const device = argv[4] || '';

home.ip("192.168.1.26");
home.device(device, lang);
home.notify(text, (res) => console.log('said '+ text));


なおエラーになるのはGoogle Homeの検索がうまくいかないからのようなので、該当のソースを書き換えれば良いです。

これを使って、フィードモードで残り時間を教えてくれるようにしました(クリックで拡大)
20180304_040.jpg

フィードモードは20分なので、5分毎に喋らせれば良いだけです
send apex:feednw(0) [5m] say(あと15分です) [5m] say(あと10分です) [5m] say(あと5分です) [4m] say(もうすぐ再開します) [10s] apex:feednw(1)

ただし元のfeed(0)だとsleepでひたすら待ち続けることになるので、そうじゃないバージョンを作る必要があります
以下をbin配下に格納して実行権限を付けてください

こちらはsleepしないバージョンです
#!/bin/sh
# 対象のAPEX Outlet
TGT_OUTLET=$1
# 変更したいモード 0=Auto 1=OFF 2=ON
TGT_MODE=$2
# 普段使用しているモード 0=Auto 1=OFF 2=ON
DEF_MODE=$3
# 変更したモードを戻すまでの待ち時間(SLEEPへの引数)
WAIT=$4

if   [ "$TGT_MODE" = "$DEF_MODE" ]; then
	/home/myhubot/bin/apexconnect.sh $TGT_OUTLET $TGT_MODE
else
	/home/myhubot/bin/apexconnect.sh $TGT_OUTLET $TGT_MODE
fi



そしてそれを呼び出すようにします
#!/bin/sh
# FEED Mode 汎用

# 対象のAPEX Outlet
TGT_OUTLET=V_Feednow
# 変更したいモード 0=Auto 1=OFF 2=ON
TGT_MODE=$1
# 普段使用しているモード 0=Auto 1=OFF 2=ON
DEF_MODE=1
# 変更したモードを戻すまでの待ち時間(SLEEPへの引数)
WAIT=21m

/home/myhubot/bin/apexcontrol_nw.sh $TGT_OUTLET $TGT_MODE $DEF_MODE $WAIT


あとはコマンド登録すれば良いです
homebot command apex:feednw bin/apex_feed_nw.sh "#"

こっちのコマンドは元のモードには戻しませんので、戻し忘れ注意です

hubot-broadlink-rmのおかげで色々便利になりますね。

この他、「赤外線信号のタイミングを調整する」にあるとおり、起動時間そのものを口頭指示できたりします。

スポンサーサイト





B!
関連記事
★Neptune Apex★ | コメント:(2) | トラックバック:(0)
 | ホーム | 

FC2 Blog Ranking Related Posts Plugin for WordPress, Blogger...