NEWS
Wert aus Modbus lesen und bei änderung größer als…..auf KNX Objekt senden
-
Es muss anscheinend ein Text mit 14 Zeichen Länge sein ? Dann klappt es vielleicht so:
const idModbusDP = 'modbus.0.inputRegisters.30865_Netz-Bezug'; const idKNXDP = 'knx.0.Visu_Werte.Synohr.Display_Text'; const delta = 10.0; // Mindest-Änderung für KNX-Aktualisierung var lastKNX = getState(idKNXDP).val; on(idModbusDP, function(dp) { if(Math.abs(dp.state.val - lastKNX) >= delta) { lastKNX = dp.state.val; var unit = ' W '; // 10 Zeichen Länge var text; if(lastKNX >= 1000) text = lastKNX.toFixed() + unit; if(lastKNX < 1000) text = '0' + lastKNX.toFixed() + unit; if(lastKNX < 100) text = '00' + lastKNX.toFixed() + unit; if(lastKNX < 10) text = '000' + lastKNX.toFixed() + unit; setState(idKNXDP, text); } });
-
Ein delta von 10 dürfte die Zahl der KNX-Ausgaben kaum verringern, wie das Log zeigt. Besser wäre eine Mittelwertbildung über mehrere Messwerte.
const idModbusDP = 'modbus.0.inputRegisters.30865_Netz-Bezug'; const idKNXDP = 'knx.0.Visu_Werte.Synohr.Display_Text'; const werte = 10; // Anzahl der Messwerte für Mittelwertbildung var cnt = 0; // Zähler var sum = 0; // Summe der Messwerte function knxText(id, text) { var txt = text; for(var i = 0; i < 14 - text.length; i++) { txt = txt + ' '; } setState(id, txt);; } on(idModbusDP, function(dp) { cnt++; sum = sum + dp.state.val; if(cnt >= werte) { var power = sum / cnt; knxText(idKNXDP, power.toFixed() + ' W'); cnt = 0; sum = 0; } });
-
Hmmmm..
ich weiß es ja auch nicht…jetzt sendet das Script garnix mehr, keines der beiden letzten.
07:05:09.208 [info] javascript.0 script.js.Modbus-WR_Werte_an_KNX_senden: registered 1 subscription and 0 schedules
07:05:09.894 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
07:05:10.987 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
07:05:12.065 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
07:05:13.154 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
07:05:14.233 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
Ich vermute fast mal, dass die Formatierungen falsch sind, es wird ja nicht nur am Display falsch angezeigt sondern steht auch in er ETS (PRogrammiersoftware für KNX Systeme) falsch ausgegeben.
Wenn ich jetzt aber in der ETS den Wert Hallo sende, wird der am Display ohne wenn und aber angezeigt. Das sind ja auch keine 14 Zeichen.
Es muss KNX Datenpunkttyp 16.000 Zeichen sein, denke ich, was an der Gruppenadresse an und für sich auch so hinterlegt ist.
Der Modbus Wert in IObroker wird als Zahl ausgegeben
-
Da ich kein KNX habe, kann ich es auch nicht testen.
@alexmosel:19 2017-11-05 15:34:57.277 vom Bus Low 15.15.15 - 0/7/0 Synohr Text 5 Schreiben 16.000 Zeichen (ASCII) 39 38 80 B8 FC 15 8C E6 E9 14 9F B8 F6 1F | 98¸üæé¸ö `
sieht danach aus, dass 14 Zeichen mit dem Inhalt 98¸üæé¸ö übertragen werden, wobei anscheinend die ersten zwei Zeichen den gewandelten Wert (98) enthalten und der Rest irgendwelchen zufälligen Speicherinhalt.Was wird auf dem Display angezeigt, wenn Du den Text Hallo als Wert in den Datenpunkt "knx.0.Visu_Werte.Synohr.Display_Text" per Hand eingibst ?
-
Hallo,
ich weiß nicht wo ich das eingeben soll ??
Was ich probiert hatte über die ETS was an die GA zu senden und da kommt es ganz normal an…
-
ich weiß nicht wo ich das eingeben soll ?? `
Im Reiter "Objekte" in der Zeile des Datenpunktes "knx.0.Visu_Werte.Synohr.Display_Text" rechts in der Spalte "Werte" (Feld anklicken, Text eingeben und Enter). -
Hllo,
gerade mal versucht, wenn ich schreibe Test, dann wird mist angezeigt..
Wenn ich schreibe Das ist ein Test wird Das ist ein Te angezeigt .
Problem ist nur dass das Display dann schon scrollt, eigentlich will ich eine ein Zeilige anzeige ohne Scrollen
da sollte z.b. stehen PV 500 w und das würde in die 1 Zeile passen.
über die ETS kann ich Hallo senden und das wird korrekt übertragen…komisch
-
Wenn ich schreibe Das ist ein Test wird Das ist ein Te angezeigt .
Problem ist nur dass das Display dann schon scrollt, eigentlich will ich eine ein Zeilige anzeige ohne Scrollen `
Das sind 14 Zeichen, die angezeigt werden - aber mit Scrollen. Dann bleibt nur probieren mit verschieden langen Texten:PV 1200 W (9 Zeichen)
Dann den gleichen Text mit verschiedener Anzahl Leerzeichen hinten dran.
Wird irgendwann der Text ohne Scrollen angezeigt ?
-
Hallo, tatsache, immer 14 Zeichen, sonst wird Müll angezeigt…
Wobei ich mich frage ob die ETS auch leerzeichen hinten anhängt...
-
immer 14 Zeichen, sonst wird Müll angezeigt… `
Dann sollten die Skripte funktionieren.
@alexmosel:Wobei ich mich frage ob die ETS auch leerzeichen hinten anhängt… `
-
hallo, die beiden letzten Scripte senden garnix ans knx…
iobroker zeigt irgendwelcxhe warnungen an.
Log
13:01:12.674 [info] javascript.0 Stop script script.js.Modbus-WR_Werte_an_KNX_senden
13:01:12.682 [info] javascript.0 Start javascript script.js.Modbus-WR_Werte_an_KNX_senden
13:01:12.682 [warn] javascript.0 at script.js.Modbus-WR_Werte_an_KNX_senden:5:15
13:01:12.682 [info] javascript.0 script.js.Modbus-WR_Werte_an_KNX_senden: registered 1 subscription and 0 schedules
13:01:13.819 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:01:14.941 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:01:15.089 [info] javascript.0 Stop script script.js.Modbus-WR_Werte_an_KNX_senden
13:01:16.176 [info] javascript.0 Start javascript script.js.Modbus-WR_Werte_an_KNX_senden
13:01:16.177 [warn] javascript.0 at script.js.Modbus-WR_Werte_an_KNX_senden:5:15
13:01:16.177 [info] javascript.0 script.js.Modbus-WR_Werte_an_KNX_senden: registered 1 subscription and 0 schedules
13:01:17.295 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:01:18.386 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:01:19.513 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:01:20.650 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:01:21.832 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:01:22.943 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:01:24.070 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:01:25.225 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:01:26.355 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:01:27.445 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:01:28.590 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:01:29.775 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:01:30.910 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:01:31.998 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:01:33.080 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:01:34.325 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:01:35.447 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:01:36.557 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:01:37.690 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:01:38.844 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:01:39.967 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:01:41.080 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:01:42.215 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:01:43.375 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:01:44.528 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:01:45.663 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:01:46.794 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:01:47.945 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:01:49.087 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:01:50.227 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:01:51.363 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:01:52.505 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:01:53.632 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:01:54.764 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:01:55.892 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:01:57.067 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:01:58.237 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
-
Die Warnungen sagen allerdings nichts aus, ausser dass vor setState() (Zeile 16) gewarnt wird. Warnungen verhindern aber die Ausführung nicht.
Bau mal hinter dem setState() ein:
setState(idKNXDP, text); // zusätzlich für Test log(text + '_'); setTimeout(function() { var x = getState(idKNXDP).val; log(x + x.length); }, 300);
-
` > 13:42:48.281 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:42:48.281 [info] javascript.0 script.js.Modbus-WR_Werte_an_KNX_senden: 0231 W _
13:42:48.582 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:20:18)
13:42:48.582 [error] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:21:19)
13:42:49.472 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:42:49.472 [info] javascript.0 script.js.Modbus-WR_Werte_an_KNX_senden: 0252 W _
13:42:49.773 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:20:18)
13:42:49.773 [error] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:21:19)
13:42:50.577 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:42:50.577 [info] javascript.0 script.js.Modbus-WR_Werte_an_KNX_senden: 0230 W _
13:42:50.879 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:20:18)
13:42:50.879 [error] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:21:19)
13:42:51.752 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:42:51.752 [info] javascript.0 script.js.Modbus-WR_Werte_an_KNX_senden: 0228 W _
13:42:52.053 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:20:18)
13:42:52.053 [error] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:21:19)
13:42:52.874 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7)
13:42:52.874 [info] javascript.0 script.js.Modbus-WR_Werte_an_KNX_senden: 0317 W _
13:42:53.175 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:20:18)
13:42:53.175 [error] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:21:19)
13:42:53.954 [warn] javascript.0 at Object. (script.js.Modbus-WR_Werte_an_KNX_senden:16:7) `
sieht jetzt so aus…wird aber immernoch nix geschrieben
Skript sieht aktuell so aus:
const idModbusDP = 'modbus.0.inputRegisters.30865_Netz-Bezug'; const idKNXDP = 'knx.0.Visu_Werte.Synohr.Display_Text'; const delta = 1.0; // Mindest-Änderung für KNX-Aktualisierung var lastKNX = getState(idKNXDP).val; on(idModbusDP, function(dp) { if(Math.abs(dp.state.val - lastKNX) >= delta) { lastKNX = dp.state.val; var unit = ' W '; // 10 Zeichen Länge var text; if(lastKNX >= 1000) text = lastKNX.toFixed() + unit; if(lastKNX < 1000) text = '0' + lastKNX.toFixed() + unit; if(lastKNX < 100) text = '00' + lastKNX.toFixed() + unit; if(lastKNX < 10) text = '000' + lastKNX.toFixed() + unit; setState(idKNXDP, text); // zusätzlich für Test log(text + '_'); setTimeout(function() { var x = getState(idKNXDP).val; log(x + x.length); }, 300); } });
-
Erste Feststellung: log(text + '_') zeigt, dass der Text verkürzt wird: Es werden nicht mehr als 1 Leerzeichen hintereinander akzeptiert !
Zweite Feststellung: Bei Zugriff auf den Datenpunkt 'knx.0.Visu_Werte.Synohr.Display_Text' wird gewarnt. Das muss eine Ursache haben. Poste bitte mal die Objekteigenschalten (Reiter "Objekte", Beistift rechts, dann Reiter "raw(nur Experten)" copy & paste) in Code-Tags.
-
Hier einmal von Modbus (Quelle)
{ "common": { "name": "", "type": "number", "role": "value", "unit": "W", "def": 0, "read": true, "write": false }, "native": { "regType": "inputRegs", "type": "int32be", "address": 30865, "len": 2, "offset": 0, "factor": 1 }, "acl": { "object": 1638, "owner": "system.user.admin", "ownerGroup": "system.group.administrator", "state": 1638 }, "_id": "modbus.0.inputRegisters.30865_Netz-Bezug", "type": "state" }
und vom KNX Objekt (ZIEL)
{ "_id": "knx.0.Zentralbefehle_u_Visu.Visualisierung.Synohr_Text", "type": "state", "common": { "name": "Synohr Text", "type": "string", "role": "text.string", "min": "", "max": "", "read": false, "write": true }, "native": { "dpt": "DPT16.000", "address": "0/7/0", "addressRefId": "P-057F-0_GA-385", "statusGARefId": "", "actGARefId": "" }, "acl": { "object": 1638, "owner": "system.user.admin", "ownerGroup": "system.group.administrator", "state": 1638 } }
-
Die Ziel-ID stimmt nicht überein ! Ändere im Skript
const idModbusDP = 'modbus.0.inputRegisters.30865_Netz-Bezug'; const idKNXDP = 'knx.0.Zentralbefehle_u_Visu.Visualisierung.Synohr_Text';
und lösche den Testteil wieder (der Datenpunkt ist write-only).
Zur Verkürzung mit mehr als einem Leerzeichen hintereinander: Es wird wohl nicht tatsächlich in Javascript verkürzt, sondern sieht nur im Log so aus, da hier die Darstellung über HTML erfolgt. HTML verkürzt mehrere Leerzeichen hintereinander auf 1 Leerzeichen.
-
Okay, Cool, das läuft wohl Tatsächlich….
Wie kann ich noch was davor schreiben ?
...und leider Scrollt das Display immernoch die ganze Zeit, wenns das nicht tut wäre es perfekt...
-
Wie kann ich noch was davor schreiben ? `
Siehe Aufruf knxText() (nimm besser das Skript mit der Mittelwertbildung).const idModbusDP = 'modbus.0.inputRegisters.30865_Netz-Bezug'; const idKNXDP = 'knx.0.Zentralbefehle_u_Visu.Visualisierung.Synohr_Text'; const werte = 10; // Anzahl der Messwerte für Mittelwertbildung var cnt = 0; // Zähler var sum = 0; // Summe der Messwerte function knxText(id, text) { var txt = text; for(var i = 0; i < 14 - text.length; i++) { txt = txt + ' '; } setState(id, txt);; } on(idModbusDP, function(dp) { cnt++; sum = sum + dp.state.val; if(cnt >= werte) { var power = sum / cnt; knxText(idKNXDP, 'PV ' + power.toFixed() + ' W'); cnt = 0; sum = 0; } });
-
…und leider Scrollt das Display immernoch die ganze Zeit, wenns das nicht tut wäre es perfekt... `
Das widerspricht der Aussage in der Doku. Bei angehängten Leerzeichen dürfte es nicht scrollen, es sei denn, der Text (ohne die Leerzeichen) ist für das Display schon zu lang. -
Super, habe das andere SCript schon genommen , klappt so, ne Idee wie ich das Scrollen noch los werde ?
Wenn ich in der ETS Direkt Hallo sende, bleibt das ohen Scrollen einfach stehen, bis es nen neuen Wert bekommt…so sollte das auch sein