Individual graphical displays can be generated using predefined examples or generically, assuming basic knowledge of programming with MATLAB.
In principle, the data is read in using readAPIKey, ChannelID and FieldID, then edited if necessary and finally visualized with the plot command, for example.
Click on the “Save and Run” button to execute the code and generate the output in the “MATLAB Plot Output” area. Any error messages are displayed in the “Output from last evaluation” area. In the “Display Settings” area, you can specify whether the visualization should be displayed in the private or public area, or not at all.
Under Apps -> All Apps -> MATLAB Visualizations all visualizations are listed and can be managed from here.
In the following I present a few examples, which I find quite informative. I also provide the MATLAB source code, in which only the variables readAPIKey, ChannelID and FieldID have to be adapted.
A step-by-step guide can be found below.
Weight of the last 3 days
This diagram shows the superimposed daily weight curves of the last 3 days.
On traditional days when the bees are collecting honey it is especially nice to see at which time the bee flight begins and ends, how the weight decreases in the morning and increases again in the course of the day, how the weight is higher in the evening than in the morning, and how the weight slowly decreases again at night. The intensity of these phases is, of course, strongly dependent on the weather and the conditions of the nectar sources. On days without nectar sources the consumption can be observed.
Daily weight change
Most beekeepers are interested in how much honey their diligent bees have collected. A simple bar chart shows the daily weight gain or loss.
Remarks on the algorithm
One can discuss how best to determine the displayed values. In this Matlab code, a weight is calculated for each day and the difference to the weight of the previous day (derivation) is displayed as a bar.
The exciting question is which is the best method to determine the weight of a day:
- Perhaps the simplest method is a maximum selection. However, this is very susceptible to outliers – they are 100% effective.
- The mean value or median of the measured values of a day seems to be more suitable at first glance. However, since the weight of the bees flying out can amount to 1 kg, this effect falsifies the weight value clearly, above all if the bee’s flight from day to day is different in intensity and duration due to weather conditions.
- The most plausible results are obtained by evaluating the time period after the bee flight ends in the evening. With a measuring interval of 15 minutes, the last 10 measured values can be used and the mean value can be calculated.
The total weight change is determined using the sum of the daily values.
Outdoor temperature and weight today
This display is suitable for detecting desired and unwanted (tempearature drift!) correlations between temperature and weight.
The correlation between temperature and honey yield flight is obvious and interesting to follow.
If, however, a contrary correlation between temperature and weight can be observed on days without bee flight, then an undesirable, possibly uncompensated falsification of the measured weight by the temperature is probably present. If this occurs despite activated and calibrated temperature compensation, the temperature sensor may be installed in an unfavourable position for this purpose.
Outdoor temperature and weight (long-term)
The display of outside temperature and weight over a longer period of time, e.g. over two months, also provides interesting insights.
The honey yield phases and honey yield gaps or periods of bad weather are clearly visible.
Min/Max temperature and weight
In this diagram, the daily maximum and minimum temperature values and the maximum weight value are plotted over a longer period of time. In a way, this is a simplified and clearer representation of the long-term representation described above.
Temperature profile in the brood chamber
If you place a temperature sensor in each honeycomb tray, then you can visualize the temperature profile in a diagram. The temperature profile not only shows whether the bees are still breeding, but also where in the box they are. In this example, the winter cluster is forming at the end of September slightly to the left of center.
Step-by-step instructions
How to create an individual visualization in ThingSpeak based on one of the templates listed above:
- Press the “MATLAB Visualization” button.
- Select template “Custom (no starter code)
- Copying code from the attachments into it
- Enter your individual ChannelID, readAPIKey and FieldIDs (see right under Channel Info)
- Press the “Save and Run” button and observe whether the graphic is structured as desired, note the error message if necessary.
- Modify at will to display what you want to see
- Publish plot: Activate “Create a public URL”, select “Add/Edit view on a channel” and place a tick at “Public View”.
Now the plot should appear on your public ThingSpeak Channel.
Translated 19.10.2019 by JK
Hallo ,
gibt es auch eine Möglichkeit um die Batteriespannung zu dem Gewicht pro Tag anzeigen zu lassen?
LG
Hallo Mark,
ja das geht problemlos mit geringfügiger Modifikation eines der Skripte.
Gruß Johannes
Hallo Johannes,
eine frage etwas abseits zum Projekt: Mit was hast du den Bienenkasten im Schaubild der Temperaturen im Brutraum gezeichnet? Ich suche hier Grafiken für Dokumentation und Vorträge bei uns im Zeidlerverein.
MfG
Thomas Pfaffinger
Hallo Thomas,
das ist mit Powerpoint gezeichnet.
VG Johannes
Hallo, vielen Dank für das geniale Projekt.
Ich stolpere derzeit bei der Mathlab Visualisierung des Täglichen Gewichts und dem minMax temp mit gewicht an wahrscheinlich einer Banalität.
“Error using Min-Max-Temperatur und GewichtSpecify a valid read API key”
Wenn ich meinen read Key eingebe scheint das nicht der richtige zu sein. Auch ein zweiter Tead Key klappt nicht.
Diekt öffentlich wollte uchis den channel nicht stellen oder ist das bei den Visualisierungen so nötig?
Worüber stolpere ich da?
Gruß M. Boh
Hallo, eventuell hast Du eine falsche Syntax verwendet? Ist der Key in Hochkomma eingeschlossen? Jedenfalls wird offensichtlich der readAPIKey nicht erkannt.
Hallo Johannes,
Eigentlich ja und ich habe auch den selben ReadKey wie bei den Anderen Diagrammen rein kopiert. ‘xxx’
Bei Gewicht/Temp, Gewicht/Temp-Langzeit klapptbes als nicht öffentlich. Jedoch beim Min/Max Temp und Gewicht sowie tägl Gewicht komm ich ohne Öffentlich nicht zu recht. (ok wegen “noch zu wenigen Daten” musste ich den Zeitraum auf 5 tage reduzieren aber es wurde ausgegeben)
Ansonsten perfekt und Projekt teil abgeschlossen… Dann kann es bei Gelegenheit weiter gehen mit einer zweiten Waage für den Nachbarstock und noch mal einem kompletten Doopelsystem mit Hotspot für das Bienenhaus.
By the way gibt es einen Tipp wie ich einen einzelnen Wert aus der Thingspeak Datenbank löschen könnte ohne alles zu Nullen? Hab nämlich einen mega Außreißer in der Luftfeuchtigkeit (3000%) und Außentemperatur vom DHT22, so dass der reguläre Wertebereich nur noch als linie zu sehen ist.
Vielen Dank Gruß M. Boh.
Hallo Matthias,
ich hoffe, Du hast die xxx mit Deinem tatsächlichen Readkey ersetzt 😉
Wenn ja, habe ich auch keine Idee, warum diese Fehlermeldung kommt…
Einzelne Werte können nicht direkt gelöscht werden. Ich mache das aber mit folgendem workaround: Gesamte Messdaten als CSV Datei exportieren und dann in Thingspeak löschen. Einzelne Zeilen aus der CSV Datei löschen und dann die Datei wieder hochladen.
Gruß
Johannes
Hallo Honey-Pi und User ,
ich hab nun schon viel mit dem Projekt rumgespielt und Sachen die anfangs nicht klappen wollen dann irgednwann doch 🙂
Allerdings habe ich tatsächliche eine Baustelle in der ich mir selbst nicht helfen kann – ich habe bereits erfolgreich die tägliche Gewichtsveränderung zum laufen gebracht., nun hätte ich gerne diese als Darstellung in einer kleinen Tabelle:
Spalte A = Tag
Spalte B = durschnittliches Gewicht
Spalte C = Differenz zum Vortag
Also eigentlich ganz simpel aber für mich nicht umsetzbar, da ich mit MatLab keine Erfahrungen habe.
Ist jemand in der Lage mir sowas zu basteln oder hat das evtl schon? Gerne auch per PN.
Achja vorweg noch es würde auch mit der Balkendarstellung gehen wie hier so schön beschrieben in der täglichen Gewichtsveränderung, hierzu müsste dann eigentlich nur am Balken des Tages stehen z.B. +300gr oder so..
Also wenn sich jemand berufen fühlt bei dem verregneten Wetter etwas zu basteln dann sehr gerne 🙂
Hallo Jörg,
nach einer Möglichkeit, eine Tabelle in Thingspeak darzustellen, habe ich auch schon gesucht, allerdings vergeblich.
Die Differenz in das Balkendiagramm zu plotten ist aber kein Problem, das kannst Du Dir mal auf meiner Seite https://gartenhonig.jimdo.com/stockwaage anschauen. Würde Dir das helfen?
Gruß Johannes
Hallo Johannes,
eigentlich verwunderlich, die einfacherer Variante, nämlich Daten in einer Tabelle abzuschreiben scheint mehr Probleme zu machen 🙂
Ja, SUPER ! genau sowas hätte ich gesucht, wie stell ich das an? 🙂
Hallo Jörg,
ich kopiere mal den relevanten Code hierher:
bar(Zeit(2:AnzTage),diff(Gewicht),0.9) %Bar chart
%Summarize the day-to-day differences to get the cumulated weight change
CumWeight = sum(diff(Gewicht));
text(Zeit(2:AnzTage),diff(Gewicht),num2str(diff(Gewicht)’,’%0.1f’),’vert’,’bottom’,’horiz’,’center’,’fontsize’,8,’Rotation’,0);
title(‘Tägliche Gewichtsveränderung’);
xlabel([‘Änderung ‘ num2str(AnzTage-1) ‘ Tage: ‘ sprintf(‘%+2.1f’,CumWeight) ‘ kg’])
ylabel(‘Gewicht [kg]’) %uncomment for Bar chart
grid on
box off
Hallo Johannes,
TOP , danke vielmals für deine Unterstützung.
Hallo,
Ich habe ein problem mit der Täglichen Gewichtszunahme
Fehler!
StartDate =
datetime
26-Apr-2020
Index exceeds the number of array elements (5).
Error in datetime/parenReference (line 17)
value.data = this.data(rowIndices);
Error in Tägliche Gewichtsveränderung (line 54)
bar(Zeit(2:AnzTage),diff(Gewicht),0.8) %Bar chart horizontal
Die Waage läuft sei 5 Tagen, eingestellt sind 16 Tage!
Wenn ich die Anzahl der Tage auf 5 ändere läuft es, zeigt aber nur 2 Tage an!
Hat vielleicht jemand eine Idee?
Danke Jürgen
Hallo Jürgen,
wenn du mir deine readChannelID und WeightFieldID als PN schickst, dann kann ich mir das mal anschauen. Wenn der Channel private ist, dann bitte auch den readAPIKey.
Gruß Johannes
Hallo,
gibt es die Möglichkeit die Gewichtveränderung bei dem Balkendiagramm anzeigen zu lassen?
Also wenn ich den Mauszeiger auf den Balken halte, das mir dann die Gewichtsveränderung als Wert angezeigt wird?
Danke Thorsten
Hi, ich kenne keine Möglichkeit das zu implementieren.
Hallo Johannes,
danke für die Bereitstellung der Codes.
Funktioniert fast alles bis auf die Tägliche Gewichtsveränderung.
Bekomme da immer folgende Fehlermeldung
StartDate =
datetime
25-Dec-2019 00:00:00
Index in position 2 exceeds array bounds.
Error in Custom (no starter code) 23 (line 18)
Weight = [data(:,WeightFieldID)];
Vielleicht hast Du einen Tipp.
Danke Gruß Guido
Hallo Guido und alle Mitleser,
Thema ist gelöst per Mail. Ich werde demnächst eine verbesserte Version hier für alle zur Verfügung stellen.
VG Johannes
Hi Johannes,
ich habe das gleich Problem wie Guido. Gibt es schon eine aktualisierte Version des BAlkendiagramms.
Hier meine Fehlermeldung
StartDate =
datetime
01-Apr-2021
Index exceeds the number of array elements (7).
Error in matlab.internal.datatypes.parenReference_1D (line 12)
data = data(rowIndices);
Error in datetime/parenReference (line 19)
obj.data = parenReference_1D(obj.data, rowIndices);
Error in Tägliche Gewichtsveränderung (line 56)
bar(Zeit(2:AnzTage),diff(Gewicht),0.8) %Bar chart
Beste Grüße
Oliver
Hallo Oliver, sorry Deine Mail ist bei mir im Spamordner gelandet. Funktioniert das inzwischen?
Hallo
Das hatte ich bei mir auch. Grund dafür ist das Gewichtsfeld nicht WeightfieldID ist.
Bei mir zB sind die ersten 3 Felder bei Thingsspeak leer für spätere Erweiterung und das erste Feld bei mir ist das vierte=Luftdruck, fünfte=Luftqualität, sechste=Gewicht. Matlab beginnt dann so zu nummerieren (Luftdruck =1, Luftqulität=2,Gewicht=3,..) das du hier statt Weight = [data(:,WeightFieldID)]; der WeightfieldID deine richtige Position deines Gewichtsfeldes angeben musst.
In meinem Fall sieht die korrekte Zeile dann so aus Weight = [data(:, 3)];
mfg
Martin Z.
Hallo zusammen,
bei mir kommt folgende Fehlermeldung bei der täglichen Gewichtsänderung:
StartDate =
datetime
25-Dec-2019 00:00:00
Error using Tägliche Gewichtsveränderung (line 12)
Specify a valid read API key, or make the channel public to avoid specifying the read API key.
Kann mir bitte jemand helfen?
Gruß
Thomas
Hallo Thomas,
hast du den readAPIKey (und die anderen Werte für readChannelID und die Fields) mit deinen Werten angepasst, und hast du den Kanal auf “öffentlich” gestellt?
Viele Grüße
Johannes
Hallo Johannes,
habe ich angepasst und öffentlich gestellt.
“Mit Gewicht der letzten drei Tage” hat es funktioniert, mit “Außentemperatur und Gewicht heute” funktionierte es auch nicht.
Danke.
Gruß
Thomas
Hallo Johannes, vielen Dank für Deine Anleitung. Gibt schöne Schaubilder. Ich habe das gleiche Problem wie Thomas Müller.
StartDate =
datetime
2019/12/30 00:00:00
Error using tägliche Gewichtsänderung (line 13)
Specify a valid read API key, or make the channel public to avoid specifying the read API key.
Der kanal ist auch öffentliche gesetzt und der APi key passt, vielen Dank für Deine Hilfe
Hallo Michael,
prüfe mal bitte ob unter “Channel Sharing Settings” die Option “Share channel view with everyone” ausgewählt ist. Funktioniert es dann?
Danke Johannes,hab’s so eingegeben hab aber leider eine neue Meldung
StartDate =
datetime
01-Jan-2020 00:00:00
Error using tägliche Gewichtsänderung (line 35)
Unable to perform assignment because the left and right sides have a different number of elements.
Gruss Michael
Wenn man die Zeile so abändert [data,time] = thingSpeakRead(readChannelID,’DateRange’,[StartDate,datetime(‘today’)],…
‘ReadKey’,readAPIKey);
Dann kann man sich die Änderung auch angucken, ohne alles öffentlich zu machen.
Vielleicht sollte es oben auch noch angepasst werden.
Viele Grüße
Habe da mal eine frage kann mir jemand so eine Diagramm machen wo ich die verschiedenen temp fühler auf einen Diagramm sehen kann ich habe 5 temp fühler und würde die gerne von 2 tagen sehen . ich bekomme das leider nicht allein hin
Hallo Josef,
ich kann versuchen ein entsprechendes Diagramm für dich zu erstellen. Dazu bräuchte ich von dir die Channel ID und den Read API Key (per Mail, siehe meine Mail an dich).
Den fertigen Code würde ich dann anonymisiert hier hinterlegen, damit ihn auch andere nutzen können.
Viele Grüße
Johannes
Hallo Johannes und Josef,
ich habe auch mal geschaut und zwar hat hier jemand das selbe schon mal gemacht:
https://community.thingspeak.com/forum/thingspeak-apps/how-to-have-multiple-field-data-in-one-graph/
Die Lösung kann sich auch sehr gut an diesem Beispiel orientieren:
https://de.mathworks.com/help/thingspeak/Compare-Temperature-Data-from-Three-Different-Days.html
Vielleicht hilft euch das weiter.
Viele Grüße
Javan
Hallo,
Super Beispiele. Die Tägliche-Gewichtsänderug habe ich bereits umgesetzt.
Leider funktioniert das Reinkopieren des Codes in Thingspeak bei mir nicht. Kann mir jemand einen Tip geben wie copy and past dort klappt?
Viele Grüße
Martin
Das liegt am MatLab Code-Editor. Du musst zunächst mit der Enter-Taste einige neue Zeilen einfügen, damit du den Code deiner gewünschten Diagrammart einfügen kannst.
Copy and paste funktioniert in der Zeile “Name”.
Dort wo der Matlab Code eingegeben wird klappt das nicht. Ich kann dort nichts einfügen.
Die Lösung ist ganz einfach. Es funktioniert mit cmd+c und cmd+v und nicht mit dem Touchpad auf dem Macbook.
Viele Grüße
Martin
super Anleitung mit sehr guten Beispielen. gute Arbeit.
Hätte aber noch eine Frage:
Hast du eine Idee wie man im Beispiel “Gewicht der letzten 3 Tage”
für die x-ACHSE alle 3h eine Achsenbeschriftung bekommt?
Der folgende zusätzlocje code funktioniert nicht:
”
xlim([0 24]);
xticks(0:3:24);
”
für die Y-Achse funktioniert diese Schema für die X-Achse leider nicht.
Es kommt eine Fehlermeldung das ein zweikomplement erwartet wird… ?
Füge folgenden Code ein:
tstart = datetime(year(timeStamps_Day3(1)),...
month(timeStamps_Day3(1)),day(timeStamps_Day3(1)),0,0,0);
tend = datetime(year(timeStamps_Day1(1)),...
month(timeStamps_Day1(1)),day(timeStamps_Day1(1)),24,0,0);
xticks(tstart:0.125:tend);
super funktioniert bestens