Ankündigung

Einklappen
Keine Ankündigung bisher.

widget: multi y plot

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

    widget: multi y plot

    anbei mein widget für plots mit mehreren y Achsen.

    Code:
    // ----- plot.multi_period -----------------------------------------------------------
    $(document).delegate('div[data-widget="plot.multi_period"]', {
        '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 series = Array();
            var yaxes = Array();
            var ymin = $(this).attr('data-ymin').explode();
            var ymax = $(this).attr('data-ymax').explode();
    
            var axesassign = $(this).attr('data-axesassign').explode();
    
            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],
                    yAxis: axesassign[i]-1,
                    color: (color[i] ? color[i] : null)
                }
    
                yaxes[i]={min: ymin[axesassign[i]-1], max: ymax[axesassign[i]-1],title: {text: axis[i+1],style: {color:(color[i] ? color[i] : null)}}}
    
    
            }
    
    
            // draw the plot
            $('#' + this.id).highcharts({
                series: series,
                xAxis: { type: 'datetime', title: { text: axis[0] } },
                yAxis: yaxes
            });
        },
    
        '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();
                }
            }
        }
    });
    Code:
    {% macro multi_period(id, gad, mode, tmin, tmax, ymin, ymax, step, label, color, exposure, axes, axesassign) %}
    
    <div id="{{ uid(page, id) }}" data-widget="plot.multi_period" data-item="{{ implode(gad, [mode|default('avg'), tmin|default('1h'), tmax|default('0')]) }}"
    {% if ymin is not empty %} data-ymin="{{ implode(ymin) }}" {% endif %} {% if ymax is not empty %} data-ymax="{{ implode(ymax) }}" {% endif %}
    data-step="{{ step|default(20) }}" data-label="{{ implode(label) }}"
    data-color="{{ implode(color) }}" data-exposure="{{ implode(exposure) }}" data-axis="{{ implode(axes) }}" data-axesassign="{{ implode(axesassign) }}"
    class="plot"></div>
    
    {% endmacro %}
    Code:
    {{ own.multi_period('VerlaufTempAllgOwn', ['allgemein.wetterstation.temperaturNord','allgemein.wetterstation.Windgeschwindigkeit','allgemein.wetterstation.temperaturWS'],'avg','24h','',['-10','0'],['40','10'],'',['Nordwand','Windgeschwindigkeit'],'',['line','stair','line'],['Uhrzeit','°C','Test 2'],['1','2','1']) }}
    Code:
    ['Uhrzeit','°C','Test 2']
    Uhrzeit = y Achse, danach jeweils die X Achsen

    Code:
    ['1','2']
    Zuweisung der Daten zu den Achsen

    #2
    Könntest du noch ein Bild davon hier posten?

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

    Kommentar


      #3
      Vielen Dank! Sieht für mich vom "Interface" stimmig aus. Wobei: Funktionieren mehrere explizite y-min/y-max?

      Wo muss das Javascript hin? In die widget.js ist ja wohl nicht sinnvoll, zumal nicht komprimiert und beim nächsten Update weg...

      Grüße
      Robert

      Kommentar


        #4
        anzeige usw klappt.

        ein problem hab ich aber noch mit dem css, da das svn durch die 2te skala nach links größer ist als das div.

        eigentlich sollte das nicht der fall sein da die width etc pp ja automatisch kommt
        Angehängte Dateien

        Kommentar


          #5
          Zitat von Robert Beitrag anzeigen
          Vielen Dank! Sieht für mich vom "Interface" stimmig aus. Wobei: Funktionieren mehrere explizite y-min/y-max?

          Wo muss das Javascript hin? In die widget.js ist ja wohl nicht sinnvoll, zumal nicht komprimiert und beim nächsten Update weg...

          Grüße
          Robert
          die min/max werte werden ansich bei meinem widget getrost ignoriert und vom highcharts selbst ermittelt.

          das js kommt in die visu.js in deinem page folder (wenn die noch nicht da ist, einfach erstellen)

          Kommentar


            #6
            Zitat von fanta2k Beitrag anzeigen
            ein problem hab ich aber noch mit dem css, da das svn durch die 2te skala nach links größer ist als das div.
            Das hat nichts mit dem CSS zu tun. In den Designs z.B. "design/night.js" werden die margins von highcharts gesetzt. Damit hatte ich auch zu kämpfen als ich meine PV-Anlage angebunden habe. Wenn man rechts den margin auf den gleichen Wert wie links setzt passt es. Aber schön ist das nicht, dass es dort "fest" vorgegeben ist (gilt bei Änderung für alle Plots dann) und nicht irgendwie automatisch berechnet wird.
            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
              Zitat von fanta2k Beitrag anzeigen
              die min/max werte werden ansich bei meinem widget getrost ignoriert und vom highcharts selbst ermittelt.
              Na ok, dann fängt es da an - das ist im Standard-Plot ja möglich und wird von mir auch tunlichts verwendet. Das müsste ja jetzt mit Arrays entsprechend erweitert werden.

              @Martin: Ich denke wirklich das sollte standardmäßig möglich sein? Entweder einen oder halt mehrere Achsen angeben, gut is? Sonst haben wir jetzt schon Standard, Zoomable, Multi und Multi+Zoomable...

              Grüße
              Robert

              Kommentar


                #8
                Zitat von Robert Beitrag anzeigen
                Sonst haben wir jetzt schon Standard, Zoomable, Multi und Multi+Zoomable...
                ganz zu schweigen von der sich anhäufenden Menge an dupliziertem JS Code der über den Äther geschickt werden will...
                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
                  Zitat von Robert Beitrag anzeigen
                  Na ok, dann fängt es da an - das ist im Standard-Plot ja möglich und wird von mir auch tunlichts verwendet. Das müsste ja jetzt mit Arrays entsprechend erweitert werden.

                  @Martin: Ich denke wirklich das sollte standardmäßig möglich sein? Entweder einen oder halt mehrere Achsen angeben, gut is? Sonst haben wir jetzt schon Standard, Zoomable, Multi und Multi+Zoomable...

                  Grüße
                  Robert
                  das mit min/max ist kein problem das noch aufzunehmen.

                  ein widget für period (egal ob multi, zoom usw pp) macht aufjedenfall sinn und ist jetzt auch nicht wirklich viel komplizierter

                  Kommentar


                    #10
                    Ja, bin ich schon dabei. Ist ja wirklich easy wenn man (ich *g*) mal das System verstanden hat. Aber ist natürlich unnötig, wenn das jetzt 5 Leute für sich wurschteln und es irgendwann dann als sechste Version als Release kommt...

                    Allerdings könnte man sich ja wirklich noch auf ein paar Sachen verständigen: z.B. erste Achse links, zweite und jede weitere rechts? Oder auch variabel? Zoomable in x-Richtung, oder auch y-Richtung (siehe die Highchart-Demo)?

                    Highcharts sind sooooo schön! :-D

                    Grüße
                    Robert

                    Kommentar


                      #11
                      hab oben mal aktualisiert, geht nun auch mit verschiedenen min/max

                      Kommentar


                        #12
                        Ich mag ja meine transform Funktionen die ich an anderer Stelle bereits eingeführt und erläutert habe. Highcharts hat einfach verdammt viele Optionen, diese alle so zu verpacken wird recht aufwändig. Wenn man einen weiteren Parameter "config" einführt, könnte man darin JSON encodiert die Konfiguration für highcharts angeben. Problem dabei, man muss es bei jedem Widget neu mitgeben. Sollte sich mal die darunterliegende Chart Komponente von highcharts auf etwas anderes ändern, muss man extrem viel anpassen. Wenn man anstatt der config nun eine Funktion mit gibt, kann diese leicht angepasst werden und der Code ist nur an einer Stelle zu ändern.
                        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
                          Ja, die sind programmiertechnisch sehr elegant, ich glaube aber das das für einige schon "zuviel" ist.

                          Ein Widgets was "alles" kann, kann ich mir bei den Plots auch nicht vorstellen, meiner Meinung nach sollte es für bestimmte Zwecke Ausprägungen geben, die dann "leichter" Einzubauen sind. Die Konfiguration sollte in solch einem Fall schon komplett vorgegeben sein, nur wenige haben Lust sich durch die Konfig von Highcharts zu arbeiten.

                          Wir können da auch nicht immer von uns ausgehen, weil wir ja schon die sind, die sich gerne mit endlosen Einstllungen beschäftigen.

                          Also mir wärs lieber: konkret stat generisch.

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

                          Kommentar


                            #14
                            naja, das problem ist halt das man mit ner art funktion schnell an die gzenzen der übersichtlichkeit kommt und der normale "benutzer" dann schonmal ne spalte durcheinander bringt und gefrustet aufgibt ohne debugging möglichkeiten.

                            bei solchen dingen wäre evtl ein objekt ansatz besser und auch robuster.

                            ala

                            PHP-Code:
                            $plot = new plot();
                            $plot->setType('period')->setId('...')->setLabel('....')->setTmin('..')....;
                            $plot->addSource('OG.temp','color','Name','min:max','line','yaxis');
                            $plot->generate(); 
                            Es gibt da übrigens auch ganz andere ansätze, indem man sich einen php wrapper für highcharts baut und somit auch kein js anfassen muss da dies zur runtime erzeugt wird (habe bei meiner applikation zb einen kompletten php wrapper für nen sencha backend).

                            für highcharts hatte das auch schon jemand mal vor einiger zeit versucht (zb https://github.com/jmaclabs/HighRoller)

                            Kommentar


                              #15
                              Ja, da geb ich dir in allen Punkten recht.

                              In welcher Sprache man das hinschreibt ist letztendlich warscheinlich gar nicht so entscheidend, ob PHP oder JS.

                              Die gewonnene Flexibilität bezahlt man halt auch mit einer Programmierung. Und das können nicht viele.

                              Wir bewegen uns in der Templateengine ja in einer Scriptsprache, da wären mir vorkonfigurierte Plots lieber.

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

                              Kommentar

                              Lädt...
                              X