冷蔵庫の開閉は別のsigfoxデバイスを使って実現したので、Sens'itが余ってしまっており、さらに自動更新だったようでまた料金が発生している。まぁ、月100円ほどだから微々たるものではあるが、以前Beamで設定した方法を忘れてしまった。Sens'itからAmbientに転送する方法をchatGPTさんにも聞きながら設定していったがどうも、実現できない。
今回は、Sens'itからさくらレンサバに転送してそこでAmbientに送信するという方法で実現できたので、ここに書いておく(書いても忘れてしまうんだけど)
soracomでHarvestをオンにする
そしてAPIキーを取得する。右上のユーザー名(またはアカウント名)をクリックして→セキュリティ→APIキーと進んでいき、キーを生成する。すると、この画面でしか確認できませんよみたいなダイアログとともに表示される。
認証キー ID
*****
認証キー シークレット
*****
これをメモしておく。デバイスIDはsigfoxデバイスみると表示されている。
サーバーでAPIトークンを取得する
さくらにsshでログイン
curl -X POST https://api.soracom.io/v1/auth \
-H "Content-Type: application/json" \
-d '{
"authKeyId":"あなたのAuthKeyID",
"authKey":"あなたのAuthKey"
}'jsonの返答がある
{
"apiKey":"xxxxxxxx",
"token":"xxxxxxxx",
"operatorId":"OPxxxx"
}tokenはものすごい長い文字列だ
トークンを使ってデータを取得する
chatGPTさんに聞きながら実行したが、彼の説明はurlが一部間違っており、拉致があかなかった。そのため、自分でwebから調べて解決した。keyとtokenは伏せてるよ
ここに、リファレンスがあった(実際に動作させることができる)これはすごいな
https://users.soracom.io/ja-jp/tools/api/reference/#/SigfoxDevice/getDataFromSigfoxDevice
curl -X GET \
"https://api.soracom.io/v1/sigfox_devices/xxxxx/data?limit=1" \
-H "X-Soracom-API-Key: ******" \
-H "X-Soracom-Token: ******"xxxxxはデバイスID このようなデータが返ってきた
[
{
"content": "{ ...JSON... }",
"contentType": "application/json",
"time": 1773461612000,
"resourceType": "SigfoxDevice",
"resourceId": "xxxxx"
}
]contentの中に入れ子でjsonデータがあり、これが目的のデータのようだ。
phpで取得してambientに送信する
AmbientのチャンネルIDとwritekeyはAmbientにリストですぐわかるはず。
<?php
$apiKey = "******";
$token = "******";
$url = "https://api.soracom.io/v1/sigfox_devices/xxxxx/data?limit=1";
$headers = [
"X-Soracom-API-Key: $apiKey",
"X-Soracom-Token: $token"
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
$content = json_decode($data[0]["content"], true);
$temp = $content["tempC"];
$humidity = $content["humidity"];
$battery = $content["battery"];
$timestamp = $content["time"];
echo "Temperature: ".$temp."<br />\n";
echo "Humidity: ".$humidity."<br />\n";
echo "Battery: ".$battery."<br />\n";
echo "TimeStamp: ".date("Y/m/d H:i:s",$timestamp)."<br />\n";
$last = file_get_contents("lasttime.txt");
if($timestamp != $last){
$channelId = "yyyyy";
$writeKey = "*******";
$url = "https://ambidata.io/api/v2/channels/$channelId/data";
$post = [
"writeKey"=>$writeKey,
"d1"=>$temp,
"d2"=>$humidity,
"d3"=>$battery
];
$options = [
"http"=>[
"method"=>"POST",
"header"=>"Content-Type: application/json",
"content"=>json_encode($post)
]
];
$context = stream_context_create($options);
$result = file_get_contents($url,false,$context);
echo $result."<br />";
// timestamp保存
file_put_contents("lasttime.txt",$timestamp);
echo "sent<br/>\n";
} else {
echo "no new data<br/>\n";
}
?>urlで叩くと、このような画面表示が出る
Temperature: 13.75
Humidity: 52
Battery: 3.75
TimeStamp: 2026/03/14 14:13:47
no new dataコマンドラインからは
php /home/***/www/hogehoge/hogehoge.phpこれで出力される
さくらのコンパネでcronを設定
Sens'itのデータは1時間ぐらいで更新されるようなので、15分で回るようにしてみた。
いったんここまで
これを、さくらの
コメントを追加