Teil 2: Individuelle Diagramme mit MATLAB Visualization erstellen

By | April 15, 2021

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:

  1. Button „MATLAB Visualization“ drücken
  2. Template „Custom (no starter code)“ auswählen
  3. Code aus den Anhängen hineinkopieren
  4. Deine individuellen ChannelID, readAPIKey und FieldIDs eintragen (siehe rechts unter Channel Info)
  5. Button „Save and Run“ drücken und beobachten ob sich die Grafik wie gewünscht aufbaut, ggf. Fehlermeldung beachten
  6. Nach Belieben modifizieren, um das darzustellen, was du sehen möchtest
  7. 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.

Author: Johannes

Familienvater, Ehemann und Ingenieur, in meiner Freizeit Hausmeister, Musiker und natürlich Imker. Wohnhaft in Heilbronn.

39 thoughts on “Teil 2: Individuelle Diagramme mit MATLAB Visualization erstellen

  1. Mark Blabensteiner

    Hallo ,

    gibt es auch eine Möglichkeit um die Batteriespannung zu dem Gewicht pro Tag anzeigen zu lassen?

    LG

    Reply
    1. Johannes Post author

      Hallo Mark,

      ja das geht problemlos mit geringfügiger Modifikation eines der Skripte.

      Gruß Johannes

      Reply
  2. Thomas Pfaffinger

    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

    Reply
  3. M.Boh

    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

    Reply
    1. Johannes

      Hallo, eventuell hast Du eine falsche Syntax verwendet? Ist der Key in Hochkomma eingeschlossen? Jedenfalls wird offensichtlich der readAPIKey nicht erkannt.

      Reply
      1. M.Boh

        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.

        Reply
        1. Johannes Post author

          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

          Reply
  4. Jörg Weiß

    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 🙂

    Reply
    1. Johannes Post author

      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

      Reply
      1. Jörg Weiß

        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? 🙂

        Reply
        1. Johannes Post author

          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

          Reply
          1. Jörg Weiß

            Hallo Johannes,

            TOP , danke vielmals für deine Unterstützung.

  5. JürgenS

    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

    Reply
    1. Johannes Post author

      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

      Reply
  6. Thorsten

    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

    Reply
  7. Guido

    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

    Reply
    1. Johannes Post author

      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

      Reply
      1. Oliver

        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

        Reply
        1. Johannes Post author

          Hallo Oliver, sorry Deine Mail ist bei mir im Spamordner gelandet. Funktioniert das inzwischen?

          Reply
    2. Martin Zellhofer

      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.

      Reply
  8. Thomas Müller

    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

    Reply
    1. Johannes Post author

      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

      Reply
      1. Thomas Müller

        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

        Reply
      2. Michael Thoma

        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

        Reply
        1. Johannes Post author

          Hallo Michael,

          prüfe mal bitte ob unter „Channel Sharing Settings“ die Option „Share channel view with everyone“ ausgewählt ist. Funktioniert es dann?

          Reply
        2. Michael Thoma

          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

          Reply
          1. Thorsten

            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

  9. Josef Basl-Zeilinger

    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

    Reply
    1. Johannes Post author

      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

      Reply
  10. Martin Kosmann

    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

    Reply
    1. Javan

      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.

      Reply
      1. Martin Kosmann

        Copy and paste funktioniert in der Zeile „Name“.
        Dort wo der Matlab Code eingegeben wird klappt das nicht. Ich kann dort nichts einfügen.

        Reply
        1. Martin Kosmann

          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

          Reply
  11. aseufert

    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… ?

    Reply
    1. Johannes Post author

      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);

      Reply

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert