とりあえずやってみれば分かるかもといことでさっと手続きしました。
招待コード:yositaka
とりあえず火星の地表を走っています。
三毛猫のキュートなビジネス
インストール後、SoftwareUpdaterが走る。とても手間がかかるようです。
しかし、今までがUbuntu16だったので、いちいち無駄な手間がかかっていたのが解消されれば良いなと。
Dockerで環境を構築することにするので、その手順。
コマンドを順番に実行するだけだと思います。
Heroku環境を作る。参考
git clone 元
いや、下の3つ入らなかったような??
docker pull php:7.4-fpm-alpine
docker pull nginx:1.19-alpine
docker pull postgres:12
git clone https://github.com/nagi125/laravel-docker-template
cd laravel-docker-template/
docker-compose up
apt install docker-compose
docker-compose up
何かエラーが出ているような・・・・
docker-compose up
で起動完了。
laravelインストール
docker-compose exec app composer create-project –prefer-dist laravel/laravel blog “6.*”
docker-compose exec app cp -R ./blog/. ./
http://localhost
にアクセスできるけどエラーが出る。
file_put_contents(/app/storage/framework/sessions/P3K1Aj8hOoLxXi7AMqZD1Y7oPc8moikg4urhQuhM): failed to open stream: Permission denied
対策 参考
chmod 777 storage/logs
chmod 777 storage/framework/sessions/
chmod 777 storage/framework/views/
http://localhost/
でトップページが表示された。
vi .heroku/nginx/nginx.conf
vi Procfile
heroku-cli インストール 公式参考
sudo snap install –classic heroku
結構手間がかかっています。
heroku login
自動でブラウザは起動しなかった。まあ手動でログイン。
heroku buildpacks:add heroku/php -a your-app-name
heroku buildpacks:add heroku/nodejs -a your-app-name
git push heroku main
fatal: ‘heroku’ does not appear to be a git repository
fatal: Could not read from remote repository.
gitのリポジトリが無い。
gitインストールして無かったから。 参考
sudo apt update && sudo apt install git
git –version
git version 2.25.1
git push heroku main
fatal: ‘heroku’ does not appear to be a git repository
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
対策、参考
git remote add heroku https://git.heroku.com/アプリケーション名.git
git push heroku main
! [rejected] main -> main (fetch first)
error: failed to push some refs to ‘https://git.heroku.com/アプリ名.git’
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., ‘git pull …’) before pushing again.
hint: See the ‘Note about fast-forwards’ in ‘git push –help’ for details.
対策、参考
git commit
*** Please tell me who you are.
対策、参考
$git config –global user.email ここに自分のアドレス
$git config –global user.name ここに自分の名前
git commit
何かまだエラーがあるような
そもそも、gitコマンドに慣れてないので。参考
git push heroku main
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., ‘git pull …’) before pushing again.
hint: See the ‘Note about fast-forwards’ in ‘git push –help’ for details.
なるほど既に前のやつとの整合性が取れない。参考。
git pull heroku main
なるほど。アプリケーションを新しく作った方が良いな。リモートの。
http://localhost/
でエラーになってしまった。pullしたせいだなこれは。
要はやり直した方が良い。
削除。docker rm などで。参考
docker rmi [イメージID]
git push heroku main
でまだエラーが出る。
remote: Script @php artisan package:discover --ansi handling the post-autoload-dump event returned with error code 255
remote: ! WARNING: A post-autoload-dump script terminated with an error
remote:
remote: ! ERROR: Dependency installation failed!
remote: !
remote: ! The 'composer install' process failed with an error. The cause
remote: ! may be the download or installation of packages, or a pre- or
remote: ! post-install hook (e.g. a 'post-install-cmd' item in 'scripts')
remote: ! in your 'composer.json'.
remote: !
remote: ! Typical error cases are out-of-date or missing parts of code,
remote: ! timeouts when making external connections, or memory limits.
remote: !
remote: ! Check the above error output closely to determine the cause of
remote: ! the problem, ensure the code you're pushing is functioning
remote: ! properly, and that all local changes are committed correctly.
remote: !
remote: ! For more information on builds for PHP on Heroku, refer to
remote: ! https://devcenter.heroku.com/articles/php-support
remote: !
remote: ! REMINDER: the following warnings were emitted during the build;
remote: ! check the details above, as they may be related to this error:
remote: ! - A post-autoload-dump script terminated with an error
remote:
remote: ! Push rejected, failed to compile PHP app.
remote:
remote: ! Push failed
remote: !
remote: ! ## Warning - The same version of this code has already been built: 4f6a003432986e9c40d4e65c18566b7000573630
remote: !
remote: ! We have detected that you have triggered a build from source code with version 4f6a003432986e9c40d4e65c18566b7000573630
remote: ! at least twice. One common cause of this behavior is attempting to deploy code from a different branch.
remote: !
remote: ! If you are developing on a branch and deploying via git you must run:
remote: !
remote: ! git push heroku :main
remote: !
remote: ! This article goes into details on the behavior:
remote: ! https://devcenter.heroku.com/articles/duplicate-build-version
remote:
remote: Verifying deploy...
————-
ビルドログがなんか違うぞ。
Installing platform packages…
– php (8.1.4)
– apache (2.4.53)
– composer (2.3.3)
– nginx (1.20.2)
どうもこれらしいな。phpのバージョンが8になってるんだ。
laravelはversion8からphp8なのか?
docker-compose exec app composer create-project –prefer-dist laravel/laravel blog “8.*”
docker-compose exec app cp -R ./blog/. ./
docker-compose exec app rm -rf blog
ではphpは8にならなかった。
php8にする。どうやって? 参考
.docker/php# vi Dockerfile
#FROM php:7.4-fpm-alpine
FROM php:8.0.5-fpm-alpine
docker rmi a64a6e03b055
とかで消してから再度docker-compose up
docker-compose exec app composer create-project –prefer-dist laravel/laravel blog “8.*”
ralavelのversion8をインストール
docker-compose exec app cp -R ./blog/. ./
docker-compose exec app rm -rf blog
git add .
git commit -m “comment”
http://localhost/
でエラーが出る。
Symfony\Component\ErrorHandler\Error\FatalError
Declaration of Symfony\Component\Translation\TranslatorInterface::getLocale() must be compatible with Symfony\Contracts\Translation\LocaleAwareInterface::getLocale(): string
“symfony/translation”: “4.3.8”,
なんか違う事やってたかもしれない。解決できないな。
composer update
sudo apt-get remove composer;
composer self-update
しかし、git push heroku main で、
ビルドはできた。
heroku config:set APP_KEY=your-app-key -a your-app-name
が無いからアクセスはできない。
電気代が13500円とか、阿保みたいに高くなったので自動制御システムを導入しようかと。
とはいえ、結構やっつけ、場当たり的なコードで対応しています。
スイッチボット ハブミニ
スイッチボット 温湿度計
スイッチボット プラグミニ
ーーーーーーーーーーーーー
2024-06-25 GASの認証が不安定なのでLaravelに移行。
しかしLaravelに移行してもエアコンの状態そのものを取得できない。
ーーーー引用ーーーー
SwitchBot ハブミニは赤外線リモコンによる操作なので、エアコン本体からのフィードバックを取ることはできません。
なので、On/Offや冷房・暖房・送風などの状態、温度設定などは、あくまでもハブミニで設定した状態であり、もし赤外線がうまく本体に届かなかったら本体がそのとおり動いていない可能性があります。
ーーーー引用ここまでーーーー
アプリでは状態取得できているように見えるんだけどなぁ。
リアルタイムの状態が取れないとなると、毎回制御情報を送信したほうがいいかも。
ーーーーーーーーーーーーー
電気代の調査もしていた結果、無駄に動いて電力を消費しているようなので。
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);
}
}
stop_cool_dry_temp
28
warm_on_temp
22
取りあえず冬はもしかして26℃とかにするだろう。けど冷房が動いては困る。
あと、GBP制御をすることにする。外にいるときは換気扇を回していいが、家にいるときには回さないで欲しいかな。
と言う設定をして様子を見ることにします。
現状取りあえず、パラーメータを以下で対応。要は何にもやってないマニュアルのみ。
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']+"%より低いので暖房運転開始";
}
こんなのを追加しただけで行けるかなと。
何故だろう。原因不明だけどとりあえず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);
}
再び「認証が必要です」と出ています。一度許可した権限が一定時間で消えてしまう。これで二回目です。
確認しましたが、こちらの設定をオンの状態でした。
勿論権限を再承認しましたが、様子を見ている状態です。
上記のURLをよく読んでみると「オン」にした状態で認証すれば出なくなる。のかもしれないです。
とにかく様子見です。
Script_ON_OFF_flg
OFF
の項目を有効か。とりあえず。
これがOFFの時はスクリプトを実行しないようにしました。
要は今日あたりは結構涼しかったので、エアコンいらない。けど、除湿だけは稼働していたからです。湿度は高かった。
じかし、実際には寒すぎるくらいまで除湿してくれていたし、そもそも窓を開けていても快適なくらいでした。
よって、もしかして外気の状況によっては止める制御も入れた方が良いのかもしないと思っている所です。
まあ、理想的には野外に温湿度計を設置して室内との差を見ると良いのかもしれないですね。
こちらからアメダスのデータを取得してみます。
最新版はこちらになるのかも
私の所からは相模原中央の観測所が近い気がします。こちらによると
となると amdno=46046 という事になるのかと。
取得できないな。観測所によってはダメ見たい。
辻堂 こちらはOKっぽい
相模原中央
ほぼ日付しか取れていない。
海老名
温度は取れたが湿度がとれていない。
なるほど。この表に載っている情報しか取れないんだ。多分。
湿度がとれる横浜だと随分と私の所からずれてしまう。
けど、とりあえず仕方ないのかと。横浜
weather_Station_get_URL
https://api.cultivationdata.net/amds?point=46106
とか適当にパラメーターを設定して外気が設定温度より低い場合は単に換気のみとしました。
取り合えアズまたこれで様子を見ようかと。というか、暖房の事を全く今のところ考えていないな。
なぜか一度許可した実行権限が無くなって自動実行されない状態でした。
こちらと同じかもしれないです。
こちらの設定をオンにしたので、これで様子見します。
まあ確かにこれはデフォルトでオフだろうなと思われる設定な気もします。勝手に私の実行権限でアプリケーションを変更られてはたまらない。
信頼できるディベロッパーにしか許可できないでしょう。
まあ、一応アカウント自体を分けて作っているわけですが。
取りあえずオンにしたので、この状態で様子見します。
設定温度に対して判定だとあまりに頻繁にエアコン制御が発生しているようなので、Range範囲内なら弱運転に変更しました。
また、除湿よりも冷房優先にしました。
除湿だと温度が下がりすぎてしまうようでして。
そもそも冷房かければ除湿もされるし。
あと、換気扇の制御は部屋にいない時は自動的に換気で良いのだけど、いるときに換気されると、勝手に温度、湿度共に上がって、無駄にエアコンのオンオフ制御が発生しています。
取りあえず、部屋にいるときは換気扇をONにしないことにしました。
とはいえ、外気の状況によってはオンにした方が良いときもあるでしょうから、もしかして気象庁のデータからPullして判定するかもしれません。
あと、get_aircon_status() とか、デバイスID指定して試してみましたが、エアコンのステータスは取れないようでした。そりゃあそうかなと。エアコン側からリモコンに情報発信していないでしょうから。
よって、ログから起動状態を推測するしかないかと。
あと、トークンとかでバイスのベタ打ちをやめます。そりゃあそうか。参考
なるほど。結局新エディタではスクリプトに書くことになっているような。参考
こちらをほぼ丸コピーして動くようにしました。
なんか微妙な感じもするけど、編集権限を厳密に管理することでセキュリティを担保することにします。
あと、何故かシートIDとTabIDあたりはベタ打ちでないとうまくうごかなかったような?
とりあえずこれで様子を見ます。
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 リクエストのアプリの事か?若干不明だが、見落としていただけかもしれない。
取りあえず、出来たっぽい
ただ、画面オフ状態から実行されるのかのチェックは必要だ。
ーーーーーーーーーーーーー
doPostのログが出なかったのでこちらを参考にGCPプロジェクトと紐づけ。
結果的にログは出たのだが、デプロイが反映されていないのに気づくのに結構嵌った。
要はデプロイを管理で画面で、「新バージョン」を選びなおさないとならなかった。
あと、今のIFTTT設定だとエリアに出入りしたときにスマホがビジーだと変更されないようでした。
よって、とりあえずMacrodoridとHttpShortcutsのショートカットで時間で判定しています。
Taskerプラグインでは動かなかったので仕方ないですが、どうもスマートじゃないので後に変更するかもしれないです。
あと、換気扇制御用のプラグを注文しました。
こちらを参考にスイッチボットのスクリプトを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の連携を調査します。参考