SmartVisu - Widget status.log für dblog

Begonnen von Sebastiaan, 13 Juni 2016, 04:35:39

Vorheriges Thema - Nächstes Thema

Sebastiaan

Hallo zusammen,

ich brauchte eine Möglichkeit um eintragen aus dem dblog database von fhem innerhalb SV anzuzeigen (z.b. HM Geräten  mit niedrige bat). Da es so ein widget nicht gab (oder ich habs nit gefunden...) habe ich mich selbe mal ein Tag investiert und bin durchaus zum Erfolg gekommen aber nicht 100% nach mein Vorstellungen (bin selbe eigentlich ein embedded C/C++ Experte...php und Javascript ist nicht so mein Ding..).

Was ich aber geschafft habe ist
- eine php Datei dblog.php, welche bestimmte werten (Device, reading) aus den mysql DB liest. Dies ist im Grunde basierend auf den widget_dbplot.php, nur mit $_GET statt $_POST (ist auch das größte Problem...)
- eine HTML, widget.dbblog.html. Nutzt den php Datei und erstellt eine liste, basiert auf den widget_ical.html

Im Grunde funktioniert es auch halbwegs (Zeigt 1 reading für 1 gerät aus dblog an). Screenshot im anhang.

Mein Implementierung zeigt nur ein reading für ein device an. Ich würde gerne mehrere unterschiedliche readings für ein device auflisten (unterschiedliche Farben & Icons). Im Grunde wie den widget_dbplot.php (und .html) womit man eine json struct definieren kann womit jede einzeln reading ein "Icon" und Farbe zugeordned  werde kann, z.b.:


{% set readings=
[
{
'update_trigger_gad': 'fhem.device',
'device': 'fhem.device',
'reading': 'warning',
'config': {
'color': 'orange',
'icon': 'message_attention'
}
},
                                        {
'update_trigger_gad': 'fhem.device',
'device': 'fhem.device',
'reading': 'error',
'config': {
'color': 'red',
'icon': 'message_error.'
}
}
]%}


Ich bin gescheitert and den $_POST wie in Beispiel  widget_dbplot.html genutzt worden ist. Wenn ich ein " $.post(" nutze mit richtige 'postData' dann funktioniert den Richtung Javascript->php korrekt aber ich kann die Ergebnissen aus php nicht in eine html liste darstellen, den Zeile


$('#' + uid + ' ul').html(line).trigger('prepare').listview('refresh').trigger('redraw');


kann ich anscheinend mit ein "$.post(" statt "$.getJSON(" nicht nutzen...

Ich wollte aber einfach mittels php ein json Struktur erstellen und diese dann (wie den calendar widget) in eine liste darstellen. Nicht nur eine reading pro device (wie in mein Beispiel) aber dann mehrere readings für ein device mit unterschiedliche Farben 6 Icons....

Ich brauche ein wenig Hilfe von jemanden der sich mit Javas & php auskennt. Ich denke Mann könnt den bestehende Datei widget_dbplot.php komplett wieder verwenden aber ich weiß nicht wie ich aus den


// Return the array and encode to JSON
echo json_encode($returnArray);


nach eine liste komme wie die ical einträgen beim "widget_ical.html"

Danke,
Bas



bruece-lee

Hallo   Sebastiaan,

ich würde gerne genau das gleiche erreichen wie Du beschreibst.
Bist Du mit dem Thema noch irgendwie weiter gekommen?

VG, Bruece-lee

dev0

Mir erschießt sich nicht der Sinn, warum man Daten aus einer DB liest, wenn die aktuellen Werte als Reading in FHEM (und somit auch in sv) zur Verfügung stehen.

bruece-lee

Ich denke die Idee kommt daher, dass das Widget ursprünglich dafür gedacht war eine Logfile von Smarthome.Py darzustellen.
Ich möchte eigentlich bestimmte Ereignisse von Fhem mit einer am besten selber definierbaren Meldung über das Widget darstellen. Wenn z.B. das HMLAN ausfällt, dann möchte ich eine Logmeldung mit Datum und Uhrzeit erzeugen.

dev0, kannst du mir vielleicht ein Beispiel geben, wie ich Fhem readings mit diesem Widget darstellen kann? Das habe ich bislang noch nicht geschafft.

dev0

Ich würde versuchen die Widgets basic.symbol und basic.text zu benutzen. Der ReadingsTimestamp Converter könnte für Datum/Uhrzeit hilfreich sein.

herrmannj

#5
status.log ist in fronthem nicht implementiert.

Man "könnte" vmtl im driver eine workaround bauen. Evtl noch einen converter dazu klöppeln. Oder das status.log widget adaptieren. Wenn es sich wie ein GAD meldet kann es genauso beschickt werden. Was und wie das dann im widget dargestellt wird liegt in der Hand des Erstellers.

vg
joerg

bruece-lee

ZitatOder das status.log widget adaptieren. Wenn es sich wie ein GAD meldet kann es genauso beschickt werden.

Das klingt nach einer guten Option. Ich habe mir die Fronthem Doku im Wiki durchgelesen und versucht den Quellcode anzuschauen, um heraus zu finden, was dafür zu tun ist. Da ich in Javascript und auch in Perl noch nicht so fit bin, ist mir bislang noch nicht klar geworden wo genau ich ansetzen muss. Kann mir da jemand mit ein paar Sticworten nochmal auf die Sprünge helfen?

Schön wäre es, wenn das status.log widget mittels array an FHEM gebunden werden könnte. In dem Fall könnte man sich in der myUtils eine Funktion schreiben, die Ereignisse zusammenstellt und in das Array hinein schreibt und das Widget würde dieses dann in geeigneter Weise darstellen.

herrmannj

yepp.

javascript und perl wirste brauchen ...  ;)

Den quellcode vom sv widget status log als Vorlage nehmen und so umbauen das es nach GAD fragt. (javascript)
Einen Converter schreiben (perl) oder das widget so aufbauen das vorhandene converter reichen. (denke das sollte gehen)

Das widget sollte die mehrere lines speichern (array). Von fhem bekommst Du dann keine alten Daten (die kämen ja aus einem log) - sondern eben das was ab start aufläuft. converter können selber zwischenspeichern, dann wären die Infos trotz reload (sv) verfügbar. Beispiel RGB converter. Must Du aber entscheiden wie viel Aufwand Du treiben möchtest.

vg
joerg

bruece-lee

Ich rätsel jetzt schon eine ganze Weile, aber mir wird einfach nicht klar, an welcher Stelle die Widgets und die GAD zusammenkommen.... Selbst bei den simplen Elementen wie bei einem Symbol o.ä. verstehe ich noch nicht, wie die Bindung an ein GAD konkret erfolgt.

Für das status.log habe ich folgende Dinge gefunden:

widget.js:


// ----- status.log -----------------------------------------------------------
$(document).delegate('span[data-widget="status.log"]', {
'update': function (event, response) {
var ret;
var line = '';

if (response[0] instanceof Array) {
// only the last entries
var list = response[0].slice(0, $(this).attr('data-count'));

for (var i = 0; i < list.length; i++) {
ret = '<div class="color ' + list[i].level.toLowerCase() + '"></div>';
ret += '<h3>' + new Date(list[i].time).transLong() + '</h3>';
ret += '<p>' + list[i].message + '</p>';
line += '<li data-icon="false">' + ret + '</li>';
}

$('#' + this.id + ' ul').html(line).trigger('prepare').listview('refresh').trigger('redraw');
}
}
});


widget.min.js


$(document).delegate('span[data-widget="status.log"]',{update:function(d,a){var b,c="";if(a[0]instanceof Array){for(var e=a[0].slice(0,$(this).attr("data-count")),f=0;f<e.length;f++)b='<div class="color '+e[f].level.toLowerCase()+'"></div>',b+="<h3>"+(new Date(e[f].time)).transLong()+"</h3>",b+="<p>"+e[f].message+"</p>",c+='<li data-icon="false">'+b+"</li>";$("#"+this.id+" ul").html(c).trigger("prepare").listview("refresh").trigger("redraw")}}});


status.html:


/**
* Displays a list of logging-information
*
* @param unique id for this widget
* @param the name of the log
* @param maximal number of entries (1 - 50)
*/
{% macro log(id, item, count) %}

<span id="{{ uid(page, id) }}" data-widget="status.log" data-item="{{ item }}" data-count="{{ count }}"
class="log">
<ul data-role="listview">
</ul>
</span>

{% endmacro %}


Plus noch ein wenig Code in der base.js und der base.min.js.

Ich denke interessant ist die Widget.js. Hier wird ein Array auseinander genommen und und aufbereitet, damit es später im status.log widget dargestellt werden kann. Kann mir denn jemand noch einen Tipp geben, wie ich die Kopplung mit FHEM über ein GAD herstellen kann? Ich könnte mir z.B. vorstellen eine GAD zu definieren, die mit Konverter Direct übergeben wird. Dies könnte eine Komma-separierte Liste sein mit Zeitstempeln, Kategorien und Texten, die dann im widget.js auseinander genommen wird und für die Darstellung als Liste aufbereitet wird. Aber ich komme nicht darauf, wie ich die Daten an die Funktion in der widget.js von FHEM aus übergeben bekomme.

herrmannj

schau Dir mal den  io_fhem.* driver an.

vg
joerg


raman

Zu status.log hätte ich auch eine Frage. Ich hoffe, dass sie mir jemand beantworten kann.

Wenn man in SV das widget status.log definiert wird, ist das Problem, dass in fronthem kein GAD erzeugt wird.

Ich habe mir dazu den io_fhem-Treiber mal angeschaut. Dort werden ja die GADs gefiltert und in verschiedenen
Listen verwaltet: u.a. die "normalen" GADs (die ganzen basic widgets), die series GADs und die status.log GADs.

Wenn ich in fronthem verbose erhöhe, dann sieht man im fhem-log, dass die Liste mit den status.log GADs
vom  io_fhem-Treiber an  fronthem auch geschickt werden.

Wird die Liste in  fronthem ignoriert oder werden die GADs irgendwie "durchgereicht"?
Wenn das der Fall ist, wie lässt sich das nutzen, evtl. mit einem GAD-Filter oder muss man
weiter unten in fronthem ansetzen?

Gruß
raman