matlab
mruby
IoT
Thingspeak
realtek

蟹さんのmrubyでThingSpeak

せっかくネットワークが使えるようになったので、IoTらしくThingSpeakにアクセスしてみました。

ThingSpeakは時系列のデータを保存してグラフ化などの解析をしてくれるサービスです。

とりあえずfreeなアカウントを作って試してみました。アカウントの作り方などは検索すると日本語の説明のページがいくつかありました。

begin

rtl = RTL8196C.new(RTL8196C::MODULE_GENERIC)

addr = 10 << 24 | 10 << 16 | 10 << 8 | 2
mask = 255 << 24 | 255 << 16 | 255 << 8 | 0
gw = 10 << 24 | 10 << 16 | 10 << 8 | 1
dns = 10 << 24 | 10 << 16 | 10 << 8 | 1

rtl.netstart(addr, mask, gw, dns)

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).request("GET", "/update?api_key=naisyo&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

thingSpeakScatter(l, s);

スクリーンショット(2018-04-07 7.47.33).png

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

t1 = datetime('now');

t2 = t1 - days(1);

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

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

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