PHP から Nature Remo へ GET, POST

長年 IrKit を使用しつつ、Nature Remo を購入しようかどうか迷っていたときに、Nature Remo 3rd が出てしまったので購入、PHP からのデータ送受信関数メモ

ローカルは、ほぼ IrKit と同じ方法で送受信ですが、クラウドは予め登録しておいた Appliance + ボタン名 または Signal ID(Appliance カテゴリに属さない場合) を送信することで、クラウド側からIRデータを送るようです
また、クラウド操作に必要な clientkey と deviceid は token に置き換えられ、取得も簡素化されています
  • Client-(IRデータ)→ Cloud -(IRデータ)→ IrKit
  • Client-(ID)→ Cloud -(IRデータ)→ Nature Remo
Cloud側に IRデータを保持することで、転送量を抑える事ができるのと登録が容易になったわけです
ただ、ローカルとクラウドでIRデータは共用できなく(クラウドはID送信なので)なりました。また、IrKitで作成していた IRデータを(ローカルで)送信しても動作しませんでした(悲)


GET, POST の関数
※curl を予めインストールしておいてください
function execNatureRemo($url, $token = '', $postData = false){
	$header = array();

	if( $token !== '' ){ // cloud or local
		array_push($header, "Authorization: Bearer $token");
	}

	// Common option
	$options = array();
	$options[CURLOPT_HEADER] = false;
	$options[CURLOPT_RETURNTRANSFER] = true;
	$options[CURLOPT_SSL_VERIFYPEER] = false;

	if( $postData !== false ){
		// POST
		$options[CURLOPT_CUSTOMREQUEST] = 'POST';
		$options[CURLOPT_POST] = true;

		if( is_array($postData) ){
			// cloud
			array_push($header, 'Content-Type: application/x-www-form-urlencoded');
			$options[CURLOPT_POSTFIELDS] = http_build_query($postData); // array(key:value... )
		}else{
			// local
			array_push($header, 'X-Requested-With: curl');
			$options[CURLOPT_POSTFIELDS] = $postData; // ir json
		}
	}else{
		// GET
		$options[CURLOPT_CUSTOMREQUEST] = 'GET';

		if( $token !== '' ){
			// cloud
			array_push($header, 'Content-Type: application/json');
		}else{
			// local
			array_push($header, 'X-Requested-With: curl');
		}
	}
	$options[CURLOPT_HTTPHEADER] = $header;

	// curl
	$curl = curl_init($url);
	try{
		curl_setopt_array($curl, $options);
		return curl_exec($curl);
	} catch (Exception $e) {
		print($e);
	}finally{
		curl_close($curl);
	}
}
Local API 接続
// get local api(最後に受信したIRデータを受信)
$url = 'http://remo.local/messages';
$response = execNatureRemo($url);
print_r(json_decode($response, true));


// post local api (上で受信した IRデータ[$response]を送信)
$url = 'http://remo.local/messages';
$postData = $response; // '{"freq":0, "data": [0], "format": "string"}';

$response = execNatureRemo($url, '', $postData); // token不要
print_r(json_decode($response, true));
Cloud API 接続
// 接続Token
$token = '[YOUR_TOKEN]';

// get cloud api (drvice センサー情報取得)
$url = 'https://api.nature.global/1/devices';

$response = execNatureRemo($url, $token);
print_r(json_decode($response, true));


// get cloud api (Appliance情報取得)
$url = 'https://api.nature.global/1/appliances';

$response = execNatureRemo($url, $token);
print_r(json_decode($response, true));


// post cloud api (TVの電源ボタンIRを送信)
$url = 'https://api.nature.global/1/appliances/[APPLIANCE_ID]/tv';
$postArray['button'] = 'power';

$response = execNatureRemo($url, $token, $postArray);
print_r(json_decode($response, true));


// post cloud api (汎用IR信号の送信)
$url = 'https://api.nature.global/1/signals/[type=IRのid]/send';
$postArray = array(); // 空配列
  
$response = execNatureRemo($url, $token, $postArray);
$response_json = json_decode($response, true);
print_r($response_json);

コメント