Neues Modul für Geräte mit Modbus Schnittstelle über RS232 bzw. RS485

Begonnen von StefanStrobel, 12 Juli 2014, 14:50:22

Vorheriges Thema - Nächstes Thema

StefanStrobel

Hallo,

Einen Modbus-Scanner hatte ich mal in einer rudimentären Form im Modul integriert. Ein Praktikant in der Firma hat daraus einen Standalone-Scanner gebaut. Den kann ich nächste Woche posten wenn ich wieder im Büro bin.

Auch für das Relais könnte der Scanner die Lösung sein.

Doku zu ModbusAttr steht im Wiki: http://www.fhemwiki.de/wiki/ModbusAttr
Im Prinzip entspricht die Konfiguration von ModbusAttr direkt dem Definitions-Hash von Modulen, die auf 98_Modbus basieren. Man kann das eine in das andere übersetzen ...

Gruß
    Stefan

der-Lolo

Das wäre wirklich toll wenn Du diesen Scanner hier "einhängen" könntest.
Die Doku schau ich mir an! Nächste Woche gehts weiter...

eisler

Hallo,

den Modbus-Scanner könnte ich auch gebrauchen. Würde auch nichts schaden wenn er im Modul integriert wäre.

Grüße
Stephan

wthiess

Hallo Danke für den Tipp!

Habe mir im Internet einen Scanner runtergeladen. Allerdings für Windows.
Aber mein Problem habe ich damit gelöst.
http://freemodbus.com/download/
In Fhem eingebaut wäre es sicher ein Hit. Speziell für billige Chinaprodukte ohne Anleitung.

lg
Wolfgang


Raspberry Pi 3; 8xRelais; Aptodec Nano V3.0 Pro; FS1000a; RF-5V; Hama TS33C; 3x Brennerstuhl FunkSteckdosen; 9x Dooya funk Rollo; KWL Systemair VR400; Thermokon Modbusthermostat; diverse China Modbus Thermostate; 1-wire Bus; Telegram; QuickFhem; FhemNative; Firmata; Alexa ......

eisler


wthiess

Hallo!

Leider doch nicht so toll. Folgendes: Der Scanner zeigt bei den 4 Eingängen bei "on"

E1: 01 02 0D 01 01 01 01 01 01 01 01 01 01 01 01 01 2B 36
E2: 01 02 0D 02 02 02 02 02 02 02 02 02 02 02 02 02 46 D9
E3: 01 02 0D 04 04 04 04 04 04 04 04 04 04 04 04 04 9F 47
E4: 01 02 0D 08 08 08 08 08 08 08 08 08 08 08 08 08 2E 3A

Bei off:
01 02 0D 00 00 00 00 00 00 00 00 00 00 00 00 00 F1 AC

Meine Fhemeinträge:

#Rin1
define Digi1 ModbusAttr 1 2
attr Digi1 IODev VR400Mod
attr Digi1 dev-d-combine 5
attr Digi1 dev-d-defPoll 1
attr Digi1 obj-d1-reading Digi1
attr Digi1 room Relais
attr Digi1 stateFormat {sprintf("%.0f ", ReadingsVal($name,"Digi1",0))}

#Rin2
define Digi2 ModbusAttr 1 2
attr Digi2 IODev VR400Mod
attr Digi2 dev-d-combine 5
attr Digi2 dev-d-defPoll 1
attr Digi2 obj-d2-reading Digi2
attr Digi2 room Relais
attr Digi2 stateFormat {sprintf("%.0f ", ReadingsVal($name,"Digi2",0))}

#Rin3
define Digi3 ModbusAttr 1 2
attr Digi3 IODev VR400Mod
attr Digi3 dev-d-combine 5
attr Digi3 dev-d-defPoll 1
attr Digi3 obj-d4-reading Digi3
attr Digi3 room Relais
attr Digi3 stateFormat {sprintf("%.0f ", ReadingsVal($name,"Digi3",0))}

#Rin4
define Digi4 ModbusAttr 1 2
attr Digi4 IODev VR400Mod
attr Digi4 dev-d-combine 5
attr Digi4 dev-d-defPoll 1
attr Digi4 obj-d8-reading Digi4
attr Digi4 room Relais
attr Digi4 stateFormat {sprintf("%.0f ", ReadingsVal($name,"Digi4",0))}


Leider reagiert Fhem nur wenn der E1 geschlossen wird. Allerdings werden in Fhem dann alles 4 als geschlossen angezeigt. Bitte um Hilfe.

lg
wolfgang
Raspberry Pi 3; 8xRelais; Aptodec Nano V3.0 Pro; FS1000a; RF-5V; Hama TS33C; 3x Brennerstuhl FunkSteckdosen; 9x Dooya funk Rollo; KWL Systemair VR400; Thermokon Modbusthermostat; diverse China Modbus Thermostate; 1-wire Bus; Telegram; QuickFhem; FhemNative; Firmata; Alexa ......

StefanStrobel

Hallo Wolfgang,

Was bedeutet die Ausgabe des Scanners denn?
Welche Register / Coils / digital inputs sind denn abgebildet?
In welchem Schalterzustand?

In jedem Fall ist aber die Definition falsch. Bei ModbusAttr definiert man ein Fhem-Gerät je Gerät mit einer Modbus-ID. Die verschiedenen Objekte dann per Attribute in dem einen Fhem-Gerät.

Gruß
   Stefan

wthiess

Hallo Stefan!
Ich definiere immer jedes Register extra. Hat aber auf die Funktion keinen Einfluss.
Nach Änderung keine Änderung der Funktion.
Hier meine Änderung in ein define.

#Rin1
define Digi1 ModbusAttr 1 2
attr Digi1 IODev VR400Mod
attr Digi1 dev-d-combine 5
attr Digi1 dev-d-defPoll 1
attr Digi1 obj-d1-reading D1
attr Digi1 obj-d2-reading D2
attr Digi1 obj-d4-reading D3
attr Digi1 obj-d8-reading D4
attr Digi1 room Relais
attr Digi1 stateFormat D1 D2 D3 D4


Bei
D1 reagiert auch D4
Bei D2 reagiert D2
D3 reagiert gar nicht
D4 reagiert D3



Digitaler Eingang 1: geschlossen
01 02 0D 01 01 01 01 01 01 01 01 01 01 01 01 01 2B 36
Digitaler Eingang 2: geschlossen
01 02 0D 02 02 02 02 02 02 02 02 02 02 02 02 02 46 D9
Digitaler Eingang 3: geschlossen
01 02 0D 04 04 04 04 04 04 04 04 04 04 04 04 04 9F 47
Digitaler Eingang 4: geschlossen
01 02 0D 08 08 08 08 08 08 08 08 08 08 08 08 08 2E 3A
Alle Digitalen Eingänge offen:
01 02 0D 00 00 00 00 00 00 00 00 00 00 00 00 00 F1 AC

Für mich bedeutet das 02=d 1,2,4,8 die Registerwerte.

Nachtrag:Gelöst
D1=1
D2=2
D3=3
D4=4

Warum?

lg
Wolfgang


Raspberry Pi 3; 8xRelais; Aptodec Nano V3.0 Pro; FS1000a; RF-5V; Hama TS33C; 3x Brennerstuhl FunkSteckdosen; 9x Dooya funk Rollo; KWL Systemair VR400; Thermokon Modbusthermostat; diverse China Modbus Thermostate; 1-wire Bus; Telegram; QuickFhem; FhemNative; Firmata; Alexa ......

wthiess

Hallo!

Habe noch eine weitere Frage.
Wie kann ich für mein 4Fach Relais die ID einstellen.
Ein Gerät hat die ID 1. Wenn ich 2 am Bus anschließe reagieren beide auf 1. Das Gerät hart keine Jumper oder Schalter.

In der Doku steht.
ID set   01 06 00 02 00 XX 1b 0a
ID read 00 03 00 02 00 XX 1b 0a

lg
Wolfgang

Raspberry Pi 3; 8xRelais; Aptodec Nano V3.0 Pro; FS1000a; RF-5V; Hama TS33C; 3x Brennerstuhl FunkSteckdosen; 9x Dooya funk Rollo; KWL Systemair VR400; Thermokon Modbusthermostat; diverse China Modbus Thermostate; 1-wire Bus; Telegram; QuickFhem; FhemNative; Firmata; Alexa ......

StefanStrobel

Hallo Wolfgang,

Zu Deiner vorletzten Frage:
Coils und discrete Inputs sind bei Modbus Bit-Werte, keine Register.
Ich vermute, dass Du hier einen Framedump gepostet hast (das war meine Frage zur Bedeutung der Ausgabe des Scanners):
Zitat
Digitaler Eingang 3: geschlossen
01 02 0D 04 04 04 04 04 04 04 04 04 04 04 04 04 9F 47
Das wäre dann die Antwort des Geräts auf einen Function Code 2 (Read Discrete Inputs) mit Länge 8*13 Bits (warum auch immer das so abgefragt wurde). Danach kommt die Checksummme.
01 ist vermutlich Die Id,
02 der FCode
0D die Länge der Antwort
04 das Byte in dem die ersten 8 Inputs bitweise kodiert sind

discrete Input 0 wäre dann das erste Bit, Input 1 das zweite, etc. und die Bitfolge 0100 (drittes Bit gesetzt bzw. discrete Input 3 gesetzt) ergibt dann im Protokoll die 4 als Byte.
Die ganze Kodiererei macht aber das Modul für Dich, deshalb

attr Digi1 obj-d3-reading D3



Zu Deiner zweiten Frage:

ID set   01 06 00 02 00 XX 1b 0a
ID read 00 03 00 02 00 XX 1b 0a


auch das sollen vermutlich Modbus Frames sein.
01 06 00 02 00 XX
könnte ID1, FCode 6 (write Holding Register), Adresse 0002, Wert bedeuten.

vermutlich antworten die Geräte alle auf ID0, was die zweite Zeile zum Lesen erklären könnte.
fcode 3 wäre read Holding Register ...

Mit entsprechenden Attributen kannst Du möglicherweise je ein Gerät anschließen und dann per set Befehl das passende Modbus-Frame erzeugen lassen.
Ob ich das richtig interpretiere kann ich nicht garantieren. Du musst das auf eigenes Risiko testen ;-)

Gruss
   Stefan

wthiess

Danke Stefan!

Aber ich verstehe nur Bahnhof.
Ein Gerät funktioniert super, aber ich habe 2 davon.
In einer anderen Beschreibung steht folgendes. Die ID ist wie folgt zu setzen:

set01  00 06 40 00 00 01 5c 1b
set02  00 06 40 00 00 02 1c 1a

Wie könnt ich das in Fhem machen?

lg
Wolfgang
Raspberry Pi 3; 8xRelais; Aptodec Nano V3.0 Pro; FS1000a; RF-5V; Hama TS33C; 3x Brennerstuhl FunkSteckdosen; 9x Dooya funk Rollo; KWL Systemair VR400; Thermokon Modbusthermostat; diverse China Modbus Thermostate; 1-wire Bus; Telegram; QuickFhem; FhemNative; Firmata; Alexa ......

StefanStrobel

Tja, da ist natürlich die erste Frage welche Anleitung korrekt ist.

Wenn die erste stimmt und im Holding Register 2 die Modbus-Id steht, dann kannst Du das als Objekt definieren und einen Set zulassen:

attr Digi1 obj-h2-reading BusID
attr Digi1 obj-h2-set 1


Mit

set Digi1 BusID 2

Kannst Du dann möglicherweise die ID auf 2 Setzen.

Wenn Du vorher noch ein

attr Digi1 verbose 5

eingibst, siehts Du im Log, wie daraus ein Frame erstellt wird.
Wenn Du beide Geräte dabei angeschlossen lässt, stellst Du beide auf ModbusId 2 und kannst erst wieder mit Ihnen reden, wenn Du auch in der Definition von Digi1 die neue ID angibst.
Deshalb würde ich nur eines der Geräte umstellen.

Wennn die Anleitung natürlich falsch ist, oder ich das falsch interpretiere, könnte Dein Gerät auch unbrauchbar werden ...

Gruß
    Stefan

wthiess

Danke Stefan für die Mühe!

Es klappt nicht. Ich mach einfach für die beiden 4er Relais je einen Bus. Kostet mich 3 Euro für USB Stick und 2 Drähte. Ich hab mir mehrere Windows-Tools zum programmieren runtergeladen. Aber egal was ich mache die ID ist immer 1.
Wäre cool gewesen, da die Dinger 4 Relais und 4 Eingänge haben und das um 10Euro.
Die Versionen die nur Relais haben kann man per Dipp's einstellen.

lg
Wolfgang
Raspberry Pi 3; 8xRelais; Aptodec Nano V3.0 Pro; FS1000a; RF-5V; Hama TS33C; 3x Brennerstuhl FunkSteckdosen; 9x Dooya funk Rollo; KWL Systemair VR400; Thermokon Modbusthermostat; diverse China Modbus Thermostate; 1-wire Bus; Telegram; QuickFhem; FhemNative; Firmata; Alexa ......

wthiess

Hallo Stefan!  [gelöst unter Windows]
Ich kanns doch nicht lassen. Wie interpretierst du das?
Also ich hab grad mit einem Windows Tool "CAS Modbus Scanner v1.02bD"
den wert: "00 06 40 00 00 02 1c 1a" zum Gerät gesendet.
4000 = 16384 somit h16385 mit 02
Super funktioniert.  Das Gerät reagiert auf ID2.
Ich kann nun alle ID's programmieren

Leider kommt bei Fhem die Meldung: wrong Device Id
Kann das Modul nicht auf ID 0 zugreifen?


lg
Wolfgang

Raspberry Pi 3; 8xRelais; Aptodec Nano V3.0 Pro; FS1000a; RF-5V; Hama TS33C; 3x Brennerstuhl FunkSteckdosen; 9x Dooya funk Rollo; KWL Systemair VR400; Thermokon Modbusthermostat; diverse China Modbus Thermostate; 1-wire Bus; Telegram; QuickFhem; FhemNative; Firmata; Alexa ......

der-Lolo

So, die letzten Tage waren einfach zu stressig, ich war auch nicht in der nähe des Systems...
Ich hänge hier mal ein list meines Wärmemengenzählers an:
Internals:
   DEF        35 30
   DEST
   INTERVAL   30
   IODev      HA_Modbus_1
   MODBUSID   35
   ModuleVersion 3.3.1 - 18.7.2016
   NAME       WMZ
   NR         83
   PROTOCOL   RTU
   STATE      opened
   TRIGGERTIME 1478631255.16376
   TRIGGERTIME_FMT 2016-11-08 19:54:15
   TYPE       ModbusAttr
   Helper:
     lsend      1478631229.37702
   Lastread:
Attributes:
   IODev      HA_Modbus_1
   dev-h-defPoll 1
   obj-h258-reading Durchfluss
   obj-h258-showget 1
   obj-h4-showget 1
   room       Modbus
   userattr   IODev dev-h-defPoll obj-h258-reading obj-h258-showget obj-h4-reading obj-h4-showget verbose


Hätte ich denn so eine minimal Konfiguration die etwas abfragt, oder fehlt noch was?

@Stefan, hast Du mal geschaut ob Du den Scanner bekommst? Wegen der ID bin ich immer noch unsicher...