だいたいできるようになった。
前回の記事で、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
グラフは下記のようになる。
コメントを追加