Ankündigung

Einklappen
Keine Ankündigung bisher.

Neues Widget: "Mix-Max-Avg" Plot

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Neues Widget: "Mix-Max-Avg" Plot

    Nabend zusammen,

    heute hatte ich mal die spontane Idee für die Außentemperatur mal was anderes als einen einfachen "period"-Plot auszuprobieren und bin dabei über die Highchart Funktion "columnrange" gestolpert.

    Da es hier keine Out-of-the-Box Möglichkeit gab habe ich mal ein wenig gebastelt und eine (für mich) ansprechende Lösung gefunden.


    Damit das ganze funktioniert habe ich die in der SmartVISU liegende Version von Highcharts auf die neuste Version (4.1.3) geupdatet. Außerdem arbeite ich auf dem develop Stand von sh.py inkl. Count-Patch.

    Nach Anpassung der "widget.js" muss auf Root-Ebene der Smartvisu "php make.php" ausgeführt werden.


    Grüße,

    Lars


    -----------------------------------------------------------------------

    Highchart Download: http://code.highcharts.com/zips/Highcharts-4.1.3.zip => der Inhalt des "js" Ordners im Zip muss nach "vendor/plot.highcharts/". (Einfach alles überschreiben)

    Count-Patch (Visu und sh.py): https://github.com/aschwith/smarthom...elop/smartvisu

    widgets/plot.html
    Code:
    /**
    * A simple widget for plotting item min/max/avg chart
    *
    * @param unique id for this widget
    * @param the item. Only one item supported.
    * @param the minimum time (x-axis): '1h', '2h'... (duration-format)
    * @param the maximum time (x-axis): '', '1h', '2h'... (duration-format, default: now)
    * @param the minimum y-axis (optional)
    * @param the maximum y-axis (optional)
    * @param a unit, tries to get the format for that unit from the language-file (optional)
    * @param title/s for the x-axis and y-axis (optional)
    * @param count number of data points to load, default 100
    *
    * @see misc/fundamentals#Duration-Format
    */
    {% macro minmaxavg(id, gad, tmin, tmax, ymin, ymax, unit, axis, count) %}
    	{% if once('highcharts-more') %}
    		<script src="vendor/plot.highcharts/highcharts-more.js"></script>
    	{% endif %}
    
    	<div id="{{ uid(page, id) }}" data-widget="plot.minmaxavg" data-unit="{{ unit|default('') }}"
    		 data-item="{{ implode(gad, ['min', tmin|default('1h'), tmax|default('now'), count|default(100)]) }},
    		 {{ implode(gad, ['max', tmin|default('1h'), tmax|default('now'), count|default(100)]) }},
    		 {{ implode(gad, ['avg', tmin|default('1h'), tmax|default('now'), count|default(100)]) }}"
    		 {% if ymin is not empty %} data-ymin="{{ ymin }}" {% endif %} {% if ymax is not empty %} data-ymax="{{ ymax }}" {% endif %}
    		 {% if count is not empty %} data-count="{{ count }}" {% endif %} data-axis="{{ implode(axis) }}"
    		 class="plot"></div>
    {% endmacro %}

    widget.js
    Code:
    // ----- plot.minmaxavg ----------------------------------------------------------
    $(document).delegate('div[data-widget="plot.minmaxavg"]', {
    	'update': function (event, response) {
    		// response is: [[t1 , {{ gad.min }}], [t2 , {{ gad.max }}], [t3 , {{ gad.avg }}]]
    
    		var axis = $(this).attr('data-axis').explode();
    		var unit = $(this).attr('data-unit');
    
    		var minValues = response[0];
    		var maxValues = response[1];
    
    		var ranges = [];
    		for (var i = 0; i < minValues.length; i++) {
    			ranges[i] = [minValues[i][0], minValues[i][1], maxValues[i][1]];
    		}
    
    		// draw the plot
    		$('#' + this.id).highcharts({
    			chart: {
    				type: 'columnrange',
    				inverted: false
    			},
    			series: [{
    				data: ranges,
    				enableMouseTracking: false
    			}, {
    				type: 'line',
    				data: response[2]
    			}],
    			xAxis: {
    				type: 'datetime',
    				title: { text: axis[0] }
    			},
    			yAxis: {
    				min: $(this).attr('data-ymin'),
    				max: $(this).attr('data-ymax'),
    				title: { text: axis[1] }
    			},
    			plotOptions: {
    				columnrange: {
    					dataLabels: {
    						enabled: true,
    						formatter: function () {
    							if (unit != '') {
    								return parseFloat(this.y).transUnit(unit);
    							} else {
    								return parseFloat(this.y).transFloat();
    							}
    						}
    					}
    				}
    			},
    			tooltip: {
    				pointFormatter: function() {
    					var value = this.y;
    					if (unit != '') {
    						value = parseFloat(this.y).transUnit(unit);
    					} else {
    						value = parseFloat(this.y).transFloat();
    					}
    					return '<span style="color:' + this.color + '">\u00D8</span>  <b>' + value + '</b><br/>'
    				}
    			},
    			legend: { enabled: false }
    		});
    
    	},
    
    	'point': function (event, response) {
    		var count = $(this).attr('data-count');
    		if (count < 1) {
    			count = 100;
    		}
    
    		var minValues = response[0];
    		var maxValues = response[1];
    
    		for (var i = 0; i < minValues.length; i++) {
    			var chart = $('#' + this.id).highcharts();
    			chart.series[0].addPoint([minValues[i][0], minValues[i][1], maxValues[i][1]], false, (chart.series[i].data.length >= count));
    			chart.series[1].addPoint(response[2][i], false, (chart.series[i].data.length >= count));
    			chart.redraw();
    		}
    	}
    });

    Einbau-Beispiel:
    Code:
    {{ plot.minmaxavg('tempOutdoor', 'zentral.wetter.temperatur', '7d', '', '', '', '°', ['', 'Temperatur in °C'], '7') }}
    Angehängte Dateien

    #2
    Hallo, sieht gut aus ! Super!

    Michel

    Kommentar


      #3
      Hallo miteinander.

      ich habe die Lösung unter 2.7 sofort übernehmen können. Lief sofort und ohne Probleme.

      Jetzt habe ich die 2.8 Develop und nichts rührt sich mehr.
      Im Debug sieht man die Daten. Es ist wohl ein Anzeigeproblem (png/svg ??)

      Hat jemand schon einen Lösungsansatz gefunden?


      Für jede Hilfe bin ich dankbar!

      Wolfgang

      Kommentar


        #4
        Hey,
        Ich hab die 2.8 bei mir im Betrieb, da läuft es. Spontane Ideen:

        - durchs Update ist die Highcharts Version zurückgesetzt worden, da im SmartVISU Repo noch ne älterere Version drin ist
        - Count Patch im Smarthome.py fehlt (hier muss man auch den aktuellsten develop stand haben.


        Gibt es evtl einen Javascript Fehler oder im smarthome.py Log etwas?

        Grüße, Lars

        Kommentar


          #5
          Hallo,

          bei mir kommt jetzt leider folgender Fehler im log:
          Code:
          2016-02-10 21:33:30 ERROR    Main         Problem fetching series for WS300.Regen_Stunden: unsupported operand type(s) for /: 'int' and 'str'
          Traceback (most recent call last):
            File "/usr/smarthome/plugins/visu/__init__.py", line 328, in json_parse
              reply = self.items[path]['item'].series(series, start, end, count)
            File "/usr/smarthome/plugins/sqlite/__init__.py", line 312, in _series
              step = int((iend - istart) / count)
          TypeError: unsupported operand type(s) for /: 'int' and 'str'
          Es werden garkeine Plots mehr dargestellt.

          Wo liegt hier der Fehler?

          Gruß Grisu

          Kommentar


            #6
            Fehlender Count-Patch?

            Kommentar


              #7
              Ich habe die Fehler aus sh.sy jetzt alle raus, der Patch sollte auch aktiv sein, bin was sh.py und smartVISU angeht auf die aktuellsten Development Versionen und habe dann aus dem Patch die Dateien noch überschrieben.. SQLite Plugin und SmartVisu. Trotzdem kriege ich garkeine Charts mehr angezeigt. Aktuell auch keine direkten Fehler erkennbar. Ideen?

              Update: unter meiner gebackupten 2.7 schaut es jetzt auch gut aus.. das Verhalten hat wohl eher mit dem 2.8er Update zu tun und ist ähnlich wie hier beschrieben: https://knx-user-forum.de/forum/suppo...ildinformation

              Update 2: jetzt geht es, nachdem ich die Version von 0 auf 3 in der io_smarthome.py.js bzw. händisch in der kompilierten io_smarthome.py.min.js korrigiert hatte.. Danach nochmal ein php make.php.

              Entweder gab es beim php make.php Probleme mit Dateirechten und das make ging erst danach, oder die Version hatte die Probleme ausgelöst.

              Update 3: jetzt habe ich festgestellt, dass basic.switch nicht mehr tut wie es soll. Im Smarthome-Debug sehe ich keine Requests mehr... Andere Widgets machen aber noch.. strange..

              Offenbar zerschreddert es beim " php make.php" gerne mal alle JS Files...
              Zuletzt geändert von psilo; 14.02.2016, 16:45.

              Kommentar


                #8
                Danke für die Hinweise!

                Am Wochenende habe ich noch einmal alles nachvollzogen.
                Hier noch einmal meine Ausgangsbasis.

                Ich nutze den Beaglebone und habe die Develop Versionen von Robert.
                https://github.com/robert-budde?tab=repositories

                danach habe ich die io_smarthome.py.js aus dem Countpatch und aus dem Robert-File verglichen.
                im File von Robert stand Version 0. In einigen Beiträgen wird die Version 3 gefordert. Also in io_smarthome.py.js auf Version=3 geändert. php make.php durchgeführt
                Zuvor alle Anweisungen laut Beitrag 1 durchgeführt. Ergebnis war eine Fehlermeldung wie "Update your Client".
                Den Text habe ich im io_smarthome.py.min.js gefunden. Hier steht ebenfalls Version = 0. Hier ebenfalls Version = 3 eingetragen. Neues php make.php
                Danach lief das Programm fehlerfrei, nur plot_avgminmax zeigt keine Werte!
                Alle anderen plot.period zeigen Werte.

                Wo kann ich weiter forschen?

                Ich denke, ich habe das gleiche Problem wie psilo im Beitag zuvor. basic-switche gehen bei mir allerdings.

                Es geistern im Forum Aussagen über 'now' und '0' im Makroaufruf herum. Ich habe 'now', '0' und auch 0 ohne Zeichen probiert. Leider ohne Erfolg. Keine Meldungen im LOG.

                Mein Aufruf entsprichr dem Mustebeispiel
                {{ plot.minmaxavg('tempOutdoor', 'zentral.wetter.temperatur', '7d', '', '', '', '°', ['', 'Temperatur in °C'], '7') }}

                Frage an Lars: Welchen Developstand nutzt Du in Deiner Lösung. Oder kannst Du die beiden io_smarthome.xxx einmal hier einstellen?

                Das Problem sollte doch zu knacken sein!!

                Gruß und Dank an alle Mitstreiter

                Wolfgang


                PS: Ich sehe gerade, in der make.php fehlt ein io_smarthome.py.min.js ! Sollte das hier nicht stehen?
                Zuletzt geändert von schloessl; 15.02.2016, 16:13.

                Kommentar


                  #9
                  Hallo Wolfgang,

                  Dein Fehler liegt tatsächlich an der momentanen Integration des "Count-Patches". Die Versionsnummer auf der Smartvisu Seite hast Du ja bereits korrigiert. Auf der Smarthome.py Seite ist das Sqlite plugin noch nicht korrekt. Wie Du ja selber schon herausgefunden hast, sind momentan leider die Develop-Versionen von Smarthome und Smartvisu nicht kompatibel. Entsprechende Pull requests sind gestellt. Du musst Dich wohl gedulden, bis die Änderungen dort eingepflegt worden sind.

                  Viele Grüße
                  Alex

                  Kommentar


                    #10
                    Danke Alex,
                    mit dieser konkreten Aussage kann ich leben und mir eine weitere Fehlersuche ersparen!

                    Schade, es wird in einigen Foren die Plotproblematik diskutiert. Gerne würden sicherlich einige Nutzer bei Kenntnis der entsprechenden Pullrequest weitere Test durchführen.
                    Nur so als Denkansatz für alle Entwickler. Alex für Dich gilt Zeile 1!
                    Danke
                    wolfgang

                    Kommentar


                      #11
                      Auch danke von meiner Seite, habe mir zu dem Thema am Wochenende stundenlange Analysen gegönnt. Hoffe es tut sich was, das Widget gefällt mir echt gut.

                      Kommentar


                        #12
                        Hallo Wolfgang,

                        mein Pullrequest war doch noch nicht gestellt. Habe ich gerade nachgeholt. Die Änderungen findest Du hier:
                        https://github.com/mknx/smarthome/pull/202

                        Damit könntest Du es bei Dir auch manuell zum Laufen bekommen.

                        Beste Grüße
                        Alex

                        Kommentar


                          #13
                          Zitat von schloessl Beitrag anzeigen
                          Frage an Lars: Welchen Developstand nutzt Du in Deiner Lösung. Oder kannst Du die beiden io_smarthome.xxx einmal hier einstellen?

                          Das Problem sollte doch zu knacken sein!!

                          Hey,

                          meine Versionen findest Du auf Github:

                          Smarthome.py: https://github.com/lbernau/smarthome
                          Smartvisu: https://github.com/lbernau/smartVISU
                          Pages: https://github.com/lbernau/smartvisuPages


                          Smarthome dürfte quasi 1:1 auf dem Development stand sein.
                          Smartvisu weicht vermutlich ein wenig ab, was in den meisten Dingen wohl an ner neuen Highcharts Version liegen dürfte, hab jetzt aber auf die Schnelle keinen Diff gemacht.



                          Grüße,

                          Lars

                          Kommentar


                            #14
                            Zitat von aschwith Beitrag anzeigen
                            Hallo Wolfgang,

                            mein Pullrequest war doch noch nicht gestellt. Habe ich gerade nachgeholt. Die Änderungen findest Du hier:
                            https://github.com/mknx/smarthome/pull/202

                            Damit könntest Du es bei Dir auch manuell zum Laufen bekommen.

                            Beste Grüße
                            Alex
                            Danke Alex für den Hinweis!

                            Leider ohne Erfolg. Nach der Übernahme des kompletten Files gingen garkeine Plots mehr.
                            Nach der manuellen Rückänderung der markietren Zeile gehen die normalen Plots wieder.

                            Gleicher Test mit einer frischen DB, gleiches Ergebnis.

                            Meine Version SQLite 3.8.7.1 --, ist die ok?

                            Hast Du noch einen Rat?

                            Beste Grüße und Dank
                            Wolfgang

                            Kommentar


                              #15
                              hmm strange, nach einspielen der markierten zeile gehen bei mir sowohl im neusten smartvisu als auch in dem von lars die alten, aber nicht die neuen charts..

                              beim integrieren des googlecal plugins in smartvisu kriege ich bei Lars' Version dafür 2 fehler:
                              Angehängte Dateien
                              Zuletzt geändert von psilo; 17.02.2016, 18:35.

                              Kommentar

                              Lädt...
                              X