冬の朝をもっと快適に！Heroku×Nature Remoで実現するエアコン自動化プロジェクト

## 1.はじめに
寒い日が続いていますね。私も寒さが苦手で、特に冬の朝は布団から出るのが一苦労です。そこで、朝起きる少し前にエアコン（暖房）を自動でオンにし、快適に目覚められる仕組みを作りました。この仕組みは、以下の3つのクラウドサービスで構築しました。

- Amazon Web Services (AWS)
- Microsoft Azure(Azure)
- Google Cloud Platform (GCP)

詳しい手順は、以下の記事で紹介していますので、ぜひ参考にしてください。

https://qiita.com/nishifeoda/items/9b5cc9ea3c748de65b8c

https://qiita.com/nishifeoda/items/d8ff4a5f10b1c3cce364

https://qiita.com/nishifeoda/items/a845c61f59980adf1f64

今回は、HerokuとHeroku Schedulerを活用して、設定した時間にエアコンが自動でONになる仕組みを作ることに挑戦します。「でも、Nature Remoの公式アプリを使えば、簡単にスケジュールを設定してエアコンを操作できるのでは？」と思う方もいるかもしれません。 確かに、公式アプリは便利で、多くの場合それで十分です。しかし、あえてこの方法を選んだ理由があります。 それは、クラウドを学び、実践するためです。

このプロジェクトでは、単にエアコンを操作するだけでなく、クラウドサービスを活用するスキルを身につけることを目指しています。 実際にHerokuを使うことで、その特性や使い方を深く理解することができます。

さらに、この仕組みはエアコンの制御に限らず、他のシステムにも応用可能です。 効率だけを考えれば公式アプリが最適ですが、学びのためにあえて新しい技術に挑戦するためでもあります。

# ソースコード
今回使用したソースコードは下記のレポジトリにあります。ぜひ参考にしてみてください。

https://github.com/Nakkinakki55/HerokuNatureRemoAutomation


## 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とは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561875/49332bcb-8676-4afd-8016-2790b368f822.png)
（引用元: [Nature公式サイト](https://nature.global/)）

Nature Remoは、Nature株式会社が提供する家電をスマホや音声で操作できるスマートリモコンです。赤外線リモコンの信号を再現し、家電をIoT化することで、スマートホームを手軽に実現できます。例えば、外出先からエアコンを操作したり、スマートスピーカーと連携して音声で家電を動かしたりできます。また、搭載されたセンサーを活用して、温度や時間に応じた自動操作も可能です。Nature Remoには複数のモデルがあり、用途に応じて選べます。スマートホームを始めたい方に最適な製品です。

なお、今回はNature Remoの初期設定方法については触れません。初期設定について詳しくは、[公式ページ](https://support.nature.global/hc/ja/articles/900001792563-Nature-Remo-%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E3%83%9E%E3%83%8B%E3%83%A5%E3%82%A2%E3%83%AB-%E5%88%9D%E6%9C%9F%E8%A8%AD%E5%AE%9A%E6%96%B9%E6%B3%95)をご覧ください。

## 4.Nature Remoを操作する方法
この記事では、Nature RemoのAPIをNode.jsを使って操作する方法について説明します。コードの説明、アクセストークンの取得方法や事前の設定については、以前の記事を参考にしてください。

https://qiita.com/nishifeoda/items/9b5cc9ea3c748de65b8c

### 4.1.エアコンの電源をOFFにするコード
以下のコードは、Nature RemoのAPIを使ってエアコンの電源をOFFにするものです。

```js
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℃に設定します。また、風量と風向きも自動調整に設定します。

```js
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の[公式サイト](https://jp.heroku.com/)でアカウントを作成しましょう。まだアカウントを持っていない方は、登録を済ませてから次のステップに進んでください。

2.Heroku CLIを持っていない方は、[公式サイト](https://devcenter.heroku.com/ja/articles/heroku-cli#install-the-heroku-cli)からインストールしてください。自分が使用しているOSに合わせてインストールしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561875/11921b6f-6ae9-45a5-aed1-1a557ea17d9a.png)

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** は実行して下さい。
```package.json
{
  "scripts": {
    "start": "node index.js"
  },
  "type": "module",
  "dependencies": {
    "axios": "^1.7.9",
    "express": "^4.21.2"
  }
}
```

https://qiita.com/tsmog52/items/b3ba8fbee7ba4afb093f

https://qiita.com/yasu_qita/items/3a24322f0ebdd443ba7e

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の[ダッシュボード](https://dashboard.heroku.com/apps)にアクセスしてください

3.さきほどデプロイしたアプリを選んでください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561875/919caa6b-1836-4e4e-89a7-a07a856c68a8.png)

3.Heroku schedulerをクリックしてください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561875/4e16cead-8ed6-4474-9f6c-10135cc64435.png)

4.Create Jobをクリックしてください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561875/2fe64f61-45a7-4897-87cb-18786d5af5ce.png)

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」をクリックして保存してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561875/6b056d2b-6604-495e-9d03-d8eae5297945.png)


## まとめ
今回、Herokuを使ってエアコンを制御するアプリをデプロイしてみました。

Herokuは、 **AWS、Azure、GCP** と比べて手軽にデプロイできると感じました。ただし、 **GitやGitHub、GitHub Desktopの知識がないとスムーズに進めるのは難しいとも思いました。** とはいえ、 **GitやGitHubは実際の開発現場でもよく使われるため、今回をきっかけに学んでみるのも良いかもしれません。** 損はしないはずです！

また、**Heroku Scheduler** は機能が限られており、細かいスケジュール設定には向いていません。そのため、柔軟な定期実行をしたい場合は、AWSやGCPなどのクラウドサービスを利用するほうが適していると感じました。

今回は、Expressを使わずにエアコン制御アプリをデプロイしました。その理由は、 **Heroku SchedulerではURLの定期実行ができないためです。** もし、どうしてもURLを定期的に実行したい場合は、URLを実行するための別のアプリをデプロイすることで対応できます。ただし、同じアプリを2つ作成するのは非効率なため、今回はその方法には触れませんでした。

ここまで読んでいただき、ありがとうございました！

## 参考文献
[Heroku とは | Heroku](https://jp.heroku.com/what)
[クラウドコンピューティングのタイプ | AWS](https://aws.amazon.com/jp/types-of-cloud-computing/)
[Git を使用したデプロイ | Heroku Dev Center](https://devcenter.heroku.com/ja/articles/git)
[Heroku Scheduler | Heroku Dev Center](https://devcenter.heroku.com/ja/articles/scheduler)