NEWS
Korrekte Liste der Entgangenen Anrufe Mittels Fritzbox-Adapter und einer Skripte-Erweiterung ermitteln
-
Hallo,
Ich möchte mir mit Hilfe des Fritzbox-Adapters die entgangenen Anrufe anzeigen lassen. Problem ist, dass auf der dort generierten "Missed-List" der Fritzbox nur Anrufe angezeigt werden, die auflegen, bevor der Anrufbeantworter eingeht. Legt der Anrufer erst nach Aufsprechen auf den AB auf, dann wird er nicht als "Missed Call" geführt.
Sehr viele Anrufer (ca. 60-70%) rufen an, warten bis der AB rangeht und legen dann auf. Sie werden von der Liste im Fritzbox-Adapter nicht erfasst.
Hier die Frage an Script-Erfahrene. Ich möchte von einem vorhandenen Datenpunkt aus dem Fritzbox-Adapter (fritzbox.0.history.allTableHTML) Werte
in einen neuen Datenpunkt unter javaskript schreiben. Hierbei möchte ich bestimmte Datensätze (=Zeilen) und auch Felder (=Spalten) weglassen.
Der Stil der ausgegebenen Tabelle (html) soll wenn möglich nicht geändert werden, den könnte man in VIS dann weiter verwenden.
1.) wie sieht die Tabelle im Datenpunkt vorher aus?
fritzbox.0.history.allTableHTML
! 23.10. 01:03 015199999xxx ->> 40 209xxxx SIP0 5
! 23.10. 01:00 015199999xxx ->> 40 209xxxx SIP0 2
! 22.10. 21:49 015199999xxx ->> 11 209xxxx SIP0 36
! 22.10. 19:04 078123456xxx <<- 10 209xxxx SIP0 56
! 22.10. 18:37 015199999xxx ->> 10 209xxxx SIP0 42
! 22.10. 18:36 078134567xxx ->> 11 209xxxx SIP0 1:49
! 22.10. 18:23 078134567xxx ->> 40 209xxxx SIP0 3
! 22.10. 18:17 078512345xxx <<- 13 209xxxx SIP0 50
! 22.10. 15:16 078xxxxxxxxx ->> 13 209xxxx SIP0 1:00:12
! 22.10. 10:44 078xxxxxxxxx ->X 209yyyy SIP4 5
! 22.10. 10:44 0175xxxxxxx X<- 13 209xxxx SIP11 3
! 22.10. 10:06 076xxxxxxxx ->X 209xxxx SIP0 -Was soll passieren?
Schritt 1
Löschen:
<<- ausgehend löschen komplette Zeile
X<- ausgehend nicht angenommen löschen komplette Zeile
->> eingehend anngenommen, jedoch nicht die von Nebenstelle 40 (AB) angenommenen - komplette Zeile löschen
stehen bleiben:
->X eingehend, aufgehängt
->> 40 eingehend, AB
! 23.10. 01:03 015199999xxx ->> 40 209xxxx SIP0 5
! 23.10. 01:00 015199999xxx ->> 40 209xxxx SIP0 2
! 22.10. 18:23 07xx34567xxx ->> 40 209xxxx SIP0 3
! 22.10. 10:44 07xxxxxxxxxx ->X 209yyyy SIP4 5
! 22.10. 10:06 076xxxxxxxx ->X 209xxxx SIP0 -danach (oder auch im Schritt 1) löschen:
Spalte Nebenstelle
Spalte Angerufene Nr
Spalte Ausgehende Nr (Hier: SIPX) Spalte Zeit
Ergebnis in neuem Datenpunkt javascript.0.ErfolgloseAnrufe unter
! 23.10. 01:03 015199999xxx ->>
! 23.10. 01:00 015199999xxx ->>
! 22.10. 18:23 078134567xxx ->>
! 22.10. 10:44 078xxxxxxxxx ->X
! 22.10. 10:06 076xxxxxxxx ->XEinen Lösungsansatz würde folgendes Skript bieten: http://forum.iobroker.net/viewtopic.php … 086#p37086
createState('ErfolgloseAnrufe', ''); on({id: 'fritzbox.0.history.allTableHTML'}, function (obj) { var s=getState('fritzbox.0.history.allTableHTML').val; //hier müsste nun die Funktion zur Löschung der Zeilen mit ausgehenden bzw. eingehenden angenommenen (ohne 40 (=AB) rein. //s=replaceAll(s,'%0A',' '); //so stand das im "Ersetzungsskript", trifft hier aber nicht zu setState('javascript.0.ErfolgloseAnrufe',s); }); function replaceAll(string, token, newtoken) { if(token!=newtoken) while(string.indexOf(token) > -1) { string = string.replace(token, newtoken); } return string; }
ich probiere schon einige Zeit herum, bin aber kein Experte, mit Javascript und auch Blockly bin ich noch ganz am Anfang. Kann hier jemand die notwendigen Funktionen einfügen und mir auf die Sprünge helfen?
Herzlichen Dank vorab!
-
moin…
hast hier schon mal geschaut?
http://forum.iobroker.net/viewtopic.php … =40#p25741
vielleicht hilft dir das weiter…
-
Diesen Thread kenne ich. Leider steht dort nur, dass es wohl ginge.
Eine konkrete Lösungsmöglichkeit noch nicht.
In diesem Thread versuche ich zumindest einen Lösungsansatz…
Hier ist wohl jemand, der mir beim javascript hilft, gefragt.
-
Hallo,
Ich möchte mir mit Hilfe des Fritzbox-Adapters die entgangenen Anrufe anzeigen lassen. Problem ist, dass auf der dort generierten "Missed-List" der Fritzbox nur Anrufe angezeigt werden, die auflegen, bevor der Anrufbeantworter eingeht. Legt der Anrufer erst nach Aufsprechen auf den AB auf, dann wird er nicht als "Missed Call" geführt.
Sehr viele Anrufer (ca. 60-70%) rufen an, warten bis der AB rangeht und legen dann auf. Sie werden von der Liste im Fritzbox-Adapter nicht erfasst. `
Der Adapter arbeitet schon richtig. Ein vom AB angenommener Anruf ist erst einmal ein angenommener Anruf.
Mit den Gebührendaten (CDRs) der Fritzbox kann man nicht unterscheiden, ob jemand drauf gesprochen oder in der Ansage aufgelegt hat.
Das Skript macht, was Du willst, allerdings nciht als HTML-Tabelle, sondern als JSON:
`createState('ErfolgloseAnrufe', ''); function listeBereinigen(jsonAll){ for (var i = 0; i < jsonAll.length; i++) { if(jsonAll[i].callSymbolColor != '** ->X**') { if(jsonAll[i].extensionLine != "40") { delete jsonAll[i]; log("del: " + i); } } } return JSON.stringify(jsonAll); } on({id: 'fritzbox.0.history.allTableJSON'}, function (obj) { var ergebnis = listeBereinigen(JSON.parse(obj.state.val)); setState('javascript." + instance + ".ErfolgloseAnrufe',ergebnis); });` Als Widget kannst Du dann das JSON-Widget nehmen: >! ~~[spoiler]~~`~~[code]~~[{"tpl":"tplTableBody","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","static_value":"[{\"Title\": \"first\", \"Value\": 1, \"_Description\": \"Value1\"}, {\"Title\": \"second\", \"Value\": 2, \"_Description\": \"Value2\"}]","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"colCount":"7","table_oid":"javascript.0.ErfolgloseAnrufe","g_header_§0":true,"colWidth1":"20%","colAttr1":"","colWidth2":"20%","colAttr2":"","colName3":"Ri","colWidth3":"5%","colName4":"Nbst","colWidth4":"5%","colName7":"Dauer","colAttr6":"","colWidth6":"8%","colName6":"Ltg.","colWidth7":"15%"},"style":{"left":"60px","top":"360px","width":"914px","height":"250px"},"widgetSet":"basic"}][/code]`[/spoiler][/i][/i][/i]
-
Hallo Ruhr70,
vielen Dank.
Ich probier's aus.
Was vermutlich bei JSON dann nicht mehr geht, ist, dass ich noch den VCARD-Adapter mit dem gespeicheren Fritz-Telefonbuch (ca 120 Nummern) drüber laufen lassen kann.
So habe ich bisher die Namensauflösung einwandfrei hinbekommen.
-
pote mal bitte das dazugehörige Skript
-
Ein Skript gibt es da nicht, da ich lediglich im vcard-Adapter den Datenpunkt in Deinem Fritzbox-Adapter-Datenpunkt für die "MissedTableHTML" angeben musste.
Dann hat das bisher wunderbar funktioniert, nur eben bei den "echten" missed calls.
Im Vis habe ich bisher dann den entsprechenden Datenpunkt im VCARD-Adapter angezeigt.
D.h. jetzt hätte ich eben den Datenpunkt unter dem javascript angesprochen. Das Teste ich nun.
-
Hallo,
siehe LOG, Dein script funktioniert nicht. Der Datenpunkt "Entgangene Anrufe" existiert, aber leer.
Auszug aus dem LOG
javascript-0 2016-10-23 18:10:03.652 warn State "javascript." + instance + ".ErfolgloseAnrufe" not found
javascript-0 2016-10-23 18:10:03.651 info script.js.Diverses.EntgangeneAnrufe1: del: 11
javascript-0 2016-10-23 18:10:03.650 info script.js.Diverses.EntgangeneAnrufe1: del: 10
javascript-0 2016-10-23 18:10:03.650 info script.js.Diverses.EntgangeneAnrufe1: del: 9
javascript-0 2016-10-23 18:10:03.650 info script.js.Diverses.EntgangeneAnrufe1: del: 8
javascript-0 2016-10-23 18:10:03.650 info script.js.Diverses.EntgangeneAnrufe1: del: 7
javascript-0 2016-10-23 18:10:03.649 info script.js.Diverses.EntgangeneAnrufe1: del: 6
javascript-0 2016-10-23 18:10:03.649 info script.js.Diverses.EntgangeneAnrufe1: del: 5
javascript-0 2016-10-23 18:10:03.649 info script.js.Diverses.EntgangeneAnrufe1: del: 4
javascript-0 2016-10-23 18:10:03.648 info script.js.Diverses.EntgangeneAnrufe1: del: 3
javascript-0 2016-10-23 18:10:03.648 info script.js.Diverses.EntgangeneAnrufe1: del: 2
javascript-0 2016-10-23 18:10:03.648 info script.js.Diverses.EntgangeneAnrufe1: del: 1
javascript-0 2016-10-23 18:10:03.647 info script.js.Diverses.EntgangeneAnrufe1: del: 0
fritzbox-0 2016-10-23 18:10:02.617 info data from 192.168.169.1: 23.10.16 18:10:02;DISCONNECT;0;0;
ich habe hier diverse Anrufe in der Fritzbox-Adapter-Liste, die werden alle rausgelöscht, obwohl zB ein AB-Anruf und auch ein normaler Missed-Call ausgelöst war.
Auch wird der Inhalt des Datenpunkts bei nochmaligem Anruf nicht erneuert…
Irgendwas stimmt im Script noch nicht....
-
-
Ich schau mal.
-
Hallo,
javascript-0 2016-10-23 18:10:03.652 warn State "javascript." + instance + ".ErfolgloseAnrufe" not found
Irgendwas stimmt im Script noch nicht…. `
Die Zeile:
setState('javascript." + instance + ".ErfolgloseAnrufe',ergebnis);
muss gegen diese getauscht werden:
setState('javascript.' + instance + '.ErfolgloseAnrufe',ergebnis);
Ich hatte in Javascript Instanz 2 getestet. Um es für alle Instanzen gültig zu haben, hatte ich die 2 gegen "+ instance +" ersetzt.
Der String beginnt aber mit Hochkomma statt mit Gänsefüßchen.
An der Logzeile, die ich oben stehen lassen ahbe, sieht man das schon.
-
ich habe hier diverse Anrufe in der Fritzbox-Adapter-Liste, die werden alle rausgelöscht, obwohl zB ein AB-Anruf und auch ein normaler Missed-Call ausgelöst war.
Auch wird der Inhalt des Datenpunkts bei nochmaligem Anruf nicht erneuert…
Irgendwas stimmt im Script noch nicht.... `
Nach der Beschreibung wird das Skript auch mit korrigierten Gänsefüßchen nicht funktionieren.
Als ob bei Dir im JSON der rote Pfeil anders beschrieben wäre:
' **->X**'
-
es läuft jetzt was:
Das ist der Inhalt vom neuen Datenpunkt:
[null,null,{"date":"23.10.16 18:26:21","externalNumber":"01xxxxxxxxxx","callSymbolColor":" ->>","extensionLine":"40","ownNumber":"2096110","lineType":"SIP0","durationForm":" 5"},null,null,null,null,null,null,null,null,null]
aber der nicht auf den AB gelandeten Anruf wird nicht angezeigt…
jetzt mal die Fritzadapter-json:
[{"date":"23.10.16 19:27:10","externalNumber":"xxxxxxxxx","callSymbolColor":" ->X","extensionLine":"","ownNumber":"yyyyy","lineType":"SIP2","durationForm":" -"},{"date":"23.10.16 18:34:21","externalNumber":"xxxxxxxx","callSymbolColor":" ->X","extensionLine":"","ownNumber":"yyyy","lineType":"SIP0","durationForm":" -"},{"date":"23.10.16 18:26:21","externalNumber":"xxxxxxx","callSymbolColor":" ->>","extensionLine":"40","ownNumber":"yyyyy","lineType":"SIP0","durationForm":" 5"},{"date":"23.10.16 18:10:02","externalNumber":"xxxxxxx","callSymbolColor":" ->X","extensionLine":"","ownNumber":"yyyyyy","lineType":"SIP3","durationForm":" -"},{"date":"23.10.16 15:00:53","externalNumber":"xxxxxxx","callSymbolColor":"<<- ","extensionLine":"13","ownNumber":"yyyyyyy","lineType":"SIP0","durationForm":" 22:26"},{"date":"23.10.16 14:38:15","externalNumber":"xxxxxxx","callSymbolColor":"<<- ","extensionLine":"13","ownNumber":"yyyyyyyy","lineType":"SIP0","durationForm":" 20"},{"date":"23.10.16 14:36:57","externalNumber":"xxxxxx","callSymbolColor":"<<- ","extensionLine":"13","ownNumber":"yyyyyyy","lineType":"SIP0","durationForm":" 18:35"},{"date":"23.10.16 14:18:12","externalNumber":"xxxxxxx","callSymbolColor":"<<- ","extensionLine":"13","ownNumber":"yyyyyyyy","lineType":"SIP0","durationForm":" 9:40"},{"date":"23.10.16 14:08:13","externalNumber":"xxxxxxxxxx","callSymbolColor":"<<- ","extensionLine":"13","ownNumber":"yyyyyyyyy","lineType":"SIP0","durationForm":" 14"},{"date":"23.10.16 14:07:52","externalNumber":"xxxxxxxxxx","callSymbolColor":" ->>","extensionLine":"13","ownNumber":"yyyyyyyy","lineType":"SIP0","durationForm":" 16:49"},{"date":"23.10.16 13:24:06","externalNumber":"xxxxxxxxxx","callSymbolColor":"<<- ","extensionLine":"15","ownNumber":"yyyyyyyy","lineType":"SIP0","durationForm":"2:33:10"},{"date":"23.10.16 08:53:55","externalNumber":"xxxxxxxx","callSymbolColor":" ->X","extensionLine":"","ownNumber":"yyyyyyyy","lineType":"SIP4","durationForm":" 13"}]
-
@Semenchkare:`Sieht der JSON String vom Fritzbox Adapter wirklich so aus? D.h. mit den Backslashs im String ()?
Zum schnellen Test mal die Zeile:
`if(jsonAll[i].callSymbolColor != ' **->X**') {` gegen: `~~[code]~~ if(jsonAll[i].callSymbolColor != ' **->X**') {` tauschen. Alternativ (wahrscheinlich beste Variante. Bei mir getestet und OK): `~~[code]~~ if(jsonAll[i].callSymbolColor.indexOf("->X") == -1) {`[/i][/code][/i][/code][/i]
-
Funktioniert jetzt mit der "besten Variante"!
nun lass ich noch den vcard-Apdapter drüberlaufen und kümmer mich danach um das widget, an dem ich wohl noch Anpassungen vornehmen muss…
-
Eine Variante, bei der man komplett flexibel ist und nicht schon aufgebaute Listen wieder auseinandernehmen muss, ist der Datenpunkt:
fritzbox.0.cdr.missedJSON
Dort findet man alle Infos am Ende eines Gesprächs als JSON, inkl. der Vorbereitung von TXT und HTML Ausgaben.
Vom Prinzip würde das so funktionieren:
-
Logik, ob das Gespräch relevant ist (verpasst und Gespräche zum AB)
-
Zusammenbau des HTML aus den mitgelieferten Daten
-
eigene Ereignisliste in beliebiger Länge
-
-
hallo,
ich mach mal oben weiter, habe den json jetzt geändert d.h. mit vcard die Namen eingebaut und muss jetzt das widget anpassen…
Das mit dem CDRMisseJSON zeigt aber wieder nur die "missed" calls an wenn dann müsste man die "CDR.All" nehmen.
-
ich mach mal oben weiter, habe den json jetzt geändert d.h. mit vcard die Namen eingebaut und muss jetzt das widget anpassen… `
Hat es funktioniert?
Das mit dem CDRMisseJSON zeigt aber wieder nur die "missed" calls an wenn dann müsste man die "CDR.All" nehmen. `
Ups… stimmt.
der richtige Datenpunkt wäre: fritzbox.0.cdr.json
-
Hallo Ruhr 70,
Du bist der Hammer!
Ja, es hat funktioniert! Ich habe den von Dir "erschaffenen" Datenpunkt durch den VCD-Adapter laufen lassen, siehe da, der dortige Datenpunkt entspricht Deinem, hat aber die Telefonnummern ersetzt durch Namen! Super!
Ich habe dann das Widget importiert - und soweit möglich - geändert. D.h. nicht benötigte Spalten via "Eigenschaften" rausgenommen und -WICHTIG- den Datenpunkt auf den VCD Datenpunkt geändert.
[{"tpl":"tplTableBody","data":{"g_fixed":true,"g_visibility":false,"g_css_font_text":true,"g_css_background":true,"g_css_shadow_padding":false,"g_css_border":true,"g_gestures":false,"g_signals":false,"static_value":"[{\"Title\": \"first\", \"Value\": 1, \"_Description\": \"Value1\"}, {\"Title\": \"second\", \"Value\": 2, \"_Description\": \"Value2\"}]","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"colCount":"3","table_oid":"vcard.0.Outputs.ReplacedPhoneNumbersCh5","g_header_§0":true,"colWidth2":"22%","colAttr2":"","colName3":" ","colWidth3":"5%","colName4":"Nbst","colWidth4":"5%","colName7":"Dauer","colAttr6":"","colWidth6":"8%","colName6":"Ltg.","colWidth7":"15%","colName2":" ","colName1":" ","hide_header":true,"colWidth1":"20%","views":null,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide"},"style":{"left":"278px","top":"651px","width":"269px","height":"160px","color":"#ffffff","background-color":"","font-family":"Arial, Helvetica, sans-serif","z-index":"1","font-size":"small"},"widgetSet":"basic"}]
Heraus kommt -bis jetzt- folgendes Bild:
~~http://www.joe-lion.de/old/korrekte-Liste.JPG" />
Was ich momentan nicht "hinbekomme":
- Zeitanzeige ohne Sekunden (Platzbedarf) kann man da im funktionierenden Script ändern, damit die Zeit im Datenpunkt ohne Sekunden ankommt??
`createState('ErfolgloseAnrufe', ''); function listeBereinigen(jsonAll){ for (var i = 0; i < jsonAll.length; i++) { if(jsonAll[i].callSymbolColor.indexOf("->X") == -1) { if(jsonAll[i].extensionLine != "40") { delete jsonAll[i]; log("del: " + i); } } } return JSON.stringify(jsonAll); } on({id: 'fritzbox.0.history.allTableJSON'}, function (obj) { var ergebnis = listeBereinigen(JSON.parse(obj.state.val)); setState('javascript.' + instance + '.ErfolgloseAnrufe',ergebnis); });` 2\. Ich kann den Zellenhintergrund (hellgrau/dunkelgrau) in VIS nicht in "durchsichtig" verändern. Wo kann ich das tun? (wäre viel universeller, wenn es durchsichtig anstatt hellgrau-dunkelgrau wäre) 3\. Ich kann die Schriftfarbe nicht in "weiß" ändern..., zumindest nicht in den "VIS-Eigenschaften" Wenn ich da was ändere, bewirke ich "nichts". Kommt da Änderung bereits mit dem Code vom Datenpunkt rüber? hast Du hierfür noch "Abhilfen" Untertänigsten Dank![/i][/i][/i] ```~~
-
Ich würde noch die Spalte Gesprächsdauer mit reinnehmen. Dann siehst Du in der Liste, ob jemand draufgesprochen hat (Anruf länger als x Sekunden) oder bei der Ansage aufgelegt hat.
Die Gespräche, bei denen eine Nachricht hinterlassen wurde (Anzahl Sekunden nach Ansagedauer) könnte man jetzt auch wieder aus Deiner Liste rausfiltern.
- Zeitanzeige ohne Sekunden (Platzbedarf) kann man da im funktionierenden Script ändern, damit die Zeit im Datenpunkt ohne Sekunden ankommt?? `
Ich habe noch eine Funktion eingebaut, in der Du Dir das Datum und die Zeit kürzen kannst, wie Du willst.
Im Beispiel habe ich die Jahreszahl und die Sekunden rausgenommen.
! ```
createState('ErfolgloseAnrufe', ''); ! function kuerzeDatum(str) { var datumStr = str.substr(0,5); // Datum kürzen var zeitStr = str.substr(9,5); // Zeit kürzen return datumStr + " / " + zeitStr; } ! function listeBereinigen(jsonAll){ for (var i = 0; i < jsonAll.length; i++) { jsonAll[i].date = kuerzeDatum(jsonAll[i].date); // Datum und Zeit kürzen if(jsonAll[i].callSymbolColor.indexOf("->X") == -1) { if(jsonAll[i].extensionLine != "40") { delete jsonAll[i]; log("del: " + i); } } } return JSON.stringify(jsonAll); } ! on({id: 'fritzbox.0.history.allTableJSON'}, function (obj) { var ergebnis = listeBereinigen(JSON.parse(obj.state.val)); setState('javascript.' + instance + '.ErfolgloseAnrufe',ergebnis); });
![quote]
! 2. Ich kann den Zellenhintergrund (hellgrau/dunkelgrau) in VIS nicht in "durchsichtig" verändern. Wo kann ich das tun? (wäre viel universeller, wenn es durchsichtig anstatt hellgrau-dunkelgrau wäre)
! 3. Ich kann die Schriftfarbe nicht in "weiß" ändern..., zumindest nicht in den "VIS-Eigenschaften" Wenn ich da was ändere, bewirke ich "nichts". Kommt da Änderung bereits mit dem Code vom Datenpunkt rüber?
! Hier müssen die Widgets/CSS Experten ran.
! Stell die Frage am besten im Forum unter VIS/Widgets.
! Was jetzt sonst noch machbar wäre, das Skript oben so umbauen, dass dann statt dem JSON wieder eine HTML Tabelle erzeugt wird.[/i][/i][/i][/i][/i]