家を出たらテレビを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が取得できる。
そのディバイス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。ハードウェアの壊れやすさとファームウェアは関係するんやろうか?