Part 2: Creating Individual Diagrams with MATLAB Visualization

By | April 15, 2021

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:

  1. Press the “MATLAB Visualization” button.
  2. Select template “Custom (no starter code)
  3. Copying code from the attachments into it
  4. Enter your individual ChannelID, readAPIKey and FieldIDs (see right under Channel Info)
  5. Press the “Save and Run” button and observe whether the graphic is structured as desired, note the error message if necessary.
  6. Modify at will to display what you want to see
  7. 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

Author: Johannes

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

39 thoughts on “Part 2: Creating Individual Diagrams with MATLAB Visualization

  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

Leave a Reply

Your email address will not be published. Required fields are marked *