3
0

More than 3 years have passed since last update.

蟹さんのmrubyでThingSpeak

Last updated at Posted at 2018-03-27

せっかくネットワークが使えるようになったので、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が結構便利です。

スクリーンショット(2018-03-27 16.07.32).png

我が家ではスマートメーターの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);

スクリーンショット 2019-09-22 23.09.47.png

MATLABで直近一日分のデータを取得する方法

t1 = datetime('now');

t2 = t1 - days(1);

data = thingSpeakRead(readChannelID, 'ReadKey', readAPIKey, 'DateRange',[t2,t1], 'OutputFormat','table');

dataは古い方から入っています。

ThingSpeakは最初は問題なかったのですが、MATLABのコピペでブラウザやペーストされたアプリがハングアップするようになってしまいました。。。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0