ThingSpeakからデータを取り出す

ee9king に投稿

だいたいできるようになった。

前回の記事で、readAPIkeyと、readchannelIDを使って、thingSpeakReadで読み出す。この際、データ数が8000/回に制限される。140回/日であれば、57日分になる。

readChannelID = ********; 
readAPIKey = '**************'; 

[data ,timeStamp,chInfo ] = thingSpeakRead(readChannelID,'Fields',1,'numDays',30,'ReadKey',readAPIKey);
enddate=timeStamp(1);
entrynum=size(data);

for Z=1:13
    startdate = enddate - days(30);
    [data2,timeStamp2] = thingSpeakRead(readChannelID,'Fields',1,'DateRange',[startdate,enddate],'ReadKey',readAPIKey);
    enddate=timeStamp2(1);
    data=cat(1,data2,data);
    timeStamp=cat(1,timeStamp2,timeStamp);
end

30日分ずつ読みこむようにした。期間を指定せずに読み込むと最新のデータを30日分出してくれるようで。最新のデータを最終日として、そこから30日引いた日をstartにした区間を13回読み込む。ほぼ1年分になる。

データがない区間を指定してもエラーにならず、存在するデータからの配列になってくれるようだ。昨年5月から現在(6月)までのデータ数で43663個のデータだった。またdatetime型を使用した演算も特に難しくなかった。

dd_start=timeStamp(1);
dd_end=timeStamp(end);
dd_ofs=dd_start;
day_count=ceil(days(dd_end-dd_start));
data_a=NaN([1 day_count]);
data_u=NaN([1 day_count]);
data_b=NaN([1 day_count]);
time_a=datetime(dd_start:dd_start+days(day_count-1));
for i=1:day_count
    indx = find( timeStamp>dd_ofs & timeStamp<(dd_ofs+days(1)) );   
    if ~isempty(indx)
        data_a(i) = mean( data(indx) );
        data_u(i) =  max( data(indx) );
        data_b(i) =  min( data(indx) );
        time_a(i) = dd_ofs;
    end
    dd_ofs=dd_ofs + days(1);
end

全てのデータを読み込んでいるため、日付の配列から期間の日数が計算できる。"ceil"は大きい方向に丸める(つまり切り上げる)。そして、for文で日ごとにループして、その日の最高/最低/平均を導く。

横軸を日付にしたグラフをプロットする。

fig1=figure();
plot(time_a,data_a,'.-','DisplayName','日平均');
hold on
plot(time_a,data_u,'.-','DisplayName','日最高');
plot(time_a,data_b,'.-','DisplayName','日最低');

xlim tight;
grid on;
grid minor;
title('軒下温度 MSP430+sigfox ['+string(dd_start)+'] --> ['+string(dd_end)+']')
xlabel('日付');
ylabel('温度 [℃]');
xticks(dd_start+calmonths(0:13));
xticklabels(string(dd_start+calmonths(0:13),'yyyy/MM/dd'));
legend

グラフは下記のようになる。

コメントを追加

Plain text

  • HTMLタグは利用できません。
  • ウェブページのアドレスとメールアドレスは自動的にリンクに変換されます。
  • 行と段落は自動的に折り返されます。