Ankündigung

Einklappen
Keine Ankündigung bisher.

- √ - Neues Widget: zoomable Plot

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

    - √ - Neues Widget: zoomable Plot

    Gemäß Martins Bitte poste ich das hier in einem neuen Thread. Hier eine Erweiterung des plot.period Widgets um die Möglichkeit entlang der X-Achse zu zoomen.

    Code:
    /**
    * A simple widget for plotting zoomable charts
    *
    * @param       unique id for this widget
    * @param       series of item/s. More item/s in array form: [ item1 , item2 ]
    * @param       the mode: 'avg', 'sum', 'min', 'max'
    * @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       the step between two time-points (optional, only for 'offline'-driver)
    * @param       label/s for each series (optional)
    * @param       color/s for each series e. g. '#f00' for red (optional, default: sutiable for desig
    n)
    * @param       type/s for each series: 'line', 'stair', 'spline', 'area', 'areaspline', 'column' (
    optional, default 'line')
    * @param       title/s for the x-axis and y-axis
    * @param       maximum zoom for the x-axis in milliseconds (optional, default one hour)
    *
    * @see        misc/fundamentals#Array-Form
    * @see        misc/fundamentals#Duration-Format
    */
    {% macro period_zoom(id, gad, mode, tmin, tmax, ymin, ymax, step, label, color, exposure, axes, ma
    xzoom) %}
    
            <div id="{{ uid(page, id) }}" data-widget="plot.period_zoom" data-item="{{ implode(gad, [m
    ode|default('avg'), tmin|default('1h'), tmax|default('0')]) }}"
                    {% if ymin is not empty %} data-ymin="{{ ymin }}" {% endif %} {% if ymax is not em
    pty %} data-ymax="{{ ymax }}" {% endif %}
                    data-step="{{ step|default(20) }}" data-label="{{ implode(label) }}"
                    data-color="{{ implode(color) }}" data-exposure="{{ implode(exposure) }}" data-axi
    s="{{ implode(axes) }}"
            data-maxzoom="{{ maxzoom|default(3600000) }}" class="plot"></div>
    
    {% endmacro %}
    Und der dazugehörige JavaScript Teil:

    Code:
    // ----- plot.period_zoom ------------------------------------------------------
    $(document).delegate('div[data-widget="plot.period_zoom"]', {
            'update': function (event, response) {
                    // response is: [ [ [t1, y1], [t2, y2] ... ], [ [t1, y1], [t2, y2] ... ], ... ] 
    
                    var label = $(this).attr('data-label').explode();
                    var color = $(this).attr('data-color').explode();
                    var exposure = $(this).attr('data-exposure').explode();
                    var axis = $(this).attr('data-axis').explode();
            var maxZoom = $(this).attr('data-maxzoom');
                    var series = Array();
    
                    for (var i = 0; i < response.length; i++) {
                            series[i] = {
                                    type: (exposure[i] != 'stair' ? exposure[i] : 'line'),
                                    step: (exposure[i] == 'stair' ? 'left' : false),
                                    name: label[i],
                                    data: response[i],
                                    color: (color[i] ? color[i] : null)
                            }
                    }
    
                    // draw the plot
                    $('#' + this.id).highcharts({
                chart: { zoomType: 'x' },
                series: series,
                            xAxis: { type: 'datetime', title: { text: axis[0] }, maxZoom: maxZoom },
                            yAxis: { min: $(this).attr('data-ymin'), max: $(this).attr('data-ymax'), title: { text: axis[1] } }
                    });
            },
    
            'point': function (event, response) {
                    for (var i = 0; i < response.length; i++) {
                            if (response[i]) {
                                    var chart = $('#' + this.id).highcharts();
    
                                    // more points?
                                    for (var j = 0; j < response[i].length; j++) {
                                            chart.series[i].addPoint(response[i][j], false, (chart.series[i].data.length >= 100));
                                    }
                                    chart.redraw();
                            }
                    }
            }
    });
    Viel Spass damit!
    Mit freundlichen Grüßen
    Niko Will

    Logiken und Schnittstelle zu anderen Systemen: smarthome.py - Visualisierung: smartVISU
    - Gira TS3 - iPhone & iPad - Mobotix T24 - ekey - Denon 2313 - Russound C5 (RIO over TCP Plugin) -

    #2
    Neues Widget: zoomable Plot

    Das hab ich doch so versucht...
    Da muss ich mal sehen, was ich doch anders gemacht hab...

    Danke jedenfalls !

    Kommentar


      #3
      Hi Niko,

      coole Sache.

      Momentan liefert das Backend 'nur' 100 Werte zurück. Nach den Parameter 'end' kann noch 'count' angefordert werden.
      Das müsste ich im visu Plugin allerdings noch freigeben. Ist aber nur eine Kleinigkeit.

      Bis bald

      Marcus

      Kommentar


        #4
        Neues Widget: zoomable Plot

        Hab gerade noch gesehen maxZoom ist deprecated seit Version 2.2 der highcharts (welche verwendet die sV?). Wurde in minRange umbenannt.

        @henfri
        du hast es ja bei Temprose und nicht bei plot.period probiert... vielleicht kann man da nicht zoomen.
        Mit freundlichen Grüßen
        Niko Will

        Logiken und Schnittstelle zu anderen Systemen: smarthome.py - Visualisierung: smartVISU
        - Gira TS3 - iPhone & iPad - Mobotix T24 - ekey - Denon 2313 - Russound C5 (RIO over TCP Plugin) -

        Kommentar


          #5
          Zitat von 2ndsky Beitrag anzeigen
          @henfri
          du hast es ja bei Temprose und nicht bei plot.period probiert... vielleicht kann man da nicht zoomen.
          Doch, ich hatte es auch mit plot.period probiert.
          Aber ich hatte eine { falsch.

          Allerdings funktioniert es weiterhin nicht. Ich probiere mal deine Version.

          Gruß,
          Hendrik

          Kommentar


            #6
            Neues Widget: zoomable Plot

            Nur um deinen Browser auszuschließen, die highcharts Demos gehen bei dir?
            Mit freundlichen Grüßen
            Niko Will

            Logiken und Schnittstelle zu anderen Systemen: smarthome.py - Visualisierung: smartVISU
            - Gira TS3 - iPhone & iPad - Mobotix T24 - ekey - Denon 2313 - Russound C5 (RIO over TCP Plugin) -

            Kommentar


              #7
              Ja, ich hab's auf dem Ipad ausprobiert, darauf ging es.
              Sonst nutze ich Chrome.

              Ich hab jetzt dein period_zoomable ausprobiert; klappt auch nicht. Aber hier werden sogar gar keine Daten angezeigt...
              Die Syntax ist -wie ich es sehe- doch genau wie bei plot.period, oder?

              Ich habe halt deine Code-Schnipsel in die plots.htm und widgets.js kopiert und in der items.conf:
              sv_widget="{{ plot.period_zoom('p9987', 'item', 'avg', '24h') }}"
              statt
              sv_widget="{{ plot.period('p9987', 'item', 'avg', '24h') }}"
              (sqlite ist aktiviert und ging ja vorher auch.

              Hast du eine Idee?


              Gruß,
              Hendrik

              Kommentar


                #8
                Neues Widget: zoomable Plot

                Oh, ich sehe gerade, dass im Macro Block einige Zeilen falsch umgebrochen wurden. Das kann ich derzeit vom iPhone aus leider nicht korrigieren.
                Mit freundlichen Grüßen
                Niko Will

                Logiken und Schnittstelle zu anderen Systemen: smarthome.py - Visualisierung: smartVISU
                - Gira TS3 - iPhone & iPad - Mobotix T24 - ekey - Denon 2313 - Russound C5 (RIO over TCP Plugin) -

                Kommentar


                  #9
                  Ich aber ;-)
                  Hatte ich sogar schon, weil ich dachte, dass der Fehler auf meiner Seite lag (beim Rüberkopieren).
                  So sieht es aus:
                  Code:
                  {% macro period_zoom(id, gad, mode, tmin, tmax, ymin, ymax, step, label, color, exposure, axes, maxzoom) %}
                  
                          <div id="{{ uid(page, id) }}" data-widget="plot.period_zoom" data-item="{{ implode(gad, [mode|default('avg'), tmin|default('1h'), tmax|default('0')]) }}"
                                  {% if ymin is not empty %} data-ymin="{{ ymin }}" {% endif %} {% if ymax is not empty %} data-ymax="{{ ymax }}" {% endif %}
                                  data-step="{{ step|default(20) }}" data-label="{{ implode(label) }}"
                                  data-color="{{ implode(color) }}" data-exposure="{{ implode(exposure) }}" data-axis="{{ implode(axes) }}" data-maxzoom="{{ maxzoom|default(3600000) }}" class="plot"></div>
                  
                  {% endmacro %}
                  Ist das so richtig?

                  Gruß,
                  Hendrik

                  Kommentar


                    #10
                    Ja, schaut gut aus.

                    @Niko: Vielleicht die Dateien als .zip?

                    Und ja: du brauchst Zugang zum svn . Schick mir mal deinen Google-Login.

                    Gruss
                    Join smartVISU on facebook. Web: smartvisu.de.
                    Dir gefällt smartVISU? Bitte spenden für die Weiterentwicklung.

                    Kommentar


                      #11
                      Neues Widget: zoomable Plot

                      @henfri
                      Ja, sieht eigentlich gut aus. Damit geht es nicht?

                      @Apollo
                      Hab nur iPads im Urlaub dabei, zippen und ins Forum laden geht da leider nicht
                      Mit freundlichen Grüßen
                      Niko Will

                      Logiken und Schnittstelle zu anderen Systemen: smarthome.py - Visualisierung: smartVISU
                      - Gira TS3 - iPhone & iPad - Mobotix T24 - ekey - Denon 2313 - Russound C5 (RIO over TCP Plugin) -

                      Kommentar


                        #12
                        Neues Widget: zoomable Plot

                        Mir ist da noch was eingefallen. Per Default wird nicht die widget.js sondern die widget.min.js eingebunden. Du musst also den JS Code entweder in die widget.js einfügen und die min.js selbst erzeugen, oder in der Config von min.js auf .js umstellen. In der 2.5 ging das in der config.php, das hat sich aber mit der 2.6 geändert. Hier muss Martin helfen.

                        @Apollo
                        Kennst du einen Weg die JS Dateien zu minimieren, ohne gleich Java installieren zu müssen? Das kommt mir nämlich nicht auf die Kiste.
                        Mit freundlichen Grüßen
                        Niko Will

                        Logiken und Schnittstelle zu anderen Systemen: smarthome.py - Visualisierung: smartVISU
                        - Gira TS3 - iPhone & iPad - Mobotix T24 - ekey - Denon 2313 - Russound C5 (RIO over TCP Plugin) -

                        Kommentar


                          #13
                          Ah, da kann ich ja lange üben. Ich hab noch nicht aktualisiert. Werde mal nachsehen.

                          von Unterwegs getippert

                          Kommentar


                            #14
                            @2ndsky:

                            sowas wie:

                            efficient JS minification using PHP | klog


                            Gruss,

                            der Jan
                            KNX, DMX over E1.31, DALI, 1W, OpenHAB, MQTT

                            Kommentar


                              #15
                              Neues Widget: zoomable Plot

                              Hi Jan,

                              coole Sache, Danke. Martin, das wäre doch was für die smartVISU
                              Mit freundlichen Grüßen
                              Niko Will

                              Logiken und Schnittstelle zu anderen Systemen: smarthome.py - Visualisierung: smartVISU
                              - Gira TS3 - iPhone & iPad - Mobotix T24 - ekey - Denon 2313 - Russound C5 (RIO over TCP Plugin) -

                              Kommentar

                              Lädt...
                              X