電気代が13500円とか、阿保みたいに高くなったので自動制御システムを導入しようかと。
とはいえ、結構やっつけ、場当たり的なコードで対応しています。
スイッチボット ハブミニ
スイッチボット 温湿度計
スイッチボット プラグミニ
ーーーーーーーーーーーーー
2024-06-25 GASの認証が不安定なのでLaravelに移行。
しかしLaravelに移行してもエアコンの状態そのものを取得できない。
ーーーー引用ーーーー
SwitchBot ハブミニは赤外線リモコンによる操作なので、エアコン本体からのフィードバックを取ることはできません。
なので、On/Offや冷房・暖房・送風などの状態、温度設定などは、あくまでもハブミニで設定した状態であり、もし赤外線がうまく本体に届かなかったら本体がそのとおり動いていない可能性があります。
ーーーー引用ここまでーーーー
アプリでは状態取得できているように見えるんだけどなぁ。
リアルタイムの状態が取れないとなると、毎回制御情報を送信したほうがいいかも。
制御ログ
ーーーーーーーーーーーーー
2022-12-08(TH)設定追加、流石に家にいない間はエアコンを切ろうかと。
電気代の調査もしていた結果、無駄に動いて電力を消費しているようなので。
warm_on_temp_out_gps
5
をパラメーターで追加。
とうことで、GPSで外出中の時は5度を下回らない限りエアコンはオフになる
メッセージはこんな感じにしました。
[“OFF,low,vent”,”{\”para\”:\”0,0,2,off\”,\”st\”:\”success\”,\”msg\”:\”冬用判定(stop_cool_dry_temp)25より低い 。ventのみ,温度=18,湿度=47\”}”,{“statusCode”:100,”body”:{},”message”:”success”}]
あと、Gasの権限がたまに切れて再設定する羽目になる現象は解決していないので、エアコン制御通知をメールするようにします。
//パラメーターをセット、メールアドレス
var prop = PropertiesService.getScriptProperties().getProperties();
var notice_mail_address = prop.notice_mail_address;
function notice_mail(paraRange,jtext){
if(paraRange == "A4:B4"){
let recipient = notice_mail_address; // 宛先メールアドレス
let subject = "エアコン制御変更"; // 件名
let body = jtext; // 本文
let options ={
// cc: "cc@gmail.com", // ccアドレス
// bcc:"bcc@gmail.com", // bccアドレス
noReply:true // 返信不要
};
//送信
GmailApp.sendEmail(recipient, subject, body, options);
}
}
2022-10-10(MO)設定変更。夏冬で体感温度が恐らく違うので。
stop_cool_dry_temp
28
warm_on_temp
22
取りあえず冬はもしかして26℃とかにするだろう。けど冷房が動いては困る。
あと、GBP制御をすることにする。外にいるときは換気扇を回していいが、家にいるときには回さないで欲しいかな。
と言う設定をして様子を見ることにします。
2022-10-08(SA)最近急に寒めなので暖房制御を追加しようかと。
現状取りあえず、パラーメータを以下で対応。要は何にもやってないマニュアルのみ。
Script_ON_OFF_flg
OFF
以下2つをパラメーターに追加
stop_cool_dry_temp
warm_on_temp
GPS | TIME_BASE | Script_ON_OFF_flg | GPS_chg_time | min_chg_time_span | LowestTemp | MaxTemp | MaxHumi | TargetTemp | TargetHumi | RangeTemp | RangeHumi | VentControl | weather_Station_get_URL | stop_cool_dry_temp | warm_on_temp |
OUT | 使ってない | OFF | 2022-10-08 14:56:00 | 15 | 10 | 37 | 85 | 27 | 65 | 2 | 3 | 1 | https://api.cultivationdata.net/amds?point=46106 | 22 | 17 |
//冷房、除湿OFF、暖房ONの設定追加
if(parseInt(globalpara['stop_cool_dry_temp']) > parseInt(meterJson['body']['temperature'])){
calc_Para['calc_Command']='OFF,low,vent';
calc_Para['calc_Message']='冷房除湿判定温度'+globalpara['stop_cool_dry_temp']+"%より低い停止";
}
if(parseInt(globalpara['warm_on_temp']) > parseInt(meterJson['body']['temperature'])){
calc_Para['calc_Command']='HEAT,low';
calc_Para['calc_Message']='暖房判定温度'+globalpara['stop_cool_dry_temp']+"%より低いので暖房運転開始";
}
こんなのを追加しただけで行けるかなと。
2022-09-29(TH)やはりGasの権限でエラーが出る。たまに。
何故だろう。原因不明だけどとりあえずPOSTのリターンコードでメッセージを出すことにします。
多分これで良いのかな?
リターンコード200以外はメッセージで通知するようにしただけです。
Macrodroid
スプレッドシートにログとして出力しています。
function doPost(e) {
var params = JSON.parse(e.postData.getDataAsString());
var funcName = params.funcName;
var funcVal = params.funcVal;
if(funcName == "GPS"){
if(globalpara["GPS"] != funcVal){
globalpara["GPS"] = funcVal;
//更新間隔判定
const d5 = dayjs.dayjs(new Date());
const d6 = dayjs.dayjs(globalpara['GPS_chg_time']);
const span_Time = d6.add(globalpara['min_chg_time_span'],'m');
if(d5 > span_Time){
//更新時間アップデート
globalpara["GPS_chg_time"] = d5.format('YYYY-MM-DD HH:mm:ss');
//書き出し
console.log("cols="+cols);
const setPara = [Object.keys(globalpara),Object.values(globalpara)];
sheet.getRange(1,1,2,cols).setValues(setPara);
//ログ記録
log(params,"A4:B4");
}else{
log(params,"E4:F4");
}
}else{
log(params,"E4:F4");
}
}
}
function log(params,paraRange) {
////////ログ行数管理
const rows = sheet.getMaxRows();
if(rows < 200){
sheet.insertRowsAfter(100, 100)
console.log(rows);
}
sheet.deleteRows(70,10);
//最新ログ行追加
const range = sheet.getRange(paraRange);
range.insertCells(SpreadsheetApp.Dimension.ROWS);
var date = new Date();
date = Utilities.formatDate(date, "Asia/Tokyo", "yyyy/MM/dd H:mm:ss");
var jtext = JSON.stringify([ params.funcName,params.funcVal,params.funcVal2 ]);
const values = [
[ date, jtext ],
];
range.setValues(values);
}
2022-09-05(MO) スクリプト停止、エアコン稼働していない。
再び「認証が必要です」と出ています。一度許可した権限が一定時間で消えてしまう。これで二回目です。
確認しましたが、こちらの設定をオンの状態でした。
勿論権限を再承認しましたが、様子を見ている状態です。
上記のURLをよく読んでみると「オン」にした状態で認証すれば出なくなる。のかもしれないです。
とにかく様子見です。
2022-08-29(MO) マニュアルでスクリプトを実行しないように対応
Script_ON_OFF_flg
OFF
の項目を有効か。とりあえず。
これがOFFの時はスクリプトを実行しないようにしました。
要は今日あたりは結構涼しかったので、エアコンいらない。けど、除湿だけは稼働していたからです。湿度は高かった。
じかし、実際には寒すぎるくらいまで除湿してくれていたし、そもそも窓を開けていても快適なくらいでした。
よって、もしかして外気の状況によっては止める制御も入れた方が良いのかもしないと思っている所です。
まあ、理想的には野外に温湿度計を設置して室内との差を見ると良いのかもしれないですね。
こちらからアメダスのデータを取得してみます。
最新版はこちらになるのかも
私の所からは相模原中央の観測所が近い気がします。こちらによると
となると amdno=46046 という事になるのかと。
取得できないな。観測所によってはダメ見たい。
辻堂 こちらはOKっぽい
相模原中央
ほぼ日付しか取れていない。
海老名
温度は取れたが湿度がとれていない。
なるほど。この表に載っている情報しか取れないんだ。多分。
湿度がとれる横浜だと随分と私の所からずれてしまう。
けど、とりあえず仕方ないのかと。横浜
weather_Station_get_URL
https://api.cultivationdata.net/amds?point=46106
とか適当にパラメーターを設定して外気が設定温度より低い場合は単に換気のみとしました。
取り合えアズまたこれで様子を見ようかと。というか、暖房の事を全く今のところ考えていないな。
2022-08-29(MO) GASの権限が無くなるエラーに対応
なぜか一度許可した実行権限が無くなって自動実行されない状態でした。
こちらと同じかもしれないです。
こちらの設定をオンにしたので、これで様子見します。
まあ確かにこれはデフォルトでオフだろうなと思われる設定な気もします。勝手に私の実行権限でアプリケーションを変更られてはたまらない。
信頼できるディベロッパーにしか許可できないでしょう。
まあ、一応アカウント自体を分けて作っているわけですが。
取りあえずオンにしたので、この状態で様子見します。
2022-08-25(TH)プログラム修正、RangeTemp、RangeHumi を許容範囲に
設定温度に対して判定だとあまりに頻繁にエアコン制御が発生しているようなので、Range範囲内なら弱運転に変更しました。
また、除湿よりも冷房優先にしました。
除湿だと温度が下がりすぎてしまうようでして。
そもそも冷房かければ除湿もされるし。
あと、換気扇の制御は部屋にいない時は自動的に換気で良いのだけど、いるときに換気されると、勝手に温度、湿度共に上がって、無駄にエアコンのオンオフ制御が発生しています。
取りあえず、部屋にいるときは換気扇をONにしないことにしました。
とはいえ、外気の状況によってはオンにした方が良いときもあるでしょうから、もしかして気象庁のデータからPullして判定するかもしれません。
あと、get_aircon_status() とか、デバイスID指定して試してみましたが、エアコンのステータスは取れないようでした。そりゃあそうかなと。エアコン側からリモコンに情報発信していないでしょうから。
よって、ログから起動状態を推測するしかないかと。
あと、トークンとかでバイスのベタ打ちをやめます。そりゃあそうか。参考
なるほど。結局新エディタではスクリプトに書くことになっているような。参考
こちらをほぼ丸コピーして動くようにしました。
なんか微妙な感じもするけど、編集権限を厳密に管理することでセキュリティを担保することにします。
あと、何故かシートIDとTabIDあたりはベタ打ちでないとうまくうごかなかったような?
とりあえずこれで様子を見ます。
2022-08-18(TH)追加設定、HTTPshotcutをバッテリーセイバーから除外
MacrodroidからキックされているようだがPostが届いていない。ログを見ると。
よって、HttpShortcutsをバッテリー制御から除外してみました。
が、どうもそれでも届いていない気がします。
HttpShortsの設定でフォアグラウンドでリクエストを実行を許可しました。
アプリ外部からショートカットが機能しない場合に有効にとあるので。
それとは別に、ステータスsuccessの判定を削除。マニュアルでオンオフしたときにはステータスとか記録されていないので対応。
しかし、それでもPostされていない。Macrodroidのログは動いているのでHttpShotcutsが動いていないと思われます。
画面がアクティブの時は正常動作しました。つまりHttpShotcutsが画面上にいちいち出てこないといけない状態なんだろう。
バックグラウンドで実行時ポップアップの表示を許可。いや許可しない事にしました。でも動かない。
しょうがない・・・termuxでいくか 参考
#!/bin/bash
wget –header=’content-type: application/json’ –post-data ‘{JSONデータ}’ URI
リポジトリが使えない?参考
Termuxインストール参考
GooglePlay上のアプリはサポート切れしている模様。
F-DROID
こちらからは正常動作するようです。
Mirrors by Grimler をつかっています。リポジトリ
pkg install wget git curl proot yarn vim
と思ったらMacrodroidのHTTPリクエストにPOSTがあるじゃないか。
HTTP リクエストのアプリの事か?若干不明だが、見落としていただけかもしれない。
取りあえず、出来たっぽい
ただ、画面オフ状態から実行されるのかのチェックは必要だ。
ーーーーーーーーーーーーー
2022-08-15(MON)スクリプト作成中メモ
doPostのログが出なかったのでこちらを参考にGCPプロジェクトと紐づけ。
結果的にログは出たのだが、デプロイが反映されていないのに気づくのに結構嵌った。
要はデプロイを管理で画面で、「新バージョン」を選びなおさないとならなかった。
あと、今のIFTTT設定だとエリアに出入りしたときにスマホがビジーだと変更されないようでした。
よって、とりあえずMacrodoridとHttpShortcutsのショートカットで時間で判定しています。
Taskerプラグインでは動かなかったので仕方ないですが、どうもスマートじゃないので後に変更するかもしれないです。
あと、換気扇制御用のプラグを注文しました。
2022-08-04(TH) エアコンをもう少し細かく制御できるようにしようかと
こちらを参考にスイッチボットのスクリプトをGASで作ろうと思います。
殆ど丸コピーで対応できたのだけど、一か所修正しないとリモコン(赤外線リモコン)のデバイスが表示できなかった。
修正箇所
//console.log(json['body']['deviceList'])//ログから取得したいdeviceIdを選んでください
console.log(json['body'])//ログから取得したいdeviceIdを選んでください
function switchBot
でエアコンを起動できることを確認しました。
よって次はエアコンの設定を変えて起動します。参考
以下で25℃の除湿で起動を確認。
“command”: “setAll”,
“parameter”: “25,3,1,on”,
“commandType”: ‘command’
次は温湿度計の値を取得します。参考
GET https://api.switch-bot.com/v1.0/devices/XXXXXXXXXXXXXXX/status
こちらを利用して取得してみます。
普通に取得できました。
humidity: 63,
temperature: 29.4
GPSと連動させたいので、IFTTTとGASの連携を調査します。参考