せっかくネットワークが使えるようになったので、IoTらしくThingSpeakにアクセスしてみました。
ThingSpeakは時系列のデータを保存してグラフ化などの解析をしてくれるサービスです。
とりあえずfreeなアカウントを作って試してみました。アカウントの作り方などは検索すると日本語の説明のページがいくつかありました。
APIKEY = "naisyo"
begin
rtl = YABM.new
addr = "10.10.10.2"
mask = "255.255.255.0"
gw = "10.10.10.1"
dns = "10.10.10.1"
rtl.netstart(addr, mask, gw, dns)
# sync date by ntp use https X.509
ntpaddr = rtl.lookup("ntp.nict.jp")
rtl.sntp(ntpaddr)
hcount = 0
count = 0
while 1 do
rtl.print "."
start = rtl.count()
while rtl.count() < start + 100 do
end
count = count + 1
if count % 20 == 0 then
hcount = hcount + 1
rtl.print " " + hcount.to_s + "¥r¥n"
res = SimpleHttp.new("https", "api.thingspeak.com", 443).get("/update?api_key=" + APIKEY + "&field1=0", {'User-Agent' => "test-agent"})
end
end
rescue => e
rtl.print e.to_s
end
以前はhttpでもアクセスできたようですが、現在はSSLが必須になっているようなのでBearSSLを使ったアクセスになります。
mruby-simplehttpを改造してRTL8196Cを使うようにしてみました。
BearSSLのTAはcurlにあったCAをダンプしてincludeしました。
これでチャンネルのupdateできました。この処理を実装していて気がついたのですが、rescueが結構便利です。
我が家ではスマートメーターのBルートのデータやNTP ST1のデータをロギングしていますが、深夜帯は電気節約のためルータなどの電源を落としていてインターネットへの経路がなくなるので、これらの用途にThingSpeakは使えません。
時間情報が入ったCSVのファイルをアップロードする事はできるようですが、APIは用意されていないようです。
ThingSpeakはそれ自体がサービスというよりも、サービスを作るための研究目的で使うのが良いのかなとか思いました。
おまけ
MATLAB Analysisで直近10分のアクセスのインターバルの最小値、最大値、平均を確認してみました。MATLABという言語を使うようです。
readChannelID = 0000;
readAPIKey = 'naisyo';
data = thingSpeakRead(readChannelID, 'ReadKey', readAPIKey, 'NumMinutes',10, 'OutputFormat','table');
[m,n] = size(data);
for c = 1:m-1
t(c) = seconds(data.Timestamps(c+1) - data.Timestamps(c));
end
disp(max(t));
disp(min(t));
disp(mean(t));
Output
24
21
22.2308
freeアカウントのためかもしれませんがMATLAB Analysisは重い処理をするとTimeoutしてしまうようです。また全データー出力みたいな事も出来ないようです。MATLAB Analysis直近のデータの確認に使い、全データの確認はデータをダウンロードしてローカルでやるのが良さそうです。
MATLAB code has not completed execution within the allocated time.
Consider optimizing your MATLAB code to execute within the available time limit.
MATLAB Visualizationも試してみました。直近の3000アクセスの時間別集計です。
readChannelID = 0000;
readAPIKey = 'naisyo';
t1 = thingSpeakRead(readChannelID, 'ReadKey', readAPIKey, 'NumPoints',3000, 'OutputFormat','table');
for c = 1:24
l(c) = c-1;
s(c) = 0;
end
[m,n] = size(t1);
for c = 1:m
s(hour(t1.Timestamps(c))+1) = s(hour(t1.Timestamps(c))+1) + 1;
end
scatter(l, s);
MATLABで直近一日分のデータを取得する方法
t1 = datetime('now');
t2 = t1 - days(1);
data = thingSpeakRead(readChannelID, 'ReadKey', readAPIKey, 'DateRange',[t2,t1], 'OutputFormat','table');
dataは古い方から入っています。
ThingSpeakは最初は問題なかったのですが、MATLABのコピペでブラウザやペーストされたアプリがハングアップするようになってしまいました。。。