Ankündigung

Einklappen
Keine Ankündigung bisher.

eHZ Visu Beispiel mit neuem Widget Stacked Column Bar Chart

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

  • wvhn
    antwortet
    Nach langer Zeit mal wieder eine Meldung auf diesem Thread:
    im develop branch ist jetzt eine neue Version des plot.period Widgets. Die Plots für line, area und column können jetzt gestackt werden. Dazu müssen die Daten aber in synchronen Zeitintervallen vorliegen. Den Treiber io_offline.js habe ich entsprechend angepasst, damit die (erweiterte) Dokuseite Stapeldiagramme anzeigen kann.
    Stacked_plots.png

    Gruß
    Wolfram

    Einen Kommentar schreiben:


  • wvhn
    antwortet
    Hallo Marco,
    die alte widget.js aus sv2.8 ist definitiv nicht kompatibel zu v2.9. Das gesamte Konzept der widgets wurde umgestellt und wenn Du eine alte widget.js einsetzt, gibt es "Kleinholz". Da läuft dann kein Widget mehr.

    Aktuell ist mir keine Lösung bekannt. Sollte jemand den Plot schon auf v2.9 umgebaut haben, kann ich den Code gerne schnell auf smartvisu-newstuff zur Verfügung stellen und einen Versuch zur Integration ins nächste Release unternehmen.

    Gruß Wolfram

    Einen Kommentar schreiben:


  • z1marco
    antwortet
    Hallo hat jemand das stacked widget unter smartvisu 2.9 am laufen? Bei mir gibt es gar keine widget.js datei.

    vielen Dank schonmal

    Einen Kommentar schreiben:


  • Simikuen
    antwortet
    Servus,

    hat sich erledigt. Läuft bei mir nun.

    Hallo zusammen,

    ich habe versucht das bei mir zum Laufen zu bekommen. Leider ohne Erfolg.

    Habe wie eingangs beschrieben die Zeit Logik integriert. Danach dann die Items in der conf angelegt. Das passt soweit da ich die Werte mir normal in der Visu anzeigen lassen kann.

    die smartvisu/widgets/widget.js sieht so aus.
    Code:
    // ----- plot.stacked ----------------------------------------------------------
    $(document).delegate('div[data-widget="plot.stacked"]', {
        '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 zoom = $(this).attr('data-zoom');
            var showStacklabels = JSON.parse($(this).attr('data-stacklabels'));
            var correctdate = JSON.parse($(this).attr('data-correctdate'));
            var series = Array();
    
            for (var i = 0; i < response.length; i++) {
                // 1) werte werden um Mitternacht für den Vortag generiert, Anzeige von Highcharts auf dem Folgetag, ABzug von 24h in millisekunden
                // 2) timestamp is in milliseconds, harmonize last 3 figures to 000
                // sollte also hiermit auf 10sec "ungenau" werden => notwendig für gruppierung von highcharts
                // 3) remove last value as it is a during the day value
                var oneResponse = response[i]; // [[1420526954593,0],[1420554301019,6.21],[1420585202298,6.7],[1420671601499,7.4],[1420671601527,7.12],[1420747423682,7.12]]
                for (var k = 0; k < oneResponse.length; k++) {
                    var timestamp = oneResponse[k][0];
                    // 1)
                    if (correctdate) {
                        timestamp = timestamp - 1000 * 60 * 60 * 24;
                    }
                    // 2)
                    //var newTimestamp = timestamp.toString().substring(0, 9).concat('0000');
                    var newTimestamp = timestamp.toString().substring(0, 8).concat('00000');
                    oneResponse[k][0] = parseInt(newTimestamp);
                }
                oneResponse.pop(); // 3)
                response[i] = oneResponse;
    
                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: { type: 'column' },
                    series: series,
                    xAxis: { type: 'datetime', title: { text: axis[0] } },
                    yAxis: { min: $(this).attr('data-ymin'), max: $(this).attr('data-ymax'), title: { text: axis[1] }, stackLabels: {
                        enabled: showStacklabels,
                        style: { color: '#fff', 'font-size': '13px', 'line-height': '14px' } }
                        },
                    plotOptions: {
                        column: {
                            stacking: 'normal',
                            dataLabels: { enabled: false }
                        }
                    }
            });
    
        },
    
        'point': function (event, response) {
    
            var count = $(this).attr('data-count');
            if (count < 100) {
                count = 100;
            }
            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 >= count));
                    }
                    chart.redraw();
                }
            }
        }
    });
    Beim Anschliessenden "php make.php" im Hauptverzeichnis kommt dann dieser Fehler.

    Code:
    pi@raspberrypi:/var/www/html/smartVISU $ sudo php make.php
    PHP Deprecated:  Methods with the same name as their class will not be constructors in a future version of PHP; PhpClosure has a deprecated constructor in /var/www/html/smartVISU/vendor/google.closure/php-closure.php on line 34
    <pre>
                                                                         smart[VISU]
                                                                        01:34, 24.12
    --------------------------------------------------------------------------------
    
    <b>lib/base/base.js</b>
    PHP Fatal error:  Uncaught Exception: String could not be parsed as XML in /var/www/html/smartVISU/vendor/google.closure/php-closure.php:485
    Stack trace:
    #0 /var/www/html/smartVISU/vendor/google.closure/php-closure.php(485): SimpleXMLElement->__construct('')
    #1 /var/www/html/smartVISU/vendor/google.closure/php-closure.php(281): PhpClosure->_parseXml('')
    #2 /var/www/html/smartVISU/make.php(68): PhpClosure->_compile()
    #3 /var/www/html/smartVISU/make.php(22): compile('lib/base/base.j...')
    #4 {main}
      thrown in /var/www/html/smartVISU/vendor/google.closure/php-closure.php on line 485
    Das DIV im Plot sieht wie folgt aus

    PHP-Code:
    <div id="{{ uid(page, id) }}" data-widget="plot.stacked" data-item="{{ implode(gad, [mode|default('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 %}
            
    data-label="{{ implode(label) }}" data-stacklabels="{{ stacklabels|default(true) }}" data-correctdate="{{ correctdate|default('false') }}"
            
    data-color="{{ implode(color) }}" data-exposure="{{ implode(exposure) }}" data-axis="{{ implode(axes) }}"
            
    {% if count is not empty %} data-count="{{ count }}" {% endif %}
            class=
    "plot"></div

    Verwenden tue ich die smartVISU 2.8 und SmartHomeNG 1.3.v1.3_Hotfix_2.

    Hat jemand eine Idee wie der Fehler zustande kommt und wie man den Plotzum laufen bekommt?

    Besten Dank im Voraus.

    Grüße
    Mirko
    Zuletzt geändert von Simikuen; 08.01.2018, 16:48.

    Einen Kommentar schreiben:


  • smai
    antwortet
    Für smartVISU 2.9 steht zumindest die Integration von plot.stacked eigentlich auf der Liste. Allerdings tue ich mich noch etwas schwer mit den vielen vorausgesetzten Items in SH.py.
    Das passt nicht so recht ins Konzept der smartVISU, unter Anderem weil diese ja mehrere Backends unterstützt.

    Einen Kommentar schreiben:


  • martinb07
    antwortet
    Hi Andi

    Das ist kein Plugin von sh.py. Die gestapelte Darstellung musst du dir in smartvisu selbst zusammenbasteln. Auf der ersten Seite steht beschrieben wie du das machst: https://knx-user-forum.de/forum/supp...005#post659005

    Leider wurde es in die Version 2.8 nicht übernommen.

    Einen Kommentar schreiben:


  • KF55W
    antwortet
    Zitat von martinb07 Beitrag anzeigen
    Auf Github gibt es verschiedene sog. "Branches". Normal lädst du dir den Master Branch. Du kannst aber, sofern vorhanden, auch auf andere Branches zugreifen. Meist heißt der Stand, der gerade in Bearbeitung ist "develop". Da sind dann die neuesten, vielleicht nicht ganz stabilen Änderungen enthalten.
    Klar soweit?
    Zu finden hier:
    [ATTACH=CONFIG]n825175[/ATTACH]
    Direktlink: https://github.com/mknx/smarthome/tree/develop


    Gruß
    Martin
    Hi Martin,

    ich kann das Plugin nicht finden.
    Wie ist der Name das Plugins, und wo finde ich die letzet Version?
    Dank uen Grüße
    ANDI

    Einen Kommentar schreiben:


  • fuxl66
    antwortet
    Hi,
    In wie weit sind diese Plots in 2.8 (SHNG) integriert bzw. lauffähig?
    Zuletzt geändert von fuxl66; 08.11.2016, 14:59.

    Einen Kommentar schreiben:


  • Marcov
    antwortet
    Habe gerade mal in mein Log geschaut, dort wird der Fehler mit ".db" ausgeben. smarthome.py vielleicht nicht sauber gestoppt und deshalb noch eine alte .conf geladen? Doppelte .conf Datei?

    Einen Kommentar schreiben:


  • martinb07
    antwortet
    Das scheint im log-file nicht richtig anzukommen. Im conf-file ist es doch richtig, oder sehe ich den Wald vor lauter Bäumen nicht?

    Einen Kommentar schreiben:


  • Marcov
    antwortet
    Laut log fehlt da das .db, oder verschluckt das Log dieses?
    PHP-Code:
      sh.ehz.haus() - sh.ehz.haus.db('max''1h''1h'
    Zuletzt geändert von Marcov; 30.07.2015, 20:32.

    Einen Kommentar schreiben:


  • martinb07
    antwortet
    Habe gestern im log gesehen, dass sh.py Probleme hat Werte zu generieren:

    Code:
    2015-07-30 04:00:00 WARNING  ehz.studio.verbrauch.stuendlich-eval Item ehz.studio: value max does not match type num. Via 1h 1h
    2015-07-30 04:00:00 WARNING  ehz.studio.verbrauch.stuendlich-eval Item ehz.studio.verbrauch.stuendlich: problem evaluating sh.ehz.studio() - sh.ehz.studio('max', '1h', '1h'): unsupported operand type(s) for -: 'float' and 'NoneType'
    2015-07-30 04:00:00 WARNING  ehz.haus.verbrauch.stuendlich-eval Item ehz.haus: value max does not match type num. Via 1h 1h
    2015-07-30 04:00:00 WARNING  ehz.haus.verbrauch.stuendlich-eval Item ehz.haus.verbrauch.stuendlich: problem evaluating sh.ehz.haus() - sh.ehz.haus('max', '1h', '1h'): unsupported operand type(s) for -: 'float' and 'NoneType'
    Hier die ehz.conf:
    Code:
    [ehz]
        [[haus]]
            type = num
            cache = on
            knx_dpt = 14
            knx_listen = 6/7/13
            knx_init = 6/7/13
            sqlite = yes
            nw = yes
            [[[leistung_aktuell]]]
                type = num
                visu = yes
                knx_dpt = 14
                knx_listen = 6/7/14
                knx_init = 6/7/14
                sqlite = yes
            [[[leistung_gestern]]]
                type = num
                visu = yes
                eval = sh.ehz.haus.db('max', '1d', '1d')
            [[[verbrauch]]]
                [[[[aktuell]]]]
                    type = num
                    cache = on
                    eval = sh.ehz.haus() - sh.ehz.haus.db('max', '1d', sh.zeit.minutenseitmitternacht.dbstr())
                    eval_trigger = ehz.haus
                [[[[gestern]]]]
                    type = num
                    cache = on
                    sqlite = yes
                    crontab = 0 0 * * = 1
                    eval = sh.ehz.haus() - sh.ehz.haus.db('max', '1d', '1d')
                    [[[[[weekly_avg]]]]]
                        type = num
                        cache = on
                        sqlite = yes
                        eval = round(sh.ehz.haus.verbrauch.gestern.db('avg', '1w'), 2)
                        eval_trigger = ehz.kosten.gestern
                [[[[stuendlich]]]]
                    type = num
                    cache = on
                    sqlite = yes
                    crontab = 0 * * * = 1
                    eval = sh.ehz.haus() - sh.ehz.haus.db('max', '1h','1h')
                [[[[monat]]]]
                    type = num
                    cache = on
                    sqlite = yes
                    crontab = 0 0 1 * = 1
                    eval = sh.ehz.haus() - sh.ehz.haus.db('max', '1m', '1m')
            [[[kosten]]]
                [[[[heute]]]]
                    type = num
                    cache = on
                    sqlite = yes
                    eval = round((sh.ehz.haus.verbrauch.aktuell())*0.2274 + (136.85/365),2)
                    eval_trigger = ehz.haus.verbrauch.aktuell
                [[[[gestern]]]]
                    type = num
                    cache = on
                    sqlite = yes
                    eval = round((sh.ehz.haus.verbrauch.gestern())*0.2274 + (136.85/365),2)
                    eval_trigger = ehz.haus.verbrauch.gestern
                    [[[[[weekly_avg]]]]]
                        type = num
                        cache = on
                        sqlite = yes
                        eval = round(sh.ehz.haus.kosten.gestern.db('avg', '1w'), 2)
                        eval_trigger = ehz.haus.kosten.gestern
                [[[[monat]]]]
                    type = num
                    cache = on
                    sqlite = yes
                    eval = round((sh.ehz.haus.verbrauch.monat())*0.2274 + (136.85/365),2)
                    eval_trigger = ehz.haus.verbrauch.monat
        [[studio]]
            type = num
            cache = on
            knx_dpt = 14
            knx_listen = 6/7/9
            knx_init = 6/7/9
            sqlite = yes
            nw = yes
            [[[leistung_aktuell]]]
                type = num
                visu = yes
                knx_dpt = 14
                knx_listen = 6/7/12
                knx_init = 6/7/12
                sqlite = yes
            [[[leistung_gestern]]]
                type = num
                visu = yes
                eval = sh.ehz.studio.db('max', '1d', '1d')
            [[[verbrauch]]]
                [[[[aktuell]]]]
                    type = num
                    cache = on
                    eval = sh.ehz.studio() - sh.ehz.studio.db('max', '1d', sh.zeit.minutenseitmitternacht.dbstr())
                    eval_trigger = ehz.studio
                [[[[gestern]]]]
                    type = num
                    cache = on
                    sqlite = yes
                    crontab = 0 0 * * = 1
                    eval = sh.ehz.studio() - sh.ehz.studio.db('max', '1d', '1d')
                    [[[[[weekly_avg]]]]]
                        type = num
                        cache = on
                        sqlite = yes
                        eval = round(sh.ehz.studio.verbrauch.gestern.db('avg', '1w'), 2)
                        eval_trigger = ehz.kosten.gestern
                [[[[stuendlich]]]]
                    type = num
                    cache = on
                    sqlite = yes
                    crontab = 0 * * * = 1
                    eval = sh.ehz.studio() - sh.ehz.studio.db('max', '1h','1h')
                [[[[monat]]]]
                    type = num
                    cache = on
                    sqlite = yes
                    crontab = 0 0 1 * = 1
                    eval = sh.ehz.studio() - sh.ehz.studio.db('max', '1m', '1m')
            [[[kosten]]]
                [[[[heute]]]]
                    type = num
                    cache = on
                    sqlite = yes
                    eval = round((sh.ehz.studio.verbrauch.aktuell())*0.2274 + (136.85/365),2)
                    eval_trigger = ehz.studio.verbrauch.aktuell
                [[[[gestern]]]]
                    type = num
                    cache = on
                    sqlite = yes
                    eval = round((sh.ehz.studio.verbrauch.gestern())*0.2274 + (136.85/365),2)
                    eval_trigger = ehz.studio.verbrauch.gestern
                    [[[[[weekly_avg]]]]]
                        type = num
                        cache = on
                        sqlite = yes
                        eval = round(sh.ehz.studio.kosten.gestern.db('avg', '1w'), 2)
                        eval_trigger = ehz.studio.kosten.gestern
                [[[[monat]]]]
                    type = num
                    cache = on
                    sqlite = yes
                    eval = round((sh.ehz.studio.verbrauch.monat())*0.2274 + (136.85/365),2)
                    eval_trigger = ehz.studio.verbrauch.monat
        [[wp]]
            [[[tag]]]
                type = num
                cache = on
                knx_dpt = 14
                knx_listen = 6/7/15
                knx_init = 6/7/15
                sqlite = yes
                nw = yes
                [[[[verbrauch]]]]
                    [[[[[aktuell]]]]]
                        type = num
                        cache = on
                        eval = sh.ehz.wp.tag() - sh.ehz.wp.tag.db('max', '1d', sh.zeit.minutenseitmitternacht.dbstr())
                        eval_trigger = ehz.wp.tag
                    [[[[[gestern]]]]]
                        type = num
                        cache = on
                        sqlite = yes
                        crontab = 0 0 * * = 1
                        eval = sh.ehz.wp.tag() - sh.ehz.wp.tag.db('max', '1d', '1d')
                    [[[[[monat]]]]]
                        type = num
                        cache = on
                        sqlite = yes
                        crontab = 0 0 1 * = 1
                        eval = sh.ehz.wp.tag() - sh.ehz.wp.tag.db('max', '1m', '1m')
                [[[[kosten]]]]
                    [[[[[heute]]]]]
                        type = num
                        cache = on
                        eval = round((sh.ehz.wp.tag.verbrauch.aktuell()*0.2251) + (84/2/365),2)
                        eval_trigger = ehz.wp.tag.verbrauch.aktuell
                    [[[[[gestern]]]]]
                        type = num
                        cache = on
                        sqlite = yes
                        eval = round((sh.ehz.wp.tag.verbrauch.gestern()*0.2251) + (84/2/365),2)
                        eval_trigger = ehz.wp.tag.verbrauch.gestern
                    [[[[[monat]]]]]
                        type = num
                        cache = on
                        sqlite = yes
                        eval = round((sh.ehz.wp.tag.verbrauch.monat()*0.2251) + (84/2/365),2)
                        eval_trigger = ehz.wp.tag.verbrauch.monat
            [[[nacht]]]
                type = num
                cache = on
                 knx_dpt = 14
                knx_listen = 6/7/16
                knx_init = 6/7/16
                sqlite = yes
                nw = yes
                [[[[verbrauch]]]]
                    [[[[[aktuell]]]]]
                        type = num
                        cache = on
                        eval = sh.ehz.wp.nacht() - sh.ehz.wp.nacht.db('max', '1d', sh.zeit.minutenseitmitternacht.dbstr())
                        eval_trigger = ehz.wp.nacht
                    [[[[[gestern]]]]]
                        type = num
                        cache = on
                        sqlite = yes
                        crontab = 0 0 * * = 1
                        eval = sh.ehz.wp.nacht() - sh.ehz.wp.nacht.db('max', '1d', '1d')
                    [[[[[monat]]]]]
                        type = num
                        cache = on
                        sqlite = yes
                        crontab = 0 0 1 * = 1
                        eval = sh.ehz.wp.nacht() - sh.ehz.wp.nacht.db('max', '1m', '1m')
                [[[[kosten]]]]
                    [[[[[heute]]]]]
                        type = num
                        cache = on
                        eval = round((sh.ehz.wp.nacht.verbrauch.aktuell()*0.1929) + (84/2/365),2)
                        eval_trigger = ehz.wp.nacht.verbrauch.aktuell
                    [[[[[gestern]]]]]
                        type = num
                        cache = on
                        sqlite = yes
                        eval = round((sh.ehz.wp.nacht.verbrauch.gestern()*0.1929) + (84/2/365),2)
                        eval_trigger = ehz.wp.nacht.verbrauch.gestern
                    [[[[[monat]]]]]
                        type = num
                        cache = on
                        sqlite = yes
                        eval = round((sh.ehz.wp.nacht.verbrauch.monat()*0.1929) + (84/2/365),2)
                        eval_trigger = ehz.wp.nacht.verbrauch.monat
            [[[gesamt]]]
                type = num
                cache = on
                sqlite = yes
                eval = sh.ehz.wp.tag() + sh.ehz.wp.nacht()
                eval_trigger = ehz.wp.tag | ehz.wp.nacht
                [[[[leistung_aktuell]]]]
                    type = num
                    cache = on
                    knx_dpt = 14
                    knx_listen = 6/7/17
                    knx_init = 6/7/17
                    nw = yes
                [[[[leistung_gestern]]]]
                    type = num
                    visu = yes
                    eval = sh.ehz.wp.gesamt.db('max', '1d', '1d')
                    eval_trigger = ehz.wp.gesamt
                [[[[verbrauch]]]]
                    [[[[[aktuell]]]]]
                        type = num
                        cache = on
                        eval = sh.ehz.wp.gesamt() - sh.ehz.wp.gesamt.db('max', '1d', sh.zeit.minutenseitmitternacht.dbstr())
                        eval_trigger = ehz.wp.gesamt
                    [[[[[gestern]]]]]
                        type = num
                        cache = on
                        sqlite = yes
                        eval = sh.ehz.wp.tag.verbrauch.gestern() + sh.ehz.wp.nacht.verbrauch.gestern()
                        eval_trigger = ehz.wp.tag.verbrauch.gestern | ehz.wp.nacht.verbrauch.gestern
                    [[[[[stuendlich]]]]]
                        type = num
                        cache = on
                        sqlite = yes
                        crontab = 0 * * * = 1
                        eval = sh.ehz.wp.gesamt() - sh.ehz.wp.gesamt.db('max', '1h', '1h')
                    [[[[[monat]]]]]
                        type = num
                        cache = on
                        sqlite = yes
                        crontab = 0 0 1 * = 1
                        eval = sh.ehz.wp.gesamt() - sh.ehz.wp.gesamt.db('max', '1m', '1m')
    Bin leider etwas ratlos. Komisch finde ich nur, dass für Wärmepumpe kein Fehler auftaucht. Da kommt die gleiche Zeile ja auch dreimal vor.

    Einen Kommentar schreiben:


  • martinb07
    antwortet
    stacked charts.png
    So schaut es gerade aus.

    Einen Kommentar schreiben:


  • Shai
    antwortet
    Stimmt, das ist wohl dann n Relikt bei mir gewesen.
    Wie sieht denn Deine Anzeige aus? - Eventuell kann man da raus noch was ableiten.

    Ich hab nur 1 Zähler und hab auch noch etwas an der widget.js verändert, das würde aber bei Dir dafür sorgen das der mittlere Stacked-Chart nicht mehr funktioniert, weil ich den Zeitpunkt aller Datenpunkte für die "daily"-Version auf 0:00:00 Uhr korrigiere anstatt nur die letzten 10 Sekunden glatt zu ziehen.


    Einen Kommentar schreiben:


  • martinb07
    antwortet
    Ich habe gerade festgestellt, dass ich den dev-Zweig bei mir im Einsatz habe. ;-)
    Da gibt es diese Zeile nicht mehr.

    Einen Kommentar schreiben:

Lädt...
X