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

Vielen Dank für's Testen!

anbei noch mal eine neuere Version, bei der das mit $rest behoben sein sollte und auch das Logging aufgehübscht ist.
Ich hoffe, dass keine neuen Fehler reingeraten sind ...

Gruss
    Stefan

pejonp

Hallo Stefan,

jetzt kommt kein Hinweis mehr. Kann auch keinen Fehler feststellen. Läuft.

Tschüß Jörg
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

Allgaeuer

Hallo Stefan,

bei mir ist's auch ok - keinen Fehler nach "rereadcfg" festgestellt (sowohl ModbusRTU als auch ModbusTCP).

Gruß Allgäuer

der-Lolo

Hallo Stefan,
der Scanner ist da jetzt aber noch nicht drin, oder?

StefanStrobel

Hallo,

ich habe die neue Version jetzt eingecheckt. Der Scanner ist da noch nicht drin sondern wird zunächst hier im Forum als nächste Testversion kommen.

Gruss
    Stefan

StefanStrobel

Hallo,

ich habe mal angefangen die Scan-Funktionen neu ins Modul einzubauen. Hier ist ein erster Entwurf für das Scannen von Holding-Registern.
Mit

attr MyModbusAttrDevice enableControlSet 1
set MyModbusAttrDevice scanModbusObjects h100-120

würde er die Holding-Register von 100 bis 120 anfragen und wenn eine Antwort kommt entsprechende Readings und Attribute erzeugen.

Die erzeugten Readings sehen dann z.B. so aus:

scan-h100 hex=0021, len=2, string=.!, s=8448, s>=33, S=8448, S>=33


Mit

set MyModbusAttrDevice scanModbusObjects h100-120 2

würde er jeweils 2 Register anfragen und entsprechend auch weitere Interpretationen der Daten anzeigen:

scan-h102 hex=0032012c, len=4, string=.2.,, s=12800, s>=50, S=12800, S>=50, i=12800, i>=50, I=12800, I>=50, f=1.83597581582262e-12, f>=4.59219519743886e-39


Das ganze ist noch weit entfernt von fertig, aber wer schon mal testen möchte kann das gerne tun.

Gruss
   Stefan

der-Lolo

Hm, ich habe das ganze jetzt mal einfach so reingeworfen in meine Installation.

Im Log finde ich folgendes... Toll wäre wenn Du mir jetzt sagst das dort zumindest ein Gerät antwortet...

Achtung - reverse Logs!

2016.11.28 22:48:20 5: SW: 2303006600022296
2016.11.28 22:48:20 4: HA_Modbus_1: HandleSendQueue sends fc 3 to 35, tid 85 for  (h102), len 2)
2016.11.28 22:48:20 4: HA_Modbus_1: timeout waiting for 3 from 35, Request was 230300650002d296, last Buffer:
2016.11.28 22:48:18 5: SW: 230300650002d296
2016.11.28 22:48:18 4: HA_Modbus_1: HandleSendQueue sends fc 3 to 35, tid 128 for  (h101), len 2)
2016.11.28 22:48:18 4: HA_Modbus_1: timeout waiting for 3 from 35, Request was 2303006400028356, last Buffer:
2016.11.28 22:48:16 5: SW: 2303006400028356
2016.11.28 22:48:16 4: HA_Modbus_1: HandleSendQueue sends fc 3 to 35, tid 181 for  (h100), len 2)
2016.11.28 22:48:15 3: WMZ: Scan h from 100 to 120 len 2
2016.11.28 22:48:15 3: WMZ: Scan setVal h100-120 2, 3=120, 4=, 5=2
2016.11.28 22:48:10 4: HA_Modbus_1: timeout waiting for 3 from 35, Request was 23030102000122b4, last Buffer:
2016.11.28 22:48:08 5: SW: 23030102000122b4
2016.11.28 22:48:08 4: HA_Modbus_1: HandleSendQueue sends fc 3 to 35, tid 73 for Durchfluss (h258), len 1)
2016.11.28 22:48:08 5: HA_Modbus_1: ParseFrames got 15 readings from ParseObj
2016.11.28 22:48:07 4: HA_Modbus_1: ParseFrames got fcode 4 from 2, tid 0, values 3f18520e3fe47b15000000004393aa2c0000000043a0f03400000000c30001083f6a2f1a00000000c1be9ddc00000000424820b04413d9fc3e7ced91417747ae42a54fdf4415eee145340f27439069e6 request was for i46 (Current_Avr__A), len 40 for module ModbusZaehler2
2016.11.28 22:48:07 5: HA_Modbus_1: raw read: 45340f27439069e62a84
2016.11.28 22:48:07 5: HA_Modbus_1: ParseFrames: wait for more data (70 / 80)
2016.11.28 22:48:07 5: HA_Modbus_1: raw read: 000000004393aa2c0000000043a0f03400000000c30001083f6a2f1a00000000c1be9ddc00000000424820b04413d9fc3e7ced91417747ae42a54fdf4415eee1
2016.11.28 22:48:07 5: HA_Modbus_1: ParseFrames: wait for more data (6 / 80)
2016.11.28 22:48:07 5: HA_Modbus_1: raw read: 0204503f18520e3fe47b15
2016.11.28 22:48:07 5: SW: 0204002e0028902e
2016.11.28 22:48:07 4: HA_Modbus_1: HandleSendQueue sends fc 4 to 2, tid 29 for Current_Avr__A (i46), len 40)
2016.11.28 22:48:06 4: HA_Modbus_1: CheckDelay commDelay for ModbusZaehler2 not over, try again in 0.555817127227783
2016.11.28 22:48:06 5: HA_Modbus_1: ParseFrames got 3 readings from ParseObj
2016.11.28 22:48:06 4: HA_Modbus_1: ParseFrames got fcode 4 from 2, tid 0, values 3fb00c170000000000000000 request was for i258 (Current_L1_demand__A), len 6 for module ModbusZaehler2
2016.11.28 22:48:06 5: HA_Modbus_1: raw read: 0000000000ffef
2016.11.28 22:48:06 5: HA_Modbus_1: ParseFrames: wait for more data (5 / 12)
2016.11.28 22:48:06 5: HA_Modbus_1: raw read: 040c3fb00c17000000
2016.11.28 22:48:06 5: HA_Modbus_1: raw read: 02
2016.11.28 22:48:06 5: SW: 020401020006d007
2016.11.28 22:48:06 4: HA_Modbus_1: HandleSendQueue sends fc 4 to 2, tid 9 for Current_L1_demand__A (i258), len 6)
2016.11.28 22:48:06 4: HA_Modbus_1: CheckDelay commDelay for ModbusZaehler2 not over, try again in 0.234207153320312
2016.11.28 22:48:06 4: HA_Modbus_1: CheckDelay commDelay for ModbusZaehler2 not over, try again in 0.599462032318115
2016.11.28 22:48:06 5: HA_Modbus_1: ParseFrames got 3 readings from ParseObj
2016.11.28 22:48:06 4: HA_Modbus_1: ParseFrames got fcode 4 from 2, tid 0, values 439f4b870000000000000000 request was for i12 (Power_L1__W), len 6 for module ModbusZaehler2
2016.11.28 22:48:06 5: HA_Modbus_1: raw read: 02040c439f4b8700000000000000002a5c
2016.11.28 22:48:06 5: SW: 0204000c0006b038
2016.11.28 22:48:06 4: HA_Modbus_1: HandleSendQueue sends fc 4 to 2, tid 220 for Power_L1__W (i12), len 6)
2016.11.28 22:48:06 5: HA_Modbus_1: ParseFrames got 13 readings from ParseObj
2016.11.28 22:48:05 4: HA_Modbus_1: ParseFrames got fcode 4 from 101, tid 0, values 44888c6e00000000448899dd00000000c1f2474e3f7fe73f00000000bfc9989300000000424820d543d2b9ba000000003f35810642294ed943d3d24045005a8b448707c5 request was for i52 (Power_Sum__W), len 34 for module ModbusZaehler1
2016.11.28 22:48:05 5: HA_Modbus_1: raw read: 65044444888c6e00000000448899dd00000000c1f2474e3f7fe73f00000000bfc9989300000000424820d543d2b9ba000000003f35810642294ed943d3d24045005a8b448707c58c75
2016.11.28 22:46:39 3: WMZ: Scan h from 100 to 120 len 2
2016.11.28 22:46:39 3: WMZ: Scan setVal h100-120 2, 3=120, 4=, 5=2
2016.11.28 22:44:57 1: PERL WARNING: Use of uninitialized value in string eq at ./FHEM/98_Modbus.pm line 719.
2016.11.28 22:43:47 3: WMZ: Scan h from 100 to 120 len 1
2016.11.28 22:43:47 3: WMZ: Scan setVal h100-120, 3=120, 4=, 5=
2016.11.28 22:43:47 1: PERL WARNING: Use of uninitialized value $5 in concatenation (.) or string at ./FHEM/98_Modbus.pm line 1694.
2016.11.28 22:43:47 1: PERL WARNING: Use of uninitialized value $4 in concatenation (.) or string at ./FHEM/98_Modbus.pm line 1694.
2016.11.28 22:42:42 3: DbRep DbRep - connected

Bjoernar

Hallo,

irgendwie scheint das disable noch nicht zu greifen auch wenn es vielleicht nicht mehr nötig wäre.

Obwohl Wechselrichter1 seit 18:45:05 bereits auf disable steht versucht das Modul weiter eine Verbindung aufzubauen. Oder liegt das daran das noch Einträge in der Warteschlange sind?


2016.11.29 18:47:10 3: Wechselrichter1: 8 successive timeouts, setting state to disconnected
2016.11.29 18:47:12 3: Wechselrichter1: 9 successive timeouts, setting state to disconnected
2016.11.29 18:47:14 3: Wechselrichter1: 10 successive timeouts, setting state to disconnected
2016.11.29 18:47:16 3: Wechselrichter1: 11 successive timeouts, setting state to disconnected
2016.11.29 18:47:18 3: Wechselrichter1: 12 successive timeouts, setting state to disconnected
2016.11.29 18:47:20 3: Wechselrichter1: 13 successive timeouts, setting state to disconnected
2016.11.29 18:47:22 3: Wechselrichter1: 14 successive timeouts, setting state to disconnected


Gruß
Björnar

wthiess

Hallo Stefan!

Habe ein neues Termostat. Leider komme ich damit nicht zurecht.
In meinem Windows Programm kann ich mit
01 03 00 3B 00 00  die Temperatur auslesen
als ergebnis bekomme ich
01 03 00 3B 00 1B = ID1, Code3/h-lesen, Register 59 , 27Grad
Wenn ich in Fhem mit h59 lese bekomme ich 15104.0 Grad

Beim sollwert schreiben mit h57 kann ich mit "set Temperatur 22" den Sollwert auf 22 Grad setzten bekomme aber in Fhem kurz danach 14592 angezeigt. Irgendwie liest Fhem nicht richtig.

Laut Doku: Reading Temperatur register Adress 3BH


Wo liegt mein Fehler?
Habe den Scanner ausprobiert. Verstehe ich überhaupt nicht.

lg
Wolfgang

Hier die Doku und ein Bild von meiner Windowstestsoftware


Product Description
FL-W301 Electric room thermostat is featured by unique design and simple operation. Super-luxurious appearance, LED backlight touch keys as well as LCD display showing the room temperature, setting temperature, fan speed and time. It controls the fan speed or electrical cool and heat valve switch and ideal for places installed two or four pipes central air-condition.

Features
IR remote controllable
Three grades fan speed intelligent controlled with cooling, heating and auto mode
LED backlight control keys, easy identification even in darkness
Energy saving up to 30%

Specification
RS485 interface
Defrost (low temperature protection)
Clock, Sleep and Timer
IR remote control(optional)
Blue Backlight
Working Status: Cool, hot, wind
Technical parameters

MODBUS Operation Manual
1,MODBUS communications
Temperature controller to modify the internal registers is controlled by 485,output control.MODBUS RTU communication protocol using standard communication protocols.Serial port settings:Baud Rate
"9600", Parity bit"no",Data bits"8" Stop bits"1".

1.1Communication format
Communication machine No
Command code
Data address
communication data
CRC Check
1Byte
1Byte
2Byte
2Byte
2Byte

1.2 Communication Machine NO.
1----32

1.3 Command code
Command code
operating content
03H
Read the specified address data
06H
setting the specified address data
83H
the error returned

1.4 Communication paradigm
For example, PC sends the following command
Communication machine No
Command code
Data address
communication data
CRC Check
01H
03H
003BH
0001H
F5C7H
Command interpreter: Reading the indoor temperature, the register address 3BH
Rreturn the same command, proved successful reception and return temperature is 25 degrees.
Communication machine No
Command code
Data address
communication data
CRC Check
01H
03H
003BH
001EH
B40FH
Communication error is returned:
Communication machine No
Command code
address

CRC Check
01H
83H
03H
0131H
then resend the command until the reception was successful

2. Register address map
register address
register description
66H
Setting mode "01"cold ,"00"heater, "02", ventilation
3AH
Lock up and down keys adjustment, 0 unlock 1 lock
3BH
Room temperature
39H
setting temperature
60H
Switch control 00 shutdown,01 starting up
65H
Set the wind speed 0 low 1 medium 2 high 



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

Zitat von: wthiess am 29 November 2016, 22:25:00
....
Habe ein neues Termostat. Leider komme ich damit nicht zurecht.
... Register 59 , 27Grad
Wenn ich in Fhem mit h59 lese bekomme ich 15104.0 Grad
...
Wo liegt mein Fehler?
..
Hallo wthiess,

wenn du das Register 59 auslesen möchtest musst du h58 definieren. Immer einen weniger.

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

wthiess

Weis ich. Jab schon vieles probiert.

Gesendet von meinem SM-N9005 mit Tapatalk

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

meine config:
define Thermchina Modbus /dev/serial/by-id/usb-1a86_USB2.0-Serial-if00-port0@9600,8,N,1

#ist Temperatur
define Temp_WZ ModbusAttr 1 3
attr Temp_WZ IODev Thermchina
attr Temp_WZ dev-h-combine 5
attr Temp_WZ dev-h-defPoll 1
attr Temp_WZ obj-h58-reading Temperatur
attr Temp_WZ room Modbus
attr Temp_WZ stateFormat {sprintf("%.1f Grad", ReadingsVal($name,"Temperatur",0))}


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

Also die Werte in der Doku sind nicht -1 zu rechnen. Ich kann z.B. mit h96 das Thermostat aus oder einschalten. Allerdings die anzeige passt nicht. Angezeigt bekomme ich "24576" egal ob aus oder ein. "0 oder 1" sollte es sein. auch die Solltemperatur kann ich steuern, aber nicht abfragen.

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

So jetzt hab ich mal den Scanner aktiviert
Raumtemperatur auslesen.
scan-h59
hex=3b001a, len=3, string=;.., s=59, s>=15104, S=59, S>=15104, i=59, i>=15104, I=59, I>=15104, f=, f>=
Also die Antwort = 3b 00 1a  1a wäre ja 26Grad. Aber wie stelle ich das dar?

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,

Ich versuche mal ein paar Fragen in einem Post zu beantworten:
@Wolfgang:
In Deiner Konfiguration fehlt die Definition des Datentyps und der Länge. Das macht man bei ModbusAttr über den unpack-Code und Len. Beispiele sollten im Wiki stehen.
Bei Deinem Versuch mit dem Scanner wundere ich mich über Len=3. Wie hast Du den Scanner aufgerufen?
Versuch doch einfach mal h56-59 ohne Längenangabe.
Die erzeugten Readings enthalten dann auch gleich die Ausgabe für verschiedene unpack-Codes.
In Deinem Fall passt es wegen dem Len=3 nicht. 001a wäre ok, aber 3b001a ist eben nicht 26.
Vielleicht ist da aber auch noch ein Bug im neuen Modul und das 3b kommt nicht aus einem Register.

Ob 58 h58 oder h57 sein sollte kann man leider nie genau sagen, da die Hersteller mal bei 0 und mal bei 1 zu zählen beginnen. Es kommt also drauf an ...
ModbusAttr macht es so wie das Protokoll.

In jedem Fall wäre es für mich hilfreich bei Problemen einen Auschnitt aus dem Log mit verbose 5 zu sehen. Dann sehe ich was wirklich gesendet wurde und was das Fhem-Modul empfängt und daraus macht.

@Bjoernar:
Du hast recht, wenn disable gesetzt wird, lösche ich die Queue bisher nicht. Es kommen zwar keine neuen Requests mehr dazu, aber die alten werden noch abgearbeitet. Das ergänze ich noch.

@der-Lolo:
Ich mus Dich enttäuschen. Der erste Entwurf vom Scanner scannt erst die Objekteu eines bekannten Geräts.
Das Scannen auf dem Bus nach IDs kommt beim nächsten Mal mit :-)

Gruß
    Stefan