1.はじめに
寒い日が続いていますね。私も寒さが苦手で、特に冬の朝は布団から出るのが一苦労です。そこで、朝起きる少し前にエアコン(暖房)を自動でオンにし、快適に目覚められる仕組みを作りました。この仕組みは、以下の3つのクラウドサービスで構築しました。
- Amazon Web Services (AWS)
- Microsoft Azure(Azure)
- Google Cloud Platform (GCP)
詳しい手順は、以下の記事で紹介していますので、ぜひ参考にしてください。
今回は、HerokuとHeroku Schedulerを活用して、設定した時間にエアコンが自動でONになる仕組みを作ることに挑戦します。「でも、Nature Remoの公式アプリを使えば、簡単にスケジュールを設定してエアコンを操作できるのでは?」と思う方もいるかもしれません。 確かに、公式アプリは便利で、多くの場合それで十分です。しかし、あえてこの方法を選んだ理由があります。 それは、クラウドを学び、実践するためです。
このプロジェクトでは、単にエアコンを操作するだけでなく、クラウドサービスを活用するスキルを身につけることを目指しています。 実際にHerokuを使うことで、その特性や使い方を深く理解することができます。
さらに、この仕組みはエアコンの制御に限らず、他のシステムにも応用可能です。 効率だけを考えれば公式アプリが最適ですが、学びのためにあえて新しい技術に挑戦するためでもあります。
2.Herokuの主な特徴
Herokuは、アプリケーションの開発・デプロイ・運用を簡単に行える PaaS(Platform as a Service) です。サーバー管理の負担を減らし、開発者はコードを書くことに集中できます。特に、スタートアップや小規模プロジェクトに適しており、Salesforceとの統合機能も備えています。
一方、AWS・Azure・GCPは、 IaaS(Infrastructure as a Service)、PaaS(Platform as a Service) 、SaaS(Software as a Service) を包括的に提供するクラウドプラットフォームです。
- AWS(Amazon Web Services) は、サービスの種類が豊富で、幅広い用途に対応できる点が強みです。
- Azure(Microsoft Azure) は、WindowsやOffice製品との連携が強く、企業向けシステムとの親和性が高いです。
- GCP(Google Cloud Platform) は、AIやデータ解析の分野に強く、ビッグデータ処理を得意としています。
Herokuは手軽さを重視する開発向けのPaaSであり、AWS・Azure・GCPは柔軟性とスケーラビリティを重視する大規模向けクラウドプラットフォームです。アプリを素早く開発・公開したい場合はHeroku、インフラを含めて自由度高く構築したい場合はAWS・Azure・GCPを選ぶとよいでしょう。
3.Nature Remoとは
(引用元: Nature公式サイト)
Nature Remoは、Nature株式会社が提供する家電をスマホや音声で操作できるスマートリモコンです。赤外線リモコンの信号を再現し、家電をIoT化することで、スマートホームを手軽に実現できます。例えば、外出先からエアコンを操作したり、スマートスピーカーと連携して音声で家電を動かしたりできます。また、搭載されたセンサーを活用して、温度や時間に応じた自動操作も可能です。Nature Remoには複数のモデルがあり、用途に応じて選べます。スマートホームを始めたい方に最適な製品です。
なお、今回はNature Remoの初期設定方法については触れません。初期設定について詳しくは、公式ページをご覧ください。
4.Nature Remoを操作する方法
この記事では、Nature RemoのAPIをNode.jsを使って操作する方法について説明します。コードの説明、アクセストークンの取得方法や事前の設定については、以前の記事を参考にしてください。
4.1.エアコンの電源をOFFにするコード
以下のコードは、Nature RemoのAPIを使ってエアコンの電源をOFFにするものです。
import axios from 'axios';
// Nature Remo APIを動作させる関数を定義
async function setAirconSettings() {
const token = '<冬の朝をもっと快適に!Cloud Run×Cloud Scheduler×Nature Remoで実現するエアコン自動化プロジェクト で取得したトークン>'; // トークンを設定
const deviceId = '<device_list.jsonで取得した登録している家電のID>'; // 家電のIDを設定
const url = `https://api.nature.global/1/appliances/${deviceId}/aircon_settings`;
try {
// POSTリクエストを送信し、レスポンスを取得
const response = await axios.post(
url,
'button=power-off', // データの内容を設定
{
headers: {
'Authorization': `Bearer ${token}`,
'accept': 'application/json',
'Content-Type': 'application/x-www-form-urlencoded',
},
}
);
// ステータスコードが200の場合、レスポンスのデータを出力
if (response.status === 200) {
console.log('Nature Remo送信成功!');
console.log('Response data:', response.data);
} else {
console.error('Unexpected status code:', response.status);
}
} catch (error) {
// エラーが発生した場合
console.error('Error:', error.message);
}
}
// 関数を呼び出し
setAirconSettings();
4.2.エアコンの暖房モードを設定し、温度を24℃にするコード
次のコードでは、エアコンを暖房モードにし、温度を24℃に設定します。また、風量と風向きも自動調整に設定します。
import axios from 'axios';
// Nature Remo APIを動作させる関数を定義
async function setAirconSettings() {
const token = '<冬の朝をもっと快適に!Cloud Run×Cloud Scheduler×Nature Remoで実現するエアコン自動化プロジェクト で取得したトークン>'; // トークンを設定
const deviceId = '<device_list.jsonで取得した登録している家電のID>'; // 家電のIDを設定
const url = `https://api.nature.global/1/appliances/${deviceId}/aircon_settings`;
// 送信するデータ
const data = new URLSearchParams({
operation_mode: 'warm',
temperature: '24',
temperature_unit: 'c',
button: '',
air_volume: 'auto',
air_direction: 'auto',
air_direction_h: 'auto',
});
try {
// POSTリクエストを送信し、レスポンスを取得
const response = await axios.post(
url,
data.toString(), // URLエンコードされたデータを送信
{
headers: {
'Authorization': `Bearer ${token}`,
'accept': 'application/json',
'Content-Type': 'application/x-www-form-urlencoded',
},
}
);
// ステータスコードが200の場合、レスポンスのデータを出力
if (response.status === 200) {
console.log('Nature Remo送信成功!');
console.log('Response data:', response.data);
} else {
console.error('Unexpected status code:', response.status);
}
} catch (error) {
// エラーが発生した場合
console.error('Error:', error.message);
}
}
// 関数を呼び出し
setAirconSettings();
5.Herokuの設定方法
4.3.エアコン操作APIの統合と活用 のコードは、同じネットワーク内でしか動作しません。つまり、外出先から自宅のエアコンを操作することができないのです。これでは不便ですよね。しかし、Herokuを使うことで、この問題を解決できます。
Herokuを利用すれば、外出先からでも自宅のエアコンを操作できるようになります。「同じネットワーク内で動作すれば十分」と感じるかもしれませんが、もしこのステップを飛ばすと、Herokuを使ってエアコンのスケジュール実行ができなくなります。そのため、この手順は必ず実施することをお勧めします。
この章では、Herokuのアカウント作成から、先ほど紹介したコードをデプロイするまでの手順を詳しく解説します。スクリーンショットを多く使いながら、ステップごとにわかりやすく進めていきますので、安心して取り組んでください。
5.1.設定方法
1.まずは、Herokuの公式サイトでアカウントを作成しましょう。まだアカウントを持っていない方は、登録を済ませてから次のステップに進んでください。
2.Heroku CLIを持っていない方は、公式サイトからインストールしてください。自分が使用しているOSに合わせてインストールしてください。
3.次に、GitHubにリポジトリを作成し、4.3.エアコン操作APIの統合と活用 で作成したソースコードをコミットしてから、GitHubへプッシュしてください。GitやGitHubがよくわからない方は、以下の記事を参考にしてください。また、個人的に GitHub Desktop のインストールをおすすめします。リポジトリを作成する際は、必ず Private に設定してください。Publicにすると、自分のソースコードだけでなく、アクセストークンまでもが全世界に公開されてしまうため、十分に注意してください。
なお、今回コミットして、プッシュしたファイルは以下の通りです。
- node_modules
- index.js(4.1のソースコード、または4.2のソースコード)
- package.json
- package-lock.json
package.jsonの中身は下記の通りです。必ず npm install express axios は実行して下さい。
{
"scripts": {
"start": "node index.js"
},
"type": "module",
"dependencies": {
"axios": "^1.7.9",
"express": "^4.21.2"
}
}
4.今回使用するソースコードが保存されているディレクトリに移動しましょう。今回は nature_remo 内に作成したので、次のコマンドを実行してください。
cd nature_remo
5.新しくアプリを作成するには、以下のコマンドを使用してください。
heroku create [[アプリ名]]
※ アプリ名には以下のルールがあります
- 英小文字(a-z)または数字(0-9)で始める 必要があります
- 英小文字または数字で終わる 必要があります
- 使用できるのは、小文字・数字・ハイフン(-)のみ です(大文字やアンダースコア _ は使えません)
今回は、以下のコマンドを実行してください。
heroku create nature-remo
もし成功すれば、次のようなメッセージが表示されます。
» Warning: heroku update available from 10.0.0 to 10.1.0.
Creating ⬢ nature-remo... done
https://nature-remo-×××××××××××.herokuapp.com/ | https://git.heroku.com/nature-remo.git
6.以下のメッセージが表示されたら、どのキーを押してもブラウザが開き、ログイン画面が表示されます。ログインを完了してください。
heroku: Press any key to open up the browser to login or q to exit:
7.アプリを Heroku にデプロイするには、次のコマンドを実行して、ローカルリポジトリのメインブランチから Heroku のリモートリポジトリにコードをプッシュしてください。
git push heroku main
もし成功すれば、次のようなメッセージが表示されます。
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/nature-remo.git
×××××××× main -> main
補足
アプリを更新したい場合は、新たにソースコードをコミットしプッシュして、以下のコマンドを実行して下さい
heroku git:remote [[アプリ名]]
git push heroku main
6.Heroku Schedulerの設定方法
ここまで来たら、あともう一息です!残る作業は、Heroku Schedulerの設定だけです。Heroku Schedulerは、スケジュール実行等を行うことができるサービスです。実行のタイミングを制御できるため、とても便利です。基本的には公式ドキュメントに従えば問題ありませんが、今回はより分かりやすく解説します。
1.以下のコマンドを実行してHeroku schedulerを追加してください
heroku addons:create scheduler:standard
2.Herokuのダッシュボードにアクセスしてください
5.Heroku Schedulerでは、以下の3つの頻度でのみスケジュールを設定できます。
- 10分ごと
- 1時間ごと
- 毎日
そのため、「毎週月曜から金曜まで」といった細かい設定はできません。
また、スケジュールの時間設定はUTC(協定世界時)で行う必要があります。
例えば、日本時間(JST)で2025年2月17日(月)8:00 に実行したい場合、UTCでは2025年2月16日(日)23:00 となります。したがって、毎朝8:00(JST)にスケジュール実行をしたい場合、Heroku Schedulerでは23:00(UTC) に設定してください。
設定するには「e.g node billing_processing.com」と書かれている入力欄には、node index.jsを入力してください。最後に「Save Job」をクリックして保存してください。
まとめ
今回、Herokuを使ってエアコンを制御するアプリをデプロイしてみました。
Herokuは、 AWS、Azure、GCP と比べて手軽にデプロイできると感じました。ただし、 GitやGitHub、GitHub Desktopの知識がないとスムーズに進めるのは難しいとも思いました。 とはいえ、 GitやGitHubは実際の開発現場でもよく使われるため、今回をきっかけに学んでみるのも良いかもしれません。 損はしないはずです!
また、Heroku Scheduler は機能が限られており、細かいスケジュール設定には向いていません。そのため、柔軟な定期実行をしたい場合は、AWSやGCPなどのクラウドサービスを利用するほうが適していると感じました。
今回は、Expressを使わずにエアコン制御アプリをデプロイしました。その理由は、 Heroku SchedulerではURLの定期実行ができないためです。 もし、どうしてもURLを定期的に実行したい場合は、URLを実行するための別のアプリをデプロイすることで対応できます。ただし、同じアプリを2つ作成するのは非効率なため、今回はその方法には触れませんでした。
ここまで読んでいただき、ありがとうございました!
参考文献
Heroku とは | Heroku
クラウドコンピューティングのタイプ | AWS
Git を使用したデプロイ | Heroku Dev Center
Heroku Scheduler | Heroku Dev Center