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

oniT

Hallo Stefan,

ich habe auf Basis von ModbusSet und ModbusTrovis5576 ein Modul erstellt. Dieses läuft mit Modbus TCP, also wie im Beispiel:


define WP ModbusAttr 1 60 192.168.1.122:502 TCP


Das Problem ist nun, dies funktioniert nur wenn zusätzlich ein Device mit dem Modul Modbus angelegt wird. Auch wenn es überhaupt kein Modbus RTU gibt und der USB Port überhaupt nicht dafür verwendet wird ist es notwendig, da fhem sonst abstürzt oder erst überhaupt nicht mehr startet.


define ModBusLine Modbus /dev/ttyUSB1@9600


Internals:
   BUSY       0
   DEF        /dev/ttyUSB1@9600,8,N,1
   DeviceName /dev/ttyUSB1@9600,8,N,1
   LASTOPEN   1478634066.47763
   NAME       rs232
   NR         38
   PARTIAL
   RAWBUFFER
   STATE      disconnected
   TYPE       Modbus
   nextOpenDelay 60
   Readings:
     2016-11-06 22:32:34   state           disconnected
Attributes:


Ist das wirklich notwendig oder irgendwo ein Fehler?

Mir ist klar, das dies bei Modbus RTU notwendig ist um das Protokoll mit Baudrate usw. usf. anzulegen. Aber bei Modbus TCP? Da nützt dies ja im Prinzip nichts.

Danke
Gruß
Tino
BBB - debian weezy - FHEM 5.7
HMLAN - HM-LC-Bl1-FM, HM-ES-PMSw1-PI, HM-LC-Sw1-FM, HM-TC-IT-WM-W-EU, HM-WDS40-TH-I, HM-Sen-Wa-Od, HM-Sec-RHS
Dimplex Wärmepumpe / Dimplex ZL 300 - Modbus TCP
SDM630M - Modbus TCP
SolarLog 200 / SMA SonnyBoy 1.5/2.5 - Modbus TCP

StefanStrobel

Hallo Wolfgang,

Das Modul hält bisher 0 für eine ungültige ID.
Du müsstest Deine Relais aber auch statt mit 0 mit der korrekten ID ansprechen können. 0 scheint bei den Teilen ja nur als Broadcast verwendet zu werden.

Schau doch bei Interesse mal hier: http://modbus.org/specs.php

Gruß
    Stefan

StefanStrobel

Hallo Tino,

Dein Modul sollte eigentlich in der Init-Funktion dafür sorgen, dass das Basismodul geladen wird und das sollte reichen. Ich schau mal ob da noch ein Fehler drin ist...

Gruß
    Stefan

StefanStrobel

Hallo der-Lolo,

Der Scanner ist in Arbeit. Ich hatte da noch ein paar Ideen, wie der Scanner auch gleich Attribute für Register anlegen könnte.

Gruss
    Stefan

wthiess

Hallo Stefan

Ich hab das Ding mit 00 06 40 00 00 02 1c 1a programmiert. Das ist ID0.
Ist aber nicht so dragisch da ich eh ein Windowstool habe um es zu programmieren.  Wäre nur schön wenn diese Sperre augehoben wird.
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,

Nur für den Fall dass wir hier aneinander vorbei geredet haben:
ID 0 ist keine gültige ID für ein Gerät sondern die Broadcast-Adresse. Das bedeutet dass ein Request an ID0 von allen am Bus angeschlossenen Geräten verarbeitet wird. In Deiner Anleitung wird deshalb auch zum Auslesen ein Request an Adresse 0 gesendet um die tatsächlich im angeschlossenen Gerät eingestellte ID abzufragen. In so einem Fall ist die eingestellte ID ja unbekannt und deshalb ist ein Broadcast die einzig sinnvolle Möglichkeit.

Mit 00 06 40 00 00 02 1c 1a hast Du für alle am Bus angeschlossenen Geräte das Holding-Register 4000 auf den Wert 2 gesetzt. Jetzt kannst Du mit dem Gerät über ID2 kommunizieren. ID0 wird nicht mehr benötigt.
Auch zum Ändern eines Geräts von ID1 auf ID2 hättest Du eigentlich über Fhem einen Request an ID1 schicken und das Register 4000 (umgerechnet in Dez) mit 2 beschreiben können.

Dennoch ist es vermutlich eine gute Idee auch Broadcasts bei Modbus per Fhem zu ermöglichen und setze das gerne auf die Wunschliste für de nächste Version :-)

Gruss
    Stefan

StefanStrobel

Hallo Wolfgang,

mir ist gerade noch was aufgefallen:
Du hattest mal geschrieben

4000 = 16384 somit h16385 mit 02


Das Modbus-Modul beginnt so wie das Protokoll bei 0 mit dem Zählen.
Für die Attribute wäre das deshalb obj-h16384-...
Sonst schreibst Du in hex 4001.

Gruß
   Stefan

der-Lolo

Super Stefan,
Danke für die Nachricht! Ab Dienstag wird geheizt. Ich füttere DBLog also direkt mit Daten...

Bjoernar

Welche Zähler verwendest du eigentlich und was hat er gekostet? Ich habe leider damals nur einen mit Impulsausgang für die Leistung bekommen bzw. die mit Modbus waren mir viel zu teuer. Aber damit habe ich natürlich keine genaue Erfassung.

Gesendet von meinem Moto G (4) mit Tapatalk


der-Lolo

Mir war der Kamstrup eigentlich auch viel zu teuer, aber ich wollte nicht ohne messbarkeit ins rennen gehen...
Was günstigeres habe ich aber auch nicht gefunden. Die mit Modbus sind wirklich wahnsinnig teuer.

wthiess

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 ......

pejonp

Hallo,

ich nutze einen DRT710M von B+G Tech. Den gibt es dort nicht mehr.
Hier ein anderes Modell SDM530-Modbus.
http://bg-etech.de/os/product_info.php/cPath/25_28/products_id/417

Für den SDM630 (http://bg-etech.de/os/product_info.php/products_id/421) gibt es auch schon ein Modul 98_ModbusSDM630M.pm (https://forum.fhem.de/index.php/topic,25315.msg274011.html#msg274011) .

pejonp
LaCrossGW 868MHz:WT470+TFA+TX37-IT+EMT7110+W136+WH25A HP1003+WH2621
SignalD(CC1101):Bresser+WS-0101(868MHz WH1080)+Velux KLF200+MAX!+HM-MOD-UART:Smoke HM-SEC-SD+VITOSOLIC 200 RESOL VBUS-LAN+SolarEdge SE5K(Modbus)+Sonnen!eco8(10kWh)+TD3511+DRT710M(Modbus)+ZigBee+Z-Wave+MQTT+vitoconnect

der-Lolo

 ;)
Danke für die Info...
den Strom zähle ich auch mit zwei SDM630M - das funktioniert auch mittlerweile ohne nennenswerte probleme. Zusätzlich habe ich einen Wärmemengenzähler der Fa. Kamstrup. Im bereich Wärmemenge ist es nicht ganz so einfach einen geeigneten Zähler mit Modbus Schnittstelle auszuwählen...

Bjoernar

Hallo,

dank der minus Grade habe ich mit meinem Lüftungsanlage ein Problem.

Ich frage die Temperatur des Außenluft mit folgenden Eintrag ab:

"h217" => {
name => "REG_HC_TEMP_IN5", # internal name of this register in the hardware doc
reading => "REG_HC_TEMP_IN5", # name of the reading for this value
set => 0, # this value can be set
expr => '$val/10',
}


Das funktionier mit plus Temperaturen auch wunderbar.
Bei negativen werten bekomme ich immer sehr hohe Werte.
Den höchsten Wert den ich gefunden habe ist 6553,5C° ich vermute das hiermit dann -0,5°C gemeint sind. Also 6554-6553,5=0,5

Kann meine verutung so richtig sein?
Und wenn ja wie sorge ich dafür das die werte richtig umgewandelt werden?

Gruß
Björnar

StefanStrobel

Hallo,

aus dem Wiki zu ModbusAttr:
Zitat
obj-[cdih][1-9][0-9]*-unpack
defines the unpack code to convert the raw data string read from the device to a reading. For an unsigned integer in big endian format this would be "n", for a signed 16 bit integer in big endian format this would be "s>" and for a 32 bit big endian float value this would be "f>". (see the perl documentation of the pack function).

in einem Modul auf Basis von 98_Modbus.pm wird entsprechend ein Hash-Eintrag mit Namen unpack vergeben. Wenn nichts angegeben ist, wird "n"angenommen (unsigned int). Besser wäre im konkreten Fall vermutlich "s" oder "s>".

Gruss 
    Stefan