NEWS
Ausgabe von einer Datenbank für E-Mail formatieren
-
Hallo!
Folgendes Problem, ich bekomme nach einer Abfrage aus der Datenbank (DB-Maria) einen String geliefert der wie folgt aussieht ( [{"Scann-Zeit":"2021-01-07 07:18:15.7038","Ort":"Drucker-Convere"},{"Scann-Zeit":"2021-01-07 07:18:51.2020","Ort": ..................... ,"Ort":"Umsetzer"}] ).
Diese Meldung wird dann über E-Mail verschickt. Dieser Bandwurm ist aber nicht praktikabel. Wie kann man so eine Meldung so verschicken das diese so aussieht ( Scann-Zeit Drucker-Convere; Scann-Zeit Drucker Drucker1_Drucker2 ... usw.) Eventuell auch als Tabelle:Scann-Zeit Drucker-Convere
Scann-Zeit Drucker-1_Drucker-2
.
.
.
.
.Bitte um ein paar Tips zum Lösungsansatz!
-
@helios03 Hi, vielleicht hilft dir das hier weiter.
https://forum.iobroker.net/topic/40242/msg-payload-werte-auslesen
3.Post umwandeln von Json String in Java Objekt
und danach als Nachricht so zusammensetzen wie du sie brauchst. -
@helios03 said in Ausgabe von einer Datenbank für E-Mail formatieren:
[{"Scann-Zeit":"2021-01-07 07:18:15.7038","Ort":"Drucker-Convere"},{"Scann-Zeit":"2021-01-07 07:18:51.2020","Ort": ..................... ,"Ort":"Umsetzer"}]
In Anlehnung an das was @frankyboy73 geschrieben hat - hier mal ein paar Möglichkeiten.
Deinen String habe ich mal bis auf den unspezifischen Ort in eine Inject Node gepackt da kannst dann selbst experimentieren:
[ { "Scann-Zeit":"2021-01-07 07:18:15.7038", "Ort":"Drucker-Convere" }, { "Scann-Zeit":"2021-01-07 07:18:51.2020", "Ort":"Umsetzer" } ]
- Mit dem JSON-Parser Node - machst daraus ein Array - das kannst dann über Javascript ggf. schon in eine Tabelle umsetzen
- Über eine Split Node kannst Du das Array in einzelne Nachrichten aufteilen
- Bei Bedarf kannst Du dann die Nachricht auf einzelne Werte mit dem Druckernamen als Topic verwenden, wenn Du willst.
Ich habe lediglich bei der HTML-Dastellung mit dem "-" zur Tabellengenerierung ein Problem - deshalb hab ich in dem JAVA Objekt über eine Change-Node Scann-Zeit in Zeit gewandelt. So sieht man gleich, wie man die Change-Node auch zur Stringmanipulation verwendet.
Zur Ausgabe als Tabelle habe ich dann das Array genommen und eine Template Node verwendet. Wie man das vom Array über den HTML Code in VIS überträgt weiss ich nicht - wobei das Auslesen von Arrays in HTML wahrscheinlich genauso funktioniert und Du das Array nur in einem Datenpunkt zwischenspeichern musst.
Hier mal der Flow:
[ { "id": "206e939b.a2f55c", "type": "inject", "z": "dce8fa20.2e93c8", "name": "", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "[\t {\t \"Scann-Zeit\":\"2021-01-07 07:18:15.7038\",\t \"Ort\":\"Drucker-Convere\"\t },\t {\t \"Scann-Zeit\":\"2021-01-07 07:18:51.2020\",\t \"Ort\":\"Umsetzer\"\t }\t]", "payloadType": "str", "x": 1240, "y": 540, "wires": [ [ "c5a9d3e1.3ab8d" ] ] }, { "id": "d401859a.680918", "type": "debug", "z": "dce8fa20.2e93c8", "name": "Einzel-Objekt", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "payload", "targetType": "msg", "statusVal": "", "statusType": "auto", "x": 1970, "y": 540, "wires": [] }, { "id": "2d09eb38.da9974", "type": "json", "z": "dce8fa20.2e93c8", "name": "", "property": "payload", "action": "", "pretty": false, "x": 1590, "y": 540, "wires": [ [ "28510500.b392cc", "c40cab5d.785dc8" ] ] }, { "id": "28510500.b392cc", "type": "split", "z": "dce8fa20.2e93c8", "name": "", "splt": "\\n", "spltType": "str", "arraySplt": 1, "arraySpltType": "len", "stream": false, "addname": "", "x": 1760, "y": 540, "wires": [ [ "d401859a.680918", "887a951c.d97dc8" ] ] }, { "id": "887a951c.d97dc8", "type": "change", "z": "dce8fa20.2e93c8", "name": "", "rules": [ { "t": "set", "p": "topic", "pt": "msg", "to": "payload.Ort", "tot": "msg" }, { "t": "set", "p": "payload", "pt": "msg", "to": "payload.Zeit", "tot": "msg" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 1950, "y": 600, "wires": [ [ "f890995a.3a2e58" ] ] }, { "id": "f890995a.3a2e58", "type": "debug", "z": "dce8fa20.2e93c8", "name": "Einzelnachrichten", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "payload", "targetType": "msg", "statusVal": "", "statusType": "auto", "x": 2160, "y": 600, "wires": [] }, { "id": "c40cab5d.785dc8", "type": "ui_template", "z": "dce8fa20.2e93c8", "group": "921e7aba.1e8358", "name": "HTML Tabelle", "order": 0, "width": "6", "height": "9", "format": "<style>\n.main\n{\n height:100%;\n width:100%;\n /* background:lightblue; */\n \n}\n\n\n#t01 th {\n \n padding: 5px;\n font-size:120%;\n color: var(--nr-dashboard-groupTextColor);\n /* color:#0eb8c0; */\n}\n#t01 td {\n \n padding: 5px;\n\n}\n \n</style>\n\n<div class=\"main\">\n\n <table id=\"t01\">\n\n \n <tr><th width=150>Scann-Zeit</th><th width=150>Drucker</th></tr>\n <tr ng-repeat=\"(key, y) in msg.payload\">\n <td align=left>{{y.Zeit}}</td><td align=right>{{y.Ort}}</td>\n </tr>\n \n </table>\n\n\n</div>", "storeOutMessages": false, "fwdInMessages": false, "resendOnRefresh": false, "templateScope": "local", "x": 1950, "y": 700, "wires": [ [] ] }, { "id": "c5a9d3e1.3ab8d", "type": "change", "z": "dce8fa20.2e93c8", "name": "Scann-Zeit ==> Zeit", "rules": [ { "t": "change", "p": "payload", "pt": "msg", "from": "Scann-Zeit", "fromt": "str", "to": "Zeit", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 1430, "y": 540, "wires": [ [ "2d09eb38.da9974" ] ] }, { "id": "921e7aba.1e8358", "type": "ui_group", "name": "Tabelle Test", "tab": "dc25fe35.866f", "order": 2, "disp": true, "width": "6", "collapse": false }, { "id": "dc25fe35.866f", "type": "ui_tab", "name": "Test", "icon": "dashboard", "order": 13, "disabled": false, "hidden": false } ]
Hier die grafische Darstellung:
Und hier die Darstellung als HTML Tabelle - hier im NodeRed Dashboard:
Und zum Schluss noch der Code in der Template Node um zu sehen, wie man aus einem Java-Array so eine Tabelle generiert:
<div class="main"> <table id="t01"> <tr><th width=150>Scann-Zeit</th><th width=150>Drucker</th></tr> <tr ng-repeat="(key, y) in msg.payload"> <td align=left>{{y.Zeit}}</td><td align=right>{{y.Ort}}</td> </tr> </table> </div>
Mit dem Bindestrich im Feldnamen Scann-Zeit also "y.Scann-Zeit" bin ich nicht klargekommen - das muss ggf. ein HTML Spezialist sagen, wie man das Sonderzeichen im Feldnamen maskiert.
-
@helios03
Ich habe Deine Anforderung ja nochmal gelesen und Du wolltest das ja als E-Mail haben.
Ich hab mal bisschen rumgespielt - und bin leider guter bzw. gar kein HTML Programmieren, aber ich hab was hinbekommen.Leider hat es - analog zum UI Dashboard die Template Node zu nehmen NICHT funktioniert:
Deshalb hab ich eine function Node gemacht - die den HTML Code erzeugt - aber das können HTML Programmierer sicher viel besser. Die übergibt dann den kompletten HTML Code an eine Mail-Node.
Der Code in der function Node schaut wie folgt aus:
var start= ' <!DOCTYPE html> \ <html xmlns="http://www.w3.org/1999/xhtml"> \ <head> \ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> \ <meta name="viewport" content="width=device-width, initial-scale=1.0"/> \ </head> \ <body style="margin: 0; padding: 0;"> \ <table border="1" cellpadding="0" cellspacing="0" width="100%"> \ <tr><th width=150>Scann-Zeit</th><th width=150>Drucker</th></tr>'; var end= ' </table> \ </body> \ </html>'; var output=""; for (var w of msg.payload) { var zeile = "<tr>" + "\n"; zeile = zeile + "<td>" + w.Zeit + "</td><td>" + w.Ort +"</td>" + "\n"; zeile = zeile + "</tr>"+ "\n"; output=output+zeile; } msg.payload= start + output + end; return msg;
oder im Windows 10 Mail
Den Betreff kannst Du natürlich ändern in dem Du vorher noch eine entsprechende msg.topic setzt.