Wenn dies dein erster Besuch hier ist, lies bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Du musst dich vermutlich registrieren, bevor du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um den Registrierungsprozess zu starten. Du kannst auch jetzt schon Beiträge lesen. Suche dir einfach das Forum aus, das dich am meisten interessiert.
Ankündigung
Einklappen
Keine Ankündigung bisher.
eHZ Visu Beispiel mit neuem Widget Stacked Column Bar Chart
Ich bin auch auf develop, aber momentan ist abends nicht mehr als ne halbe Stunde drin um mal auf den Code zu schauen
Von *.js und *.html verstehe ich aber so richtig wenig .
Hm, okay ich bin auf dem Master Stand. - Dann haben wir vermutlich 2 verschiedene Probleme mit ähnlichen Auswirkungen ;-)
Ich probiere heute Abend auch noch mal rum, was mich wundert ist das das "update" Event nicht ausgelöst wird, ggfs. versuch ich da mal was zu Debuggen.
Wenn Du auf Develop bist, dann könnte es noch daran liegen: (Wobei das eigentlich keine Auswirkungen haben solle, da es ja ein anderes Widget und entsprechend anderes JavaScript ist) https://knx-user-forum.de/452332-post19.html
Ich habe ausserdem die Änderung von "Zoomable Plot" bzgl der zu übertragenden Count Variablen eingebaut (- √ - Neues Widget: zoomable Plot)
ohne es jetzt getestet so haben: es zieht so aus, als arbeite hhhc mit Alex's count patch. Entsprechen muss und wird im Widget tmax='now' gesetzt. Das Problem ist wenn man ohne den Patch arbeitet, darf tmax nicht gesetzt werden. Dann muss die Widgetzeile wie folgt aussehen:
Meine Vermutung und der Hinweis von Jan waren richtig, es lag an "now".
Mit folgendem Widget-Code werden bei mir Plots rausgerendert:
HTML-Code:
/**
* A simple widget for plotting stacked 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 label/s for each series (optional)
* @param stacklabel if the aggregated values should be shown, true/false (optional, default true)
* @param color/s for each series e. g. '#f00' for red (optional, default: sutiable for design)
* @param type/s for each series (exposure): 'line', 'stair', 'spline', 'area', 'areaspline', 'column' (optional, default 'line')
* @param count number of data points to load, default 100
* @param correctdate whether to delete last data point (if stats from previous
*
* @see misc/fundamentals#Array-Form
* @see misc/fundamentals#Duration-Format
*/
{% macro stacked(id, gad, mode, tmin, tmax, ymin, ymax, label, stacklabels, color, exposure, count, correctdate) %}
<div id="{{ uid(page, id) }}" data-widget="plot.stacked" data-item="{{ implode(gad, [mode|default('avg'), tmin|default('1h'), tmax|default('now')]) }}"
{% 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>
{% endmacro %}
Aktuell sieht das bei mir noch ein wenig krude aus, was ich vorerst mal darauf schiebe dass mein Sensor erst seit Sonntag läuft und mir daher Vergangenheitswerte fehlen, ich werde das mal beobachten.
Wenn es nicht besser wird, dann liegt es vielleicht an dem "count" Patch den ich nicht eingespielt habe oder an meinem "Master" Stand.
@JuMi2006
Ggfs kannst Du ja mal berichten wie das mit dem Widget bei Dir aussieht.
Ich stell mich zu dämlich an ... hier kommt nix raus, wie sieht denn dein widget in der html aus ?
Ich sehe mittlerweile auch nicht mehr bei dem count-patch durch, hier ist nur querlesen angesagt.
Zeit für ein ordentliches Repo in dem die Erfahrungen/Änderungen der letzten 2 Jahre mal gesammelt werden.
Ich habe den Code von oben in meine "widgets/plot.html" eingefügt. Das ist die Abwandlung von dem Widget was hhhc gepostet hat, die ohne Patch auskommt.
Das JavaScript ist unverändert zu dem von hhhc. Ebenso sind die Items.conf unverändert. Die Logik für die Zeit Items habe ich aus dem Beitrag auf den am Anfang vom Thread ebenfalls verwiesen wird.
Lange Rede kurzer Sinn:
Ich habe alles unverändert gelassen und bin der Anleitung von hccc gefolgt. Nur die "plot.html" habe ich angepasst. (und für meinen Fall die Wärmepumpe rausgeworfen, da ich nur 1 Zähler bzw. 1 Schnittstelle habe)
hab gesehen, dass hier wohl noch einige Probleme sind. Bin zur Zeit in Kiew unterwegs und hab nicht so viel Zeit.
Wie weiter oben geschrieben nutze ich DEV Zweig sowie den count patch. Da hatte ich ja auch bereits das Problem vermutet.
Ich hab im JS Code auch ein wenig dokumentiert aber bin halt kein JS Entwickler sondern google mir das immer nur zusammen.
Ggf gibt es ja ein paar Möglichkeiten den Code sauberer und für mehrere Versionen zu erstellen...
Freut mich aber, dass das Bsp so sein Interesse findet. Denke, dass wir Eure Visus auch zum laufen kriegen 😄
++ Der ultimative ETS 6 Schnellkurs ++ KNX und die ETS vom Profi lernen www.ets-schnellkurs.de
// ----- 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');
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();
}
}
}
});
4b) php make.php
5)smartvisu/widgets/plot.html
Code:
/**
* A simple widget for plotting stacked 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 label/s for each series (optional)
* @param stacklabel if the aggregated values should be shown, true/false (optional, default true)
* @param color/s for each series e. g. '#f00' for red (optional, default: sutiable for design)
* @param type/s for each series (exposure): 'line', 'stair', 'spline', 'area', 'areaspline', 'column' (optional, default 'line')
* @param count number of data points to load, default 100
* @param correctdate whether to delete last data point (if stats from previous
*
* @see misc/fundamentals#Array-Form
* @see misc/fundamentals#Duration-Format
*/
{% macro stacked(id, gad, mode, tmin, tmax, ymin, ymax, label, stacklabels, color, exposure, count, correctdate) %}
<div id="{{ uid(page, id) }}" data-widget="plot.stacked" data-item="{{ implode(gad, [mode|default('avg'), tmin|default('1h'), tmax|default('now')]) }}"
{% 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>
{% endmacro %}
Das Diagramm wird nicht angezeigt. Von sh.py bekomme ich aber die Daten:
Das hat bei mir zu nem Plot geführt, aber leider stacked dieser nicht so schön wie im 1. Post, sondern zeigt mir mehrere Balken pro Tag an.
Das war bei mir anfangs auch so. Hintergrund ist, dass die Zeitwerte nicht gleich sind, so dass Highcharts nicht weiss, wie es die Werte gruppieren (stapeln) soll. Aus diesem Grund hatte ich die 2. Korrektur im Code gemacht
Code:
// 2) timestamp is in milliseconds, harmonize last 3 figures to 000
var newTimestamp = timestamp.toString().substring(0, 9).concat('0000');
Da das Millisekunden sind ist die Genauigkeit somit auf 10 Sekunden reduziert. Sollte das nicht reichen, einfach mal mit 5 Nullen probieren (=100 Sekunden), bei Tageswerten sicher kein Problem.
Ohne ausprobiert zu haben sähe das dann wie folgt aus:
Code:
var newTimestamp = timestamp.toString().substring(0, 8).concat('00000');
++ Der ultimative ETS 6 Schnellkurs ++ KNX und die ETS vom Profi lernen www.ets-schnellkurs.de
Kann mir jemand sagen, ob / wie ich ein 2. Smarthome.py parallel zum PROD als DEV environment laufen lassen kann? Kann ich den Port ändern? Da ich in meinem Haus auf dem DEV-Zweig bin könnte ich somit auf dem Master arbeiten und Euch ein wenig konkreter helfen...
++ Der ultimative ETS 6 Schnellkurs ++ KNX und die ETS vom Profi lernen www.ets-schnellkurs.de
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Kommentar