@negalein Tennisball von der Decke baumeln lassen. Berührt dieser die Scheibe, steht das Auto passend.
NEWS
Best posts made by peterfido
-
RE: Anzeige ob Auto passend steht
-
RE: VIS -> keine gültige Lizenz gefunden
Ich hatte zwar keine Probleme beim Serverausfall, hätte diese allerdings bekommen können. Daher habe ich nun auch den Gegenwert eines Freitags-Dönermann-Besuchs investiert und die offline Lizenz erworben.
Eine Karenzzeit von wenigen Tagen würde der kostenlosen Lizenz nicht schaden. Steam z.b. lässt einen auch kostenlos ein paar Tage offline spielen. Der Telekom Receiver fährt offline allerdings nicht hoch, so dass auch nichts aufgenommenes gesehen werden kann. So war es zumindest "damals", als ich noch Entertain-Kunde war. Möglich, dass die Telekom da nachgebessert hat.
Über KNX habe ich mich, als es relativ neu war, erkundigt. Was die da an Lizenzgebühren verlangt hatten, war schon nicht ohne. Wenn diese Lizenz auch benötigt wird, um an dem Adapter zu arbeiten, ist ein Preis gerechtfertigt. Obwohl ich es nicht nutze, halte ich auch da ein paar Tage Karenzzeit für vorteilhaft. 4 oder 5 Tage, um z.B. von Karfreitag bis Ostermontag überbrücken zu können, halte ich, auch für VIS, für angemessen und @Bluefox könnte im Fall der Fälle entspannt Oster-frei haben.
-
RE: Multicast / SMA-EM / USG / Netztrennung
Für Multicast über alle Netzwerke habe ich unter Dienste den MDNS aktiviert. Alle Netzwerke, die irgendwie übergreifend sein müssen, z.B. zum Drucken, pihole, Mediaserver, etc., sind als Unternehmen eingerichtet. Getrennt werden die dann durch Firewall-Regeln. Exposed Host habe ich nicht genutzt. Das Doppel-NAT stört nicht. Im Gegenteil sehe ich das als weitere Hürde, falls die Fritzbox oder das USG mal eine Sicherheitslücke haben sollten.
Dann die Firewall-Regeln hauptsächlich in LAN IN ergänzt. Also welches Netzwerk darf auf welches Netzwerk, oder auch nur Einzelgerät, zugreifen. Dann habe ich noch die IP-Adresse der Fritzbox selbst für die meisten Netzwerke gesperrt.
In LAN OUT ist nur die Regel für die Geräte mit Internetverbot ergänzt.
In WAN IN nur zusätzlich die eine Regel für die SIP-Telefonie. Dafür braucht es in der Fritzbox auch noch eine Route. Die Portweiterleitungen für das VPN sind auch in der Fritzbox einzutragen.
Trunk ist der Kofferraum, wo alles drin ist. Also Management LAN ohne TAG, alle anderen Netzwerke getaggt. Da nicht alle Geräte mit getaggten VLANs klar kommen, werden diese an den Ports wieder "enttaggt". Für die Endgeräte ist das dann wie ein "normales" Netzwerk. Die PVID setzt man dann, um den Daten vom Endgerät in den Trunk wieder ein TAG zu verpassen. Die ist also normal gleich der VLAN -ID. Bei Unifi nicht nötig, bei den von mir auch eingesetzten managebaren Zyxel-Switchen schon.
Proxmox kann mit den Tags umgehen. Das heißt, der NUC hängt an einem Trunk-Port. Proxmox selbst läuft dann im Management LAN, die virtuellen Maschinen dann auf den VLANs, die man bei den Netzwerkkarten konfiguriert.
-
RE: Strommessung Backofen 3-Pasen (Starkstrom), MQTT
@martinp Die Teile sehen aber abenteuerlich aus. Die Trennung / Isolierung lässt sich auf der Platine nicht erkennen. Die Abstände sind mir zu klein und gefräst ist da auch nichts. Da hätte ich Angst um die Geräte, welche am TTL Port sitzen und den Taster würde ich auch nicht mit blossem Finger drücken wollen.
Ein fertiger Zähler von z.B. Eastron , Orno oder B + G E Tech mit Modbus bietet in einem berührungssicherem Gehäuse normal Spannung, Strom, Scheinleistung, Wirkleistung, Zählerstand, Frequenz.
-
Modbus als Slave
Hallo,
anbei ein Beispiel, wie der Modbus Adapter als Slave genutzt werden kann.
Als Gegenpart habe ich Node-Red (node-red-contrib-modbus) auf dem selben ioBroker auf meinem Testsystem genutzt.Die Einstellungen vom Modbus-Adapter sind wie folgt:
Ein Javascript unterstützt mit einer Uhr und kopieren der empfangen Werte in die Ausgangsregister. Die Uhr muss von Hand aktualisiert werden, damit die nicht in die Tests reingrätscht.
//Modbus Test createState('0_userdata.0.Modbus.Uhrakt', { type: 'boolean', def: false, role: 'value' }); function Uhr(){ var today = new Date(); var Stunde = today.getHours(); var Minute = today.getMinutes(); var Sekunde = today.getSeconds(); var Wochentag = today.getDay(); var Tag = today.getDate(); var Monat = today.getMonth()+1; var Jahr = today.getFullYear(); setState("modbus.0.inputRegisters.30001",Stunde); setState("modbus.0.inputRegisters.30002",Minute); setState("modbus.0.inputRegisters.30003",Sekunde); setState("modbus.0.inputRegisters.30004",Tag); setState("modbus.0.inputRegisters.30005",Monat); setState("modbus.0.inputRegisters.30006",Jahr); setState("modbus.0.holdingRegisters.40001",Stunde); setState("modbus.0.holdingRegisters.40002",Minute); setState("modbus.0.holdingRegisters.40003",Sekunde); setState("modbus.0.holdingRegisters.40004",Tag); setState("modbus.0.holdingRegisters.40005",Monat); setState("modbus.0.holdingRegisters.40006",Jahr); } on({id: /modbus.0.coils.*/, change: 'ne'}, function (dp) { log(dp.id); var nr = dp.id.substring(15); if(nr.length == 1){ nr = "0"+nr; } nr="modbus.0.discreteInputs.100"+nr; setState(nr,dp.state.val); }); on({id: "0_userdata.0.Modbus.Uhrakt", change: 'any'}, function (dp) { Uhr(); });
Node-Red Übersicht:
Node-Red Export:
[ { "id": "076b7140f384fc31", "type": "tab", "label": "Flow 2", "disabled": false, "info": "", "env": [] }, { "id": "43e4d53f0aa39c48", "type": "inject", "z": "076b7140f384fc31", "name": "Uhr lesen", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "true", "payloadType": "bool", "x": 220, "y": 100, "wires": [ [ "ef3b8568dabbb9a9" ] ] }, { "id": "ef3b8568dabbb9a9", "type": "modbus-getter", "z": "076b7140f384fc31", "name": "FC4 lesen", "showStatusActivities": false, "showErrors": false, "showWarnings": true, "logIOActivities": false, "unitid": "1", "dataType": "InputRegister", "adr": "0", "quantity": "6", "server": "8f608791ee2c56ec", "useIOFile": false, "ioFile": "", "useIOForPayload": false, "emptyMsgOnFail": false, "keepMsgProperties": false, "delayOnStart": false, "startDelayTime": "", "x": 390, "y": 100, "wires": [ [ "70de74696eb9b0a9" ], [] ] }, { "id": "785e128808df5243", "type": "modbus-getter", "z": "076b7140f384fc31", "name": "HR 3 lesen", "showStatusActivities": false, "showErrors": false, "showWarnings": true, "logIOActivities": false, "unitid": "1", "dataType": "HoldingRegister", "adr": "0", "quantity": "6", "server": "8f608791ee2c56ec", "useIOFile": false, "ioFile": "", "useIOForPayload": false, "emptyMsgOnFail": false, "keepMsgProperties": false, "delayOnStart": false, "startDelayTime": "", "x": 390, "y": 200, "wires": [ [ "a8f80e0b0790e348" ], [] ] }, { "id": "9dd6f491f92368e1", "type": "catch", "z": "076b7140f384fc31", "name": "", "scope": null, "uncaught": false, "x": 180, "y": 620, "wires": [ [ "67f50288d77837d7" ] ] }, { "id": "67f50288d77837d7", "type": "debug", "z": "076b7140f384fc31", "name": "debug", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "payload", "targetType": "msg", "statusVal": "", "statusType": "auto", "x": 410, "y": 620, "wires": [] }, { "id": "8237112949c7f3af", "type": "modbus-getter", "z": "076b7140f384fc31", "name": "Discrete Inputs lesen", "showStatusActivities": false, "showErrors": false, "showWarnings": true, "logIOActivities": false, "unitid": "1", "dataType": "Input", "adr": "0", "quantity": "16", "server": "8f608791ee2c56ec", "useIOFile": false, "ioFile": "", "useIOForPayload": false, "emptyMsgOnFail": false, "keepMsgProperties": false, "delayOnStart": false, "startDelayTime": "", "x": 400, "y": 520, "wires": [ [ "911846b7835d27b1" ], [] ] }, { "id": "afdcf980395e649d", "type": "inject", "z": "076b7140f384fc31", "name": "", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "true", "payloadType": "bool", "x": 210, "y": 200, "wires": [ [ "785e128808df5243" ] ] }, { "id": "7b47194372033d3a", "type": "inject", "z": "076b7140f384fc31", "name": "", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "true", "payloadType": "bool", "x": 190, "y": 380, "wires": [ [ "38dce709eb85f4cd" ] ] }, { "id": "dad7162bfc539315", "type": "inject", "z": "076b7140f384fc31", "name": "", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "true", "payloadType": "bool", "x": 190, "y": 520, "wires": [ [ "8237112949c7f3af" ] ] }, { "id": "70de74696eb9b0a9", "type": "function", "z": "076b7140f384fc31", "name": "Input Register", "func": "\nnode.status({ text: msg.payload[3] + \".\" + msg.payload[4] + \".\" + msg.payload[5] + \", \" + msg.payload[0] + \":\" + msg.payload[1] + \":\" + msg.payload[2] });\nreturn msg;", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 840, "y": 80, "wires": [ [] ] }, { "id": "a8f80e0b0790e348", "type": "function", "z": "076b7140f384fc31", "name": "Holding Register", "func": "\nnode.status({ text: msg.payload[3] + \".\" + msg.payload[4] + \".\" + msg.payload[5] + \", \" + msg.payload[0] + \":\" + msg.payload[1] + \":\" + msg.payload[2] });\nreturn msg;", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 850, "y": 180, "wires": [ [] ] }, { "id": "911846b7835d27b1", "type": "function", "z": "076b7140f384fc31", "name": "Discrete Inputs", "func": "\nnode.status({ text: msg.payload[0] + \",\" + msg.payload[1] + \",\" + msg.payload[2] + \",\" + msg.payload[3] + \",\" + msg.payload[4] + \",\" + msg.payload[5] + \",\" + msg.payload[6] + \",\" + msg.payload[7] + \",\" + msg.payload[8] + \",\" + msg.payload[9] + \",\" + msg.payload[10] + \",\" + msg.payload[11] + \",\" + msg.payload[12] + \",\" + msg.payload[13] + \",\" + msg.payload[14] + \",\" + msg.payload[15] });\nreturn msg;", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 780, "y": 520, "wires": [ [] ] }, { "id": "f6bbf853944e2b8e", "type": "inject", "z": "076b7140f384fc31", "name": "", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "0_userdata.0.Modbus.Uhrakt", "payload": "true", "payloadType": "bool", "x": 290, "y": 40, "wires": [ [ "2ecfa1e07d7ac8ce" ] ] }, { "id": "2ecfa1e07d7ac8ce", "type": "ioBroker out", "z": "076b7140f384fc31", "name": "", "topic": "", "ack": "false", "autoCreate": "false", "stateName": "", "role": "", "payloadType": "", "readonly": "", "stateUnit": "", "stateMin": "", "stateMax": "", "x": 540, "y": 40, "wires": [] }, { "id": "e0e451832374cbb0", "type": "modbus-write", "z": "076b7140f384fc31", "name": "FC 15 Coils schreiben", "showStatusActivities": true, "showErrors": true, "showWarnings": true, "unitid": "77", "dataType": "MCoils", "adr": "0", "quantity": "16", "server": "8f608791ee2c56ec", "emptyMsgOnFail": false, "keepMsgProperties": false, "delayOnStart": false, "startDelayTime": "", "x": 900, "y": 380, "wires": [ [], [] ] }, { "id": "2a3a2f3bd75e5784", "type": "inject", "z": "076b7140f384fc31", "name": "", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "false", "payloadType": "bool", "x": 190, "y": 440, "wires": [ [ "38dce709eb85f4cd" ] ] }, { "id": "38dce709eb85f4cd", "type": "function", "z": "076b7140f384fc31", "name": "Coils erstellen", "func": "var bool = msg.payload;\nmsg.payload = [bool, !bool, bool, !bool, bool, !bool, bool, !bool, bool, !bool, bool, !bool, bool, !bool, bool, !bool]\nnode.status({ text: msg.payload[0] + \",\" + msg.payload[1] + \",\" + msg.payload[2] + \",\" + msg.payload[3] + \",\" + msg.payload[4] + \",\" + msg.payload[5] + \",\" + msg.payload[6] + \",\" + msg.payload[7] + \",\" + msg.payload[8] + \",\" + msg.payload[9] + \",\" + msg.payload[10] + \",\" + msg.payload[11] + \",\" + msg.payload[12] + \",\" + msg.payload[13] + \",\" + msg.payload[14] + \",\" + msg.payload[15] });\n\nreturn msg;", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 380, "y": 380, "wires": [ [ "e0e451832374cbb0" ] ] }, { "id": "f49483843b20ed8f", "type": "modbus-write", "z": "076b7140f384fc31", "name": "Mehrere Register schreiben", "showStatusActivities": false, "showErrors": false, "showWarnings": true, "unitid": "1", "dataType": "MHoldingRegisters", "adr": "0", "quantity": "6", "server": "8f608791ee2c56ec", "emptyMsgOnFail": false, "keepMsgProperties": false, "delayOnStart": false, "startDelayTime": "", "x": 680, "y": 300, "wires": [ [], [] ] }, { "id": "13dc061ca308d6c3", "type": "function", "z": "076b7140f384fc31", "name": "Werte erstellen", "func": "var fak = 1;\nif(msg.payload){\n fak=10;\n}\nmsg.payload = [1 * fak, 2 * fak, 3 * fak, 4 * fak, 5 * fak, 6 * fak]\nnode.status({ text: msg.payload[0] + \",\" + msg.payload[1] + \",\" + msg.payload[2] + \",\" + msg.payload[3] + \",\" + msg.payload[4] + \",\" + msg.payload[5]});\n\nreturn msg;", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 380, "y": 300, "wires": [ [ "f49483843b20ed8f" ] ] }, { "id": "9929366dd363ba55", "type": "inject", "z": "076b7140f384fc31", "name": "*10", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "true", "payloadType": "bool", "x": 190, "y": 280, "wires": [ [ "13dc061ca308d6c3" ] ] }, { "id": "6e7c45f923caa5db", "type": "inject", "z": "076b7140f384fc31", "name": "*1", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "false", "payloadType": "bool", "x": 190, "y": 320, "wires": [ [ "13dc061ca308d6c3" ] ] }, { "id": "8f608791ee2c56ec", "type": "modbus-client", "name": "", "clienttype": "tcp", "bufferCommands": true, "stateLogEnabled": false, "queueLogEnabled": true, "failureLogEnabled": true, "tcpHost": "127.0.0.1", "tcpPort": "502", "tcpType": "DEFAULT", "serialPort": "/dev/ttyUSB", "serialType": "RTU-BUFFERD", "serialBaudrate": "9600", "serialDatabits": "8", "serialStopbits": "1", "serialParity": "none", "serialConnectionDelay": "100", "serialAsciiResponseStartDelimiter": "0x3A", "unit_id": "77", "commandDelay": "1", "clientTimeout": "1000", "reconnectOnTimeout": true, "reconnectTimeout": "2000", "parallelUnitIdsAllowed": true, "showErrors": true, "showWarnings": true, "showLogs": true } ]
Man kann die Uhr stellen, die Werte ablegen und wieder einlesen.
-
RE: Status 504 bei Grafana auf dem raspi
@homoran Meines Wissens nach mittels
sudo apt-mark hold grafana sudo apt-mark hold influxdb2-cli sudo apt-mark hold influxdb2
Rückgängig geht das mit
sudo apt-mark unhold ....
Thomas Braun war schneller
-
RE: Kostenpflichtige iobroker Adapter
Moin,
ich stehe kostenpflichtigen Adaptern kritisch gegenüber.
Als ich mich damals mit KNX auseindersetzen wollte, wurde mir klar, dass das durchaus eine "Gelddruckmaschine" für die Entwickler / Hersteller / Whatever zu sein scheint. Für reines Interesse war mir das einfach zu teuer. Also verwarf ich den Gedanken an KNX wieder.
Wenn es Adapter gibt, die zukünftig Geld kosten sollen, wird es wohl darauf hinaus laufen, dass der ein oder andere die Updates abschaltet und mit der letzten lauffähigen kostenlosen Version arbeiten. Das Image von ioBroker könnte dadurch in Mitleidenschaft gezogen werden. (veraltet / unsicher, etc.)
Jetzt die andere Seite: Angenommen, ich habe in teure Hard- und Software investiert. Nennen wir sie ruhig als Beispiel KNX. Diese möchte ich, auch aufgrund meiner Fertigkeiten, in ioBroker einbinden. Also programmiere ich einen Adapter dafür. Gibt es Updates, muss ich den Adapter pflegen. Das kostet Zeit und evtl. sogar Geld für KNX Software - und Hardware. Denn der Adapter soll auch mit Aktoren umgehen können, die ich selbst nicht habe. >> Welche Möglichkeiten gibt es, um die eigenen Kosten so gering wie möglich zu halten?
- Hardware-Spenden durch Boardkollegen, die mir gewünscht integrierte Hardware zur Verfügung stellen? - Darauf bauen würde ich nicht.
- Hardware, welche mir der Hersteller kostenfrei zur Verfügung stellt, damit das Projekt hier neue Kunden akquiriert? - Die Wahrscheinlichkeit ist gering.
- Ich betrachte es als teures Hobby und kaufe alle möglichen Aktoren, womöglich in Varianten auf eigene Rechnung - Wohl kaum.
Da bleibt wohl bald nur Gewerbe anmelden und Adapter vermarkten. << Damit würde ich mich allerdings auch verpflichtet fühlen, dass alle Aktoren laufen, Updates zeitnah kommen und hier und da wohl Support geleistet werden muss.
Was, wenn ich einen Adapter programmiere, was mich Zeit, Nerven, Recherche und evtl. viel Kaffee kostet?
- Nutze ich täglich kostenlos Adapter anderer Boardkollegen?
- Ist es einer meiner Hobbies?
- Leisten evtl. Boardkollegen kostenlos Support für die Nutzer "meines" Adapters?
- Muss ich dann nicht ioBroker irgendwie an dem Gewinn beteiligen?
Lohnt es sich also, dafür evtl. ein Gewerbe anzumelden und Geld dafür zu verlangen?
Sicher - das mit dem Gewerbe wird kaum einer machen. Andererseits ist die Gefahr, dass ein zahlender "Kunde", welcher sich, aus welchen Gründen auch immer, dazu motiviert sieht, dem Finanzamt einen Tipp zu geben, nicht auszuschließen.
-
RE: Zigbee Lampen flackern beim Ein- und Ausschalten.
@jacquesnorris
Die meisten (alle?) Lampen sind so schlau, dass wenn eine Farbe oder die Helligkeit verändert wird, diese auch automatisch einschalten. Schickst Du dann den nächsten Befehl hinterher, sieht das dann evtl. nicht mehr so weich aus. -
RE: Test Adapter doorio v2.1.2
So, die Erweiterung ist soweit eingebaut. Allerdings aktuell nur in meinem Fork. Es fehlen noch einige Übersetzungen.
Möglich ist jetzt die Angabe von bis zu 6 Telefonnummern (Ausschnitte reichen), bei welchen überhaupt der Anruf angenommen werden soll. Zusätzlich kann man jede Rufnummer wählen.
Gibt man in den Einstellungen an, dass Baresip automatisch abhebt, dann läuft es so, wie gehabt.
Vielen Dank für die prima Vorlage.
-
RE: Vis2 ab 09.01.2024 im stable
Die Gestylt-Widges funktionieren sind unbrauchbar. Ich erstelle gerade eine VIS-2, als Vorlage dient die VIS(1). Eins gestylte boolesche Sybolschaltfläche reagiert nur solange sol wie sie soll, wenn ich jQuery-Stil nicht anhake. Einmal angehakt, passen die Schaltzustände nicht mehr. Abhaken lässt es sich auch nicht, dann wird das ganze Fenster vom VIS-Editor weiß. Einmal die Seite neu laden, und der Haken ist wieder drin. Die Symbole verschwinden nach dem neu laden auch.
Auch die Hintergrundklasse Kohlenstofffaser sorgt für ganz viele weiße Kacheln auf schwarzem Hintergrund.
Aktuell sehe ich VIS-2 nur für rudimentäre Seiten. - Auf den Tablets in der Küche und im Wohnzimmer läuft VIS-2 mit einfach gestrickten Seiten unauffällig. Wechseln wollte ich, damit der Ladekreis Geschichte wird.
Mittels Node-Red-Dashboard funktioniert die Steuerung per Handy sehr gut. Allerdings gibt es da keinen WYSIWYG Editor und auch sonst eher eingeschränkte optische Möglichkeiten. - Irgendwas ist ja immer.
Webui habe ich noch nicht weiter angeschaut.
Latest posts made by peterfido
-
RE: Daten mit 3 Minuten Verzögerung in Grafana
@topsurfer Evtl. geht eine Uhr in der Kette nach.
-
RE: Modbus: Verbindung zu Codesys-Runtime herstellen
@minkhx ioBroker läuft unter node-js. Die meisten nutzen als Host ein Linux. Ich selbst nutze Debian VMs unter Proxmox. Die laufen unauffällig durch. Der VM habe ich vier Kerne zugewiesen, welche auch alle genutzt werden. Zwei Kerne sind das Minimum, welches ich zuweise. Bei nur einem Kern braucht Debmatic mehrer fünf Minuten, bis es hochgefahren ist. Bei zwei Kernen etwa eine.
-
RE: Modbus als Slave
@minkhx Ich habe mein Post oben etwas um "Überschriften" ergänzt. Die Node-Red Grafik ist nur ein Überblick, den man nicht nachbauen braucht. Der Code darunter ist zum Import in Node-Red. Danach ist der Flow bereits fertig gebaut. Man braucht evtl. nur noch Parameter anpassen. (IP-Adressen; Geräte-IDs)
Das Javascript wird im Script Editor als Javascript importiert. Das lauscht auf einen Datenpunkt, welcher vom Node-Red aus getriggert wird. Da wird dann die aktuelle Zeit und Datum in den Registern abgelegt. Kommen Coils "rein", werden diese auf die Discreten Inputs gespiegelt.
-
RE: Modbus: Verbindung zu Codesys-Runtime herstellen
@minkhx Bei meinem kleinen Test heute Morgen konnte ich Register mit Coils und Discrete Inputs mischen. Die Zeit zwischen schreiben und lesen darf nicht zu kurz sein, wenn der ioBroker noch andere Dinge erledigt. Das hatte ich oben schon geschrieben, dass Modbus Teilnehmer Eigenarten aufweisen können. Wieviel Ressourcen Codesys braucht, ist mit nicht bekannt. Evtl. ist da auch der Flaschenhals.
Ich selbst frage darüber vier Stromzähler ab, wobei einer eine Direktverbindung hat. Da steht zwar Modbus drauf, ist aber wohl nur RS485 Punkt zu Punkt. Da gibt es auch keine Adressen. Die drei anderen Zähler hängen alle an einem Bus und da musste ich schon an den Timings feilen und Abfragen stückeln. Die Probleme gibt es bei alternativen Protokollen, wie z.B. klassisches Ethernet-TCP nicht. Da kümmert sich die Hardware selbst bei Kollisionen.
Der Raspberry Pi sollte ein aktueller mit 4 oder 8 GB sein. Dann schafft der locker mehr Aufgaben. Grafana und InfluxDB habe ich auf separaten VMs. Ob der Pi da ausreichend Ressourcen für alles gewünschte hat, weiß ich nicht. Es nutzen allerdings einige Boarduser einen Raspi für ioBroker.
-
Modbus als Slave
Hallo,
anbei ein Beispiel, wie der Modbus Adapter als Slave genutzt werden kann.
Als Gegenpart habe ich Node-Red (node-red-contrib-modbus) auf dem selben ioBroker auf meinem Testsystem genutzt.Die Einstellungen vom Modbus-Adapter sind wie folgt:
Ein Javascript unterstützt mit einer Uhr und kopieren der empfangen Werte in die Ausgangsregister. Die Uhr muss von Hand aktualisiert werden, damit die nicht in die Tests reingrätscht.
//Modbus Test createState('0_userdata.0.Modbus.Uhrakt', { type: 'boolean', def: false, role: 'value' }); function Uhr(){ var today = new Date(); var Stunde = today.getHours(); var Minute = today.getMinutes(); var Sekunde = today.getSeconds(); var Wochentag = today.getDay(); var Tag = today.getDate(); var Monat = today.getMonth()+1; var Jahr = today.getFullYear(); setState("modbus.0.inputRegisters.30001",Stunde); setState("modbus.0.inputRegisters.30002",Minute); setState("modbus.0.inputRegisters.30003",Sekunde); setState("modbus.0.inputRegisters.30004",Tag); setState("modbus.0.inputRegisters.30005",Monat); setState("modbus.0.inputRegisters.30006",Jahr); setState("modbus.0.holdingRegisters.40001",Stunde); setState("modbus.0.holdingRegisters.40002",Minute); setState("modbus.0.holdingRegisters.40003",Sekunde); setState("modbus.0.holdingRegisters.40004",Tag); setState("modbus.0.holdingRegisters.40005",Monat); setState("modbus.0.holdingRegisters.40006",Jahr); } on({id: /modbus.0.coils.*/, change: 'ne'}, function (dp) { log(dp.id); var nr = dp.id.substring(15); if(nr.length == 1){ nr = "0"+nr; } nr="modbus.0.discreteInputs.100"+nr; setState(nr,dp.state.val); }); on({id: "0_userdata.0.Modbus.Uhrakt", change: 'any'}, function (dp) { Uhr(); });
Node-Red Übersicht:
Node-Red Export:
[ { "id": "076b7140f384fc31", "type": "tab", "label": "Flow 2", "disabled": false, "info": "", "env": [] }, { "id": "43e4d53f0aa39c48", "type": "inject", "z": "076b7140f384fc31", "name": "Uhr lesen", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "true", "payloadType": "bool", "x": 220, "y": 100, "wires": [ [ "ef3b8568dabbb9a9" ] ] }, { "id": "ef3b8568dabbb9a9", "type": "modbus-getter", "z": "076b7140f384fc31", "name": "FC4 lesen", "showStatusActivities": false, "showErrors": false, "showWarnings": true, "logIOActivities": false, "unitid": "1", "dataType": "InputRegister", "adr": "0", "quantity": "6", "server": "8f608791ee2c56ec", "useIOFile": false, "ioFile": "", "useIOForPayload": false, "emptyMsgOnFail": false, "keepMsgProperties": false, "delayOnStart": false, "startDelayTime": "", "x": 390, "y": 100, "wires": [ [ "70de74696eb9b0a9" ], [] ] }, { "id": "785e128808df5243", "type": "modbus-getter", "z": "076b7140f384fc31", "name": "HR 3 lesen", "showStatusActivities": false, "showErrors": false, "showWarnings": true, "logIOActivities": false, "unitid": "1", "dataType": "HoldingRegister", "adr": "0", "quantity": "6", "server": "8f608791ee2c56ec", "useIOFile": false, "ioFile": "", "useIOForPayload": false, "emptyMsgOnFail": false, "keepMsgProperties": false, "delayOnStart": false, "startDelayTime": "", "x": 390, "y": 200, "wires": [ [ "a8f80e0b0790e348" ], [] ] }, { "id": "9dd6f491f92368e1", "type": "catch", "z": "076b7140f384fc31", "name": "", "scope": null, "uncaught": false, "x": 180, "y": 620, "wires": [ [ "67f50288d77837d7" ] ] }, { "id": "67f50288d77837d7", "type": "debug", "z": "076b7140f384fc31", "name": "debug", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "payload", "targetType": "msg", "statusVal": "", "statusType": "auto", "x": 410, "y": 620, "wires": [] }, { "id": "8237112949c7f3af", "type": "modbus-getter", "z": "076b7140f384fc31", "name": "Discrete Inputs lesen", "showStatusActivities": false, "showErrors": false, "showWarnings": true, "logIOActivities": false, "unitid": "1", "dataType": "Input", "adr": "0", "quantity": "16", "server": "8f608791ee2c56ec", "useIOFile": false, "ioFile": "", "useIOForPayload": false, "emptyMsgOnFail": false, "keepMsgProperties": false, "delayOnStart": false, "startDelayTime": "", "x": 400, "y": 520, "wires": [ [ "911846b7835d27b1" ], [] ] }, { "id": "afdcf980395e649d", "type": "inject", "z": "076b7140f384fc31", "name": "", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "true", "payloadType": "bool", "x": 210, "y": 200, "wires": [ [ "785e128808df5243" ] ] }, { "id": "7b47194372033d3a", "type": "inject", "z": "076b7140f384fc31", "name": "", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "true", "payloadType": "bool", "x": 190, "y": 380, "wires": [ [ "38dce709eb85f4cd" ] ] }, { "id": "dad7162bfc539315", "type": "inject", "z": "076b7140f384fc31", "name": "", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "true", "payloadType": "bool", "x": 190, "y": 520, "wires": [ [ "8237112949c7f3af" ] ] }, { "id": "70de74696eb9b0a9", "type": "function", "z": "076b7140f384fc31", "name": "Input Register", "func": "\nnode.status({ text: msg.payload[3] + \".\" + msg.payload[4] + \".\" + msg.payload[5] + \", \" + msg.payload[0] + \":\" + msg.payload[1] + \":\" + msg.payload[2] });\nreturn msg;", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 840, "y": 80, "wires": [ [] ] }, { "id": "a8f80e0b0790e348", "type": "function", "z": "076b7140f384fc31", "name": "Holding Register", "func": "\nnode.status({ text: msg.payload[3] + \".\" + msg.payload[4] + \".\" + msg.payload[5] + \", \" + msg.payload[0] + \":\" + msg.payload[1] + \":\" + msg.payload[2] });\nreturn msg;", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 850, "y": 180, "wires": [ [] ] }, { "id": "911846b7835d27b1", "type": "function", "z": "076b7140f384fc31", "name": "Discrete Inputs", "func": "\nnode.status({ text: msg.payload[0] + \",\" + msg.payload[1] + \",\" + msg.payload[2] + \",\" + msg.payload[3] + \",\" + msg.payload[4] + \",\" + msg.payload[5] + \",\" + msg.payload[6] + \",\" + msg.payload[7] + \",\" + msg.payload[8] + \",\" + msg.payload[9] + \",\" + msg.payload[10] + \",\" + msg.payload[11] + \",\" + msg.payload[12] + \",\" + msg.payload[13] + \",\" + msg.payload[14] + \",\" + msg.payload[15] });\nreturn msg;", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 780, "y": 520, "wires": [ [] ] }, { "id": "f6bbf853944e2b8e", "type": "inject", "z": "076b7140f384fc31", "name": "", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "0_userdata.0.Modbus.Uhrakt", "payload": "true", "payloadType": "bool", "x": 290, "y": 40, "wires": [ [ "2ecfa1e07d7ac8ce" ] ] }, { "id": "2ecfa1e07d7ac8ce", "type": "ioBroker out", "z": "076b7140f384fc31", "name": "", "topic": "", "ack": "false", "autoCreate": "false", "stateName": "", "role": "", "payloadType": "", "readonly": "", "stateUnit": "", "stateMin": "", "stateMax": "", "x": 540, "y": 40, "wires": [] }, { "id": "e0e451832374cbb0", "type": "modbus-write", "z": "076b7140f384fc31", "name": "FC 15 Coils schreiben", "showStatusActivities": true, "showErrors": true, "showWarnings": true, "unitid": "77", "dataType": "MCoils", "adr": "0", "quantity": "16", "server": "8f608791ee2c56ec", "emptyMsgOnFail": false, "keepMsgProperties": false, "delayOnStart": false, "startDelayTime": "", "x": 900, "y": 380, "wires": [ [], [] ] }, { "id": "2a3a2f3bd75e5784", "type": "inject", "z": "076b7140f384fc31", "name": "", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "false", "payloadType": "bool", "x": 190, "y": 440, "wires": [ [ "38dce709eb85f4cd" ] ] }, { "id": "38dce709eb85f4cd", "type": "function", "z": "076b7140f384fc31", "name": "Coils erstellen", "func": "var bool = msg.payload;\nmsg.payload = [bool, !bool, bool, !bool, bool, !bool, bool, !bool, bool, !bool, bool, !bool, bool, !bool, bool, !bool]\nnode.status({ text: msg.payload[0] + \",\" + msg.payload[1] + \",\" + msg.payload[2] + \",\" + msg.payload[3] + \",\" + msg.payload[4] + \",\" + msg.payload[5] + \",\" + msg.payload[6] + \",\" + msg.payload[7] + \",\" + msg.payload[8] + \",\" + msg.payload[9] + \",\" + msg.payload[10] + \",\" + msg.payload[11] + \",\" + msg.payload[12] + \",\" + msg.payload[13] + \",\" + msg.payload[14] + \",\" + msg.payload[15] });\n\nreturn msg;", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 380, "y": 380, "wires": [ [ "e0e451832374cbb0" ] ] }, { "id": "f49483843b20ed8f", "type": "modbus-write", "z": "076b7140f384fc31", "name": "Mehrere Register schreiben", "showStatusActivities": false, "showErrors": false, "showWarnings": true, "unitid": "1", "dataType": "MHoldingRegisters", "adr": "0", "quantity": "6", "server": "8f608791ee2c56ec", "emptyMsgOnFail": false, "keepMsgProperties": false, "delayOnStart": false, "startDelayTime": "", "x": 680, "y": 300, "wires": [ [], [] ] }, { "id": "13dc061ca308d6c3", "type": "function", "z": "076b7140f384fc31", "name": "Werte erstellen", "func": "var fak = 1;\nif(msg.payload){\n fak=10;\n}\nmsg.payload = [1 * fak, 2 * fak, 3 * fak, 4 * fak, 5 * fak, 6 * fak]\nnode.status({ text: msg.payload[0] + \",\" + msg.payload[1] + \",\" + msg.payload[2] + \",\" + msg.payload[3] + \",\" + msg.payload[4] + \",\" + msg.payload[5]});\n\nreturn msg;", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 380, "y": 300, "wires": [ [ "f49483843b20ed8f" ] ] }, { "id": "9929366dd363ba55", "type": "inject", "z": "076b7140f384fc31", "name": "*10", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "true", "payloadType": "bool", "x": 190, "y": 280, "wires": [ [ "13dc061ca308d6c3" ] ] }, { "id": "6e7c45f923caa5db", "type": "inject", "z": "076b7140f384fc31", "name": "*1", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "false", "payloadType": "bool", "x": 190, "y": 320, "wires": [ [ "13dc061ca308d6c3" ] ] }, { "id": "8f608791ee2c56ec", "type": "modbus-client", "name": "", "clienttype": "tcp", "bufferCommands": true, "stateLogEnabled": false, "queueLogEnabled": true, "failureLogEnabled": true, "tcpHost": "127.0.0.1", "tcpPort": "502", "tcpType": "DEFAULT", "serialPort": "/dev/ttyUSB", "serialType": "RTU-BUFFERD", "serialBaudrate": "9600", "serialDatabits": "8", "serialStopbits": "1", "serialParity": "none", "serialConnectionDelay": "100", "serialAsciiResponseStartDelimiter": "0x3A", "unit_id": "77", "commandDelay": "1", "clientTimeout": "1000", "reconnectOnTimeout": true, "reconnectTimeout": "2000", "parallelUnitIdsAllowed": true, "showErrors": true, "showWarnings": true, "showLogs": true } ]
Man kann die Uhr stellen, die Werte ablegen und wieder einlesen.
-
RE: Modbus: Verbindung zu Codesys-Runtime herstellen
@minkhx Codesys kostet meines Wissens nach Geld. Da fehlt mir und wohl den meisten "ioBrokern" die Notwendigkeit. Die Programmierung lässt sich halt auch kostenneutral durchführen.
Mir scheint mit Codesys schießt man in der Heimautomation mit Kanonen auf Spatzen.
Mir fehlt in dem Fall der konkrete Anwendungsfall. Sollen da nur ein paar Adressen / Register gelesen werden, um die Kommunikation zu testen, so fehlt mir die Erfahrung, den ioBroker als Slave einzusetzen.
Du könntest da mal die Node-Red-Nodes nach Modbus Slave durchsuchen, und schauen, was sich damit machen lässt. Die Beschreibungen sind da meist sehr hilfreich. Der Pi müsste dann die Register beim ioBroker anfordern.
Modbus Register sind 16 Bit breit. 1 Bit breit sind Coils oder Discrete Inputs. Um Bandbreite zu sparen würde ich immer ganze Register lesen und das entsprechende Bit maskieren.
Mir fehlen da die Erfahrungen, einen Slave abzubilden und Codesys allgemein.
Da Ethernet vorhanden ist, würde ich einfach ein alternatives Protokoll wählen. Meiner Erfahrung nach kann es trickreich werden, wenn sich unterschiedliche Geräte am Bus befinden. Einige brauchen länger als andere für die Antwort. Andere sorgen für Bitfehler, wenn man zu viele Register auf einmal abfragt. Da heißt es dann Pausen einprogrammieren und / oder Daten häppchenweise holen. Und manchmal muss man noch die Adresse übersetzen.
Edit: Es hat wohl schon jemand geschafft, den Modbus Adapter als Slave zu betreiben. Klick
-
RE: Modbus: Verbindung zu Codesys-Runtime herstellen
Modbus kenne ich als Bus (mit Geräteadressen) und als Punkt zu Punkt Verbindung. Beides nutze ich. Bei beiden ist der Node-Red-Adapter bei mir der Host /Master. Bei beiden frage ich zyklisch Werte ab, welche ich nach einer kleinen Pause, die die Clienten / Slaves zur Aufbereitung der Daten brauchen, auch bekomme. Was nicht angefordert wird, wird auch nicht gesendet. Node-Red nutze ich, da ich dort besser die Eigenarten der einzelnen Clienten / Slaves berücksichtigen kann.
Codesys selbst nutze ich nicht. Wäre aber auch nicht das Mittel meiner Wahl, wenn sich zwei Zentralen unterhalten sollen. Da nehme ich aktuell, je nach Anwendungsfall, mqtt / simple-api / einen Webserver unter Node-Red.
Wenn der Raspi weiter weg steht, würde ich da evtl. eine zweite ioBroker Installation [vielleicht als Slave] nutzen. Der kann dann auch mit Modbus-Geräten sprechen.
-
RE: Festplattenbedarf iobroker 14GB ? Normal oder ... ?
@topsurfer ioBroker kann man bei Problemen auf einen Snapshot oder Backup zurücksetzen und die Datenbank läuft durch. Ich habe auch Grafana eine eigene VM spendiert, nach dem es da nach einem Update zu Problemchen kam und ich zurückspringen musste.
lxc sollten da auch reichen. Ich nutze VMs seit es nach einem Proxmox Upate Probleme mit Debmatic und seinen Kernel Modulen kam. Das ist zwar schon ein paar Jahre her, das Misstrauen ist geblieben
-
RE: Passwort Schutz javascript
@mcm1957 Die Systeme sollten aktuell gehalten werden. Spätestens bei abgekündigten Funktionen / Breaking Changes muss da jemand ran.