Why does my daily median calculation and write to channel fail unpredictably?
2 views (last 30 days)
Show older comments
I am trying to calculate the daily median across a range of channels and write the result to a new field for each channel. The code seems to run sometimes, but runs into rate limitation other times. I'm not sure why since I am only writing once and to different channels?
Error using Median calcs (line 39)
My code is:
% Sensor/channel configuration
sensors = [
struct('name', 'McKinley','channelID', 28xxxx, 'writeKey', 'G3WPJ586M55Gxxxx')
struct('name', 'DPI', 'channelID', 80xxxx, 'writeKey', 'S0E0LB45GQLMxxxx')
struct('name', 'Bryony','channelID', 29xxxx, 'writeKey', '2BPCI0IOAINPxxxx')
];
% Define date range (last 24 hours to midnight)
endTime = dateshift(datetime('now'), 'start', 'day');
startTime = endTime - hours(24);
% Preallocate a results array
results = [];
% Step 1: Read and calculate all medians
for i = 1:length(sensors)
s = sensors(i);
% Read Field 1 for the past 24 hours
[weight, ~] = thingSpeakRead(s.channelID, 'DateRange', [startTime, endTime], 'Fields', 1);
% Compute median, ignoring NaNs
medianWeight = round(median(weight, 'omitnan'),2);
% Store in results
results(i).name = s.name;
results(i).channelID = s.channelID;
results(i).writeKey = s.writeKey;
results(i).value = medianWeight;
end
% Step 2: Display results
for i = 1:length(results)
r = results(i);
fprintf('%s (Channel %d) → 24hr Median: %.2f\n', r.name, r.channelID, r.value);
end
% Step 3: Write results
thingSpeakWrite(results(1).channelID, 'Fields', 6, 'Values', {results(1).value}, 'WriteKey', results(1).writeKey);
thingSpeakWrite(results(2).channelID, 'Fields', 6, 'Values', {results(2).value}, 'WriteKey', results(2).writeKey);
thingSpeakWrite(results(3).channelID, 'Fields', 6, 'Values', {results(3).value}, 'WriteKey', results(3).writeKey);
1 Comment
Christopher Stapels
on 8 May 2025
See the limitations area there for additional info. How often are you running this code?
"The number of messages in a single bulk-update is limited to 960 messages for users of free accounts and 14,400 messages for users of paid accounts. The time interval between sequential bulk-update calls should be 15 seconds or more."
Answers (2)
Ray Berkelmans
on 8 May 2025
2 Comments
Vinod
on 9 May 2025
If you don't need to run it at exactly midnight, I'd also suggest some more random time (like 12:14 AM, for example). This will avoid the issue of potentially running into jitter from other work which is also scheduled exactly at midnight.
Heidi
on 12 May 2025
A combination of 1s delay between writes and moving the TimeControl away from midnight seems to be doing the trick. Three nights good so far... :)
0 Comments
Communities
More Answers in the ThingSpeak Community
See Also
Categories
Find more on Configure Accounts and Channels in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!