Individuelle grafische Darstellungen können anhand vorgefertigter Beispiele oder generisch erzeugt werden, Grundkenntnisse in der Programmierung mit MATLAB vorausgesetzt.
Prinzipiell werden die Daten anhand von readAPIKey, ChannelID und FieldID eingelesen, danach ggf. bearbeitet und schließlich z.B. mit dem Plot Befehl visualisiert.
Mit Klick auf den Button „Save and Run“ wird der Code ausgeführt und die Ausgabe im Bereich „MATLAB Plot Output“ erzeugt. Eventuelle Fehlermeldungen werden im Bereich „Output from last evaluation“ angezeigt. Im Bereich „Display Settings“ kann man spezifizieren ob die Visualisierung im privaten oder öffentlichen Bereich, oder gar nicht angezeigt wird.
Unter Apps -> All Apps -> MATLAB Visualizations werden sämtliche Visualisierungen aufgeführt und können von hier aus verwaltet werden.
Im Folgenden stelle ich ein paar Beispiele vor, die ich recht informativ finde. Den MATLAB Quellcode stelle ich ebenfalls zur Verfügung, darin müssen lediglich die Variablen readAPIKey, ChannelID und FieldID angepasst werden.
Eine Schritt-für-Schritt Anleitung findet sich weiter unten.
Gewicht der letzten 3 Tage
In diesem Diagramm sind die übereinandergelegten Tagesverläufe des Gewichts der letzten 3 Tage gezeigt.
An Trachttagen ist hier besonders schön zu sehen, zu welcher Uhrzeit der Bienenflug beginnt und endet, wie das Gewicht vormittags ab- und im Tagesverlauf wieder zunimmt, wie das Gewicht abends höher ist als morgens, und wie das Gewicht nachts langsam wieder abnimmt. Die Intensität dieser Phasen ist natürlich stark vom Wetter und von den Trachtverhältnissen abhängig. An Tagen ohne Trachtflug lässt sich die Zehrung beobachten.
Tägliche Gewichtsveränderung
Die meisten Imker interessieren sich dafür wie viel Honig ihre fleißigen Bienen gesammelt haben. Eine einfache Balkengrafik gibt Aufschluss über die täglichen Gewichtszunahmen oder -abnehmen.
Anmerkung zum Algorithmus
Man kann darüber diskutieren, wie die dargestellen Werte am besten ermittelt werden. Im vorliegenden Matlab-Code wird für jeden Tag ein Gewicht berechnet und die Differenz zum Gewicht des Vortags (Ableitung) als Balken dargestellt.
Die spannende Frage ist welches die beste Methode zum Ermitteln des Gewichts eines Tages ist:
- Die vielleicht einfachste Methode ist eine Maximalauswahl. Diese ist jedoch sehr anfällig auf Ausreisser – diese schlagen zu 100% durch.
- Der Mittelwert oder auch der Median der Messwerte eines Tages erscheint auf den ersten Blick besser geeignet. Da jedoch das Gewicht der ausfliegenden Bienen durchaus 1 kg betragen kann, verfälscht dieser Effekt den Gewichtswert deutlich, vor allem dann wenn der Bienenflug von Tag zu Tag witterungsbedingt unterschiedlich in Intensität und Dauer ausfällt.
- Die plausibelsten Ergebnisse liefert die Auswertung des Zeitraums abends nachdem der Bienenflug endet. Bei einem Messintervall von 15 Minuten können dafür die letzten 10 Messwerte herangezogen und darüber der Mittelwert gebildet werden.
Die gesamte Gewichtsveränderung wird über die Summe der Tageswerte ermittelt.
Außentemperatur und Gewicht heute
Diese Darstellung eignet sich um gewünschte und auch unerwünschte Korrelationen zwischen Temperatur und Gewicht zu erkennen.
Der Zusammenhang zwischen Temperatur und Trachtflug ist naheliegend und interessant zu verfolgen.
Wenn jedoch an Tagen ohne Bienenflug eine gegenläufige Korrelation zwischen Temperatur und Gewicht beobachtet werden kann, so liegt wohl eine unerwünschte, ggf. nicht kompensierte Verfälschung des gemessenen Gewichts durch die Temperatur vor. Tritt das trotz aktivierter und kalibrierter Temperaturkompensation auf, so ist möglicherweise der Temperatursensor an einer für diesen Zweck ungünstigen Stelle angebracht.
Außentemperatur und Gewicht (Langzeit)
Die Darstellung von Außentemperatur und Gewicht über einen längeren Zeitraum, z.B. über zwei Monate, liefert ebenfalls interessante Einblicke.
Deutlich sind Trachtphasen und Trachtlücken bzw. Schlechtwetterperioden erkennbar.
Min-/Max-Temperatur und Gewicht
In diesem Diagramm sind die Tages-Höchst- und Tiefstwerte der Temperatur und der Höchstwert des Gewichts über einen längeren Zeitraum aufgetragen. Dies ist gewissermaßen eine vereinfachte und übersichtlichere Darstellung der oben beschriebenen Langzeitdarstellung.
Temperaturprofil im Brutraum
Wenn man in jeder Wabengasse einen Temperatursensor platziert, dann kann man das Temperaturprofil anschaulich in einem Diagramm darstellen. Das Temperaturprofil gibt nicht nur Aufschluss darüber, ob noch gebrütet wird, sondern auch wo in der Kiste sich die Bienen aufhalten. In diesem Beispiel formiert sich die Wintertraube Ende September etwas links der Mitte.
Schritt-für-Schritt Anleitung
So erstellst du eine individuelle Visualisierung in ThingSpeak auf Basis einer der oben aufgeführten Vorlagen:
- Button „MATLAB Visualization“ drücken
- Template „Custom (no starter code)“ auswählen
- Code aus den Anhängen hineinkopieren
- Deine individuellen ChannelID, readAPIKey und FieldIDs eintragen (siehe rechts unter Channel Info)
- Button „Save and Run“ drücken und beobachten ob sich die Grafik wie gewünscht aufbaut, ggf. Fehlermeldung beachten
- Nach Belieben modifizieren, um das darzustellen, was du sehen möchtest
- Plot veröffentlichen: „Create a public URL“ aktivieren, „ Add/Edit view on a channel“ auswählen und Halken bei “Public View” setzen
Jetzt sollte der Plot auf Deinem öffentlichen ThingSpeak Channel erscheinen.
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