実現したいこと
- Nature Remoに搭載されているセンサ情報の蓄積
- Nature Remo Cloud APIを用いたPHPからのセンサ情報取得
- Googleデータポータルでの表示
前提条件
- Nature Remoの設置が完了している
- SynologyのDBサーバがセットアップされている(Maria DB)
DB作成時にphpMyAdminが導入されていると便利です(Synologyパッケージマネージャよりインストール可能です) - SynologyでPHPがインストールされていること
- Synologyの外部公開設定が終わっている (GoogleデータポータルからSynologyのDBへアクセスする場合)
- DNSで名前解決ができる、固定IPやダイナミックDNSを利用
- ルーターのNAT / Port Foward / Virtual Serverの設定が出来ており、インタネットからSynologyのMaria DB(デフォルトポート:3307)にアクセスできる
構築手順
Nature Remo API利用時のアクセストークン発行
Nature Remo Cloud API新しいウィンドウで開きますへアクセスし、OAUTH2認証用のアクセストークンを発行します。APIを利用する際には、HTTPヘッダに以下を指定します。
Authorization: Bearer {TOKEN}
自分のアクセストークンは、home.nature.global新しいウィンドウで開きますより新規発行します。
Nature Remo Cloud APIのサンプルレスポンス。
[ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "string", "temperature_offset": 0, "humidity_offset": 0, "created_at": "2019-06-29T01:47:23.111Z", "updated_at": "2019-06-29T01:47:23.111Z", "firmware_version": "string", "mac_address": "string", "serial_number": "string", "newest_events": { "te": { "value": 0, "created_at": "2019-06-29T01:47:23.111Z" }, "hu": { "value": 0, "created_at": "2019-06-29T01:47:23.111Z" }, "il": { "value": 0, "created_at": "2019-06-29T01:47:23.111Z" } } } ]
Maria DBの準備
SynologyのMaria DBで、データ蓄積用のDBとテーブルを作成します。
データ取得時間記録カラムとTE(室温)、HU(湿度)、IL(照度)を格納するカラムを作成します。また、データ蓄積時のユーザーとDB参照用のユーザーを作成しておきます。

PHPスクリプトの準備
簡単なスクリプトサンプルを載せておきます。
取得したアクセストークン、設定したDB関係のパラメーターを設定すれば動作すると思います。
<?php /************************************************************************* * home-api (History of Nature Remo Senser) * Home Tools for private. Using IFTTT and Google Home etc * * PHP 5 or later * * @category Home IoT * @author Miki * @url https://www.miki-ie.com/ * @copyright 2019 (c) MIKI-IE All rights Reserved. * @license https://opensource.org/licenses/mit-license.html MIT License * @version 1.0 *************************************************************************/ //Nature Remo API情報 $token = '@NatureRemoApiToken@'; // tokenを設定 $header = [ 'Authorization: Bearer '.$token, // 前準備で取得したtokenをヘッダに含める 'Content-Type: application/json', ]; $base_url = 'https://api.nature.global/1/'; //DB情報 $host_name = '127.0.0.1:3307'; //DB $user_name = '@DB_USER@'; $password = '@DB_PASS@'; $database_name ='@DB_NAME@'; $table_name = '@DB_TABLE@'; $mysqli = new mysqli($host_name, $user_name, $password, $database_name); $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $base_url.'devices'); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET'); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 証明書の検証を行わない curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_HTTPHEADER, $header); curl_setopt($curl, CURLOPT_HEADER, true); $response = curl_exec($curl); // ステータスコード取得 $code = curl_getinfo($curl, CURLINFO_HTTP_CODE); echo 'HTTP_CODE:'.$code."\n"; // header & body 取得 $header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE); echo 'HEADER_SIZE:'.$header_size."\n"; $header = substr($response, 0, $header_size); $body = substr($response, $header_size); $result = json_decode($body, true); echo 'te: '.$result[0]["newest_events"]["te"]["val"]."\n"; echo 'hu: '.$result[0]["newest_events"]["hu"]["val"]."\n"; echo 'il: '.$result[0]["newest_events"]["il"]["val"]."\n"; $te = $result[0]["newest_events"]["te"]["val"]."\n"; $hu = $result[0]["newest_events"]["hu"]["val"]."\n"; $il = $result[0]["newest_events"]["il"]["val"]."\n"; $datetime = date("Y/m/d H:i:s"); curl_close($curl); // SQL(INSERT)を作成 $sql = "INSERT INTO $table_name ( DATETIME, TE, HU, IL ) VALUES ( '$datetime', $te, $hu, $il )"; echo $sql."\n"; $mysqli->query($sql); $mysqli->close(); ?>
コマンドラインより動作確認します。定期実行を設定する際にフルパスで実行指定をしたいので、動作確認もフルパス指定で実行確認を行います。
「/usr/local/bin/php72 /var/services/homes/php/Remo.php」
phpMyAdminなどで、登録されたレコードを確認することもおすすめします。
@Synology:~$ /usr/local/bin/php72 /var/services/homes/php/Remo.php HTTP_CODE:200 HEADER_SIZE:574 te: 24.6 hu: 60 il: 249.39 INSERT INTO living ( DATETIME, TE, HU, IL ) VALUES ( '2019/06/29 11:01:46', 24.6 , 60 , 249.39 ) @Synology:~$
スクリプトの定期実行登録
Synologyのタスク スケジューラーでスクリプトの定期実行を登録します。
Googleデータポータル(データスタジオ)
Googleデータポータルにアクセスし、レポートを作成します。
- データソース追加。GoogleコネクタのMySQLを選択し、接続情報を登録しSynologyのDBとの接続設定を行います。
- レポートやData Studio Explorer (Labs)を用いて、Viewを作成します。
以下にGit Hub新しいウィンドウで開きますのgistへ登録したソースコードも載せておきます。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/************************************************************************* | |
* home-api (History of Nature Remo Senser) | |
* Home Tools for private. Using IFTTT and Google Home etc | |
* | |
* PHP 5 or later | |
* | |
* @category Home IoT | |
* @author Miki | |
* @url https://www.miki-ie.com/ | |
* @copyright 2019 (c) MIKI-IE All rights Reserved. | |
* @license https://opensource.org/licenses/mit-license.html MIT License | |
* @version 1.0 | |
*************************************************************************/ | |
//Nature Remo API情報 | |
$token = '@NatureRemoApiToken@'; // tokenを設定 | |
$header = [ | |
'Authorization: Bearer '.$token, // 前準備で取得したtokenをヘッダに含める | |
'Content-Type: application/json', | |
]; | |
$base_url = 'https://api.nature.global/1/'; | |
//DB情報 | |
$host_name = '127.0.0.1:3307'; //DB | |
$user_name = '@DB_USER@'; | |
$password = '@DB_PASS@'; | |
$database_name ='@DB_NAME@'; | |
$table_name = '@DB_TABLE@'; | |
$mysqli = new mysqli($host_name, $user_name, $password, $database_name); | |
$curl = curl_init(); | |
curl_setopt($curl, CURLOPT_URL, $base_url.'devices'); | |
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET'); | |
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 証明書の検証を行わない | |
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); | |
curl_setopt($curl, CURLOPT_HTTPHEADER, $header); | |
curl_setopt($curl, CURLOPT_HEADER, true); | |
$response = curl_exec($curl); | |
// ステータスコード取得 | |
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE); | |
echo 'HTTP_CODE:'.$code."\n"; | |
// header & body 取得 | |
$header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE); | |
echo 'HEADER_SIZE:'.$header_size."\n"; | |
$header = substr($response, 0, $header_size); | |
$body = substr($response, $header_size); | |
$result = json_decode($body, true); | |
echo 'te: '.$result[0]["newest_events"]["te"]["val"]."\n"; | |
echo 'hu: '.$result[0]["newest_events"]["hu"]["val"]."\n"; | |
echo 'il: '.$result[0]["newest_events"]["il"]["val"]."\n"; | |
$te = $result[0]["newest_events"]["te"]["val"]."\n"; | |
$hu = $result[0]["newest_events"]["hu"]["val"]."\n"; | |
$il = $result[0]["newest_events"]["il"]["val"]."\n"; | |
$datetime = date("Y/m/d H:i:s"); | |
curl_close($curl); | |
// SQL(INSERT)を作成 | |
$sql = "INSERT INTO $table_name ( | |
DATETIME, TE, HU, IL | |
) VALUES ( | |
'$datetime', $te, $hu, $il | |
)"; | |
echo $sql."\n"; | |
$mysqli->query($sql); | |
$mysqli->close(); | |
?> |