Bin den Thread grad nochmal durchgegangen und habe einen Verweis auf einen anderen Thread gefunden. Leider ohne Lösung. :,-(
Ankündigung
Einklappen
Keine Ankündigung bisher.
eHZ Visu Beispiel mit neuem Widget Stacked Column Bar Chart
Einklappen
X
-
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.
Kommentar
-
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')
---
Martin
Kommentar
-
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
Kommentar
-
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.---
Martin
Kommentar
-
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.
Kommentar
-
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.
Kommentar
Kommentar