FHEM Modul (70_MOD4IO.pm) - Günstiges 4 Kanal Modbus RTU I/O Modul

Begonnen von ahermann86, 04 Januar 2021, 23:35:07

Vorheriges Thema - Nächstes Thema

ahermann86

Hallo zusammen,

ich habe für eine einfache Anwendung, welche ein paar Ein- und Ausgänge benötigt nach einer simplen Lösung gesucht. Ein Modul mit 4 Relaisausgängen und 4 Eingängen habe ich dann auch gefunden (IO_Board.jpg). Ein Bild zu dem Board "Relay Board-4" ist im Anhang zu finden.
Meine letzte Bezugsquelle ist folgende: https://de.aliexpress.com/item/4000180613620.html?spm=a2g0s.9042311.0.0.27424c4dhD5RIU

Leider konnte ich das nicht ganz einfach, wie gewünscht, über das ModbusAttr Modul einbinden... Ich habe mir dann ein Modul speziell für dieses Board geschrieben. Ein (hoffentlich) weiterer Vorteil des Moduls ist es, dass nach einem Timeout oder beim Wiedereinschalten die letzten Schaltzustände der Relais wiederhergestellt werden.

Die Anbindung geht am einfachsten mit einem USB-RS485 Stick oder einem UART(TTL)-RS485 Umsetzer (RS485_Adapter_xxx.jpg).

Laden des Moduls in FHEM:
1. Datei "70_MOD4IO.pm" in den FHEM Ordner kopieren
2. Über die FHEM Weboberfläche das Modul mit "reload 70_MOD4IO" laden.
3. Modul definieren...

Definition:
Beispiel: define myMOD4IO MOD4IO /dev/ttyUSB0

Sets:
Connect 
Disconnect
RelAll
Rel1
Rel2
Rel3
Rel4
...  sollten soweit selbsterklärend sein.

SetAdrWithOnlyOneDevice:
Ist zum setzen der Adresse eines Moduls. Wichtig dabei ist, dass nur ein Modul am Bus hängt, wenn diese Anweisung ausgeführt wird. Hintergrund: Es wird mit dem Broadcast Befehl ausgeführt. Damit "fühlt" sich jedes angeschlossene Modul angesprochen.
Beispiel: "set myRel SetAdrWithOnlyOneDevice 2" -> Setzt die Adresse des angeschlossen Moduls auf 2.

CalcCRC:
Ist noch ein überbleibsel von der Modulentwicklung. Das macht nichts, ausser das erstellen eines Readings mit der berechteten Modbus Checksumme.

Attributes:

DebugLog:on,off,onRetry - default "off"
Falls Mal etwas nicht funktioniert, wird das Logfile "70_MOD4IO_Log.log" im FHEM Ordner erstellt.
Sollte normal nicht nötig sein.

Polltime - default "1"
Abfrageintervall der Eingänge.

NodeAdr - default "1"
Moduladresse

BoardType:STM,WithoutQuartz - default "STM"
Mein Erstes Board war mit einem Nuvoton Mikrocontroller (ohne Quartz). Der verstand Modbus noch weniger bzw. dem Programmierer war die Modbus Implementierung noch unbekannter...
Die aktuellen haben den STM drauf. Daher sollte dieses Attribut normalerweise nicht nötig sein.

Aktuelle Version (20.03.2021) der 70_MOD4IO.pm: 1.3

Changelog:
1.1 - 04.01.21
  - Erstes Release
1.2 - 06.03.21
  - Manchmal kommt es vor, dass "set myMOD4IO Relx" nicht zuverlässig funktioniert. Wenn das passiert, wird das Setzen noch einmal automatisch wiederholt.
  - Neues Reading: CommSet - Zeigt an, ob "set myMOD4IO Relx" durchgeführt worden ist oder ob ein Fehler vorliegt
  - Inx nur dann triggern, wenn sich der jeweilige Zustand ändert
1.3 - 20.03.21
  - Wiederholungen beim Schreiben und beim Lesen optimiert.

Viel Spaß beim Testen.

Gruß
Axel

pnewman

Hallo Axel,

vielen Dank das du dies mit uns teilst.

Wieviele von diesen Relais-Board kann ich maximal an einem USB-RS485 Stick betreiben?

In deinem Beispiel wird es folgendermaßen definiert: define myHPSU HPSU /dev/ttyUSB0

Wie komme ich an dein Modul. MOD4IO. ??

Ich finde es interessant um einige Dinge aus der Garage heraus damit zu schalten, z.b. Bewässerungsventile, Bewässerungspumpe, Gartenlampen etc.

Somit könnte ich einen Raps mit einer weiteren FHEM Instanz an den Switch in der Garage anschließen etc.


Gruß

Ralf
Raspberry Pi3B+ / Nano-Cul 868 - MAX!=Heizung, HM-Lan - Rollo+Licht, JeeLink-Clone 868 - LaCrosse, JeeLink-Clone 868 - PCA301, CUL 434 - IT-Steckdosen+Fernbedienung

ahermann86

Hallo Ralf,

sorry - das war ein Kopierfehler. Habe das im ersten Post mit "define myMOD4IO MOD4IO /dev/ttyUSB0" aktualisiert.

Die Anzahl der Nodes kann theoretisch 254 sein. Also Adresse 1-255. (ähnlich der Modbus spec.)

Gruß
Axel

ahermann86

Hallo,

ich habe heute ein Update erstellt.

Manchmal ist es vorgekommen, dass ein Ausgang nicht so getetzt war, wie mit dem set Befehl ausgeführt wurde.
Wenn das vorkommt, wird das Setzen noch einmal automatisch wiederholt.

Gruß
Axel