SwitchBotのスマートプラグ導入

 家を出たらテレビをrm mini3からの信号でパワーオフするためにtuyaのスマートプラグを導入していた。テレビのリモコンボタンはオン/オフトグルなので、「消費電力が多い状態ならオンとみてトグル信号を送る、少ない状態ならなにもしない」という動作をさせる必要があり、使用電力がわかるものとして利用していた。テレビに負荷がかかりそうなので、プラグ自体のオンオフはしていない。
 ところがそのスマートプラグ、数回オンオフを繰り返して、壊れてしまった。同じシステムで利用できるのでtuya系を探したが、SwitchBotとかTP Linkあたりの商品とあまり価格が変わらなくなっていた。ちょっと調べたらSwitchBotはAPIが公開されていて、簡単にできそう。phpのサンプルプログラムをみてもわかりやすい。
github.com

 ということで購入。

 さっそくいじってみる。bluetoothを使ってアプリで簡単にネットワーク参加できるし、tokenやclient secretを表示できる。tokenとかを知るためにproxyを設定してキャプチャする必要はない。

 APIのドキュメントにあるサンプルスクリプトのtokenとsecretを書き換え、curl_close($curl);の後にvar_dump($response);を追加して実行するとディバイスIDが取得できる。

 同スクリプトの$urlを手直し。レスポンスがjsonで返ってくるので、デコードして値を取り出し。うまくいった。ただ、数値の反映に若干タイムラグがある。

<?php
function TV_power(){
	$token = 'nanchara';
	$secret = 'kanchara';
	$nonce = guidv4();
	$t = time() * 1000;
	$data = utf8_encode($token . $t . $nonce);
	$sign = hash_hmac('sha256', $data, $secret,true);
	$sign = strtoupper(base64_encode($sign));

	$url = "https://api.switch-bot.com/v1.1/devices/honyarara/status";

	$curl = curl_init($url);
	curl_setopt($curl, CURLOPT_URL, $url);
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

	$headers = array(
		"Content-Type:application/json",
		"Authorization:" . $token,
		"sign:" . $sign,
		"nonce:" . $nonce,
		"t:" . $t
	);

	curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
	if($response = curl_exec($curl)){
		if($response){
			return json_decode($response)->body->electricCurrent;
		}else{
			return false;
		}
	}
	curl_close($curl);
}

function guidv4($data = null) {
    // Generate 16 bytes (128 bits) of random data or use the data passed into the function.
    $data = $data ?? random_bytes(16);
    assert(strlen($data) == 16);
    $data[6] = chr(ord($data[6]) & 0x0f | 0x40);
    $data[8] = chr(ord($data[8]) & 0x3f | 0x80);

    // Output the 36 character UUID.
    return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
}
?>

 TV_powerよりTV_consumptionの方がふさわしいかも。

 これまでMeross4台、tuya2台を購入してきたが、これわれたのいずれもtuya。ハードウェアの壊れやすさとファームウェアは関係するんやろうか?