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
Ankündigung
Einklappen
Keine Ankündigung bisher.
eHZ Visu Beispiel mit neuem Widget Stacked Column Bar Chart
Einklappen
X
-
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:
-
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:
-
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(); } } } });
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
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
MirkoZuletzt geändert von Simikuen; 08.01.2018, 16:48.
Einen Kommentar schreiben:
-
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:
-
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:
-
Zitat von martinb07 Beitrag anzeigenAuf 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
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:
-
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:
-
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:
-
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'
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')
Einen Kommentar schreiben:
-
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:
-
Ich habe gerade festgestellt, dass ich den dev-Zweig bei mir im Einsatz habe. ;-)
Da gibt es diese Zeile nicht mehr.
Einen Kommentar schreiben:
Einen Kommentar schreiben: