Hallo an die Modbus-Gemeinde,
ich habe gerade ein Brett vorm Kopf, da ich es nicht hinbekomme einen Wert an einen Modbus Slave zu schreiben.
Ich habe einen Dummy als Slider definiert, der soweit auch funktioniert und im Event Monitor bei Änderung den eingestellten Wert anzeigt.
Dann habe ich einen Modbus RTU Master definiert, der von einen UVR610 MB (Technische Alternative [Regler für meine Solarthermieanlage]) schon eine ganze Zeit die Istwerte ausliest.
Soweit auch alles schick.
Da der Regler noch nicht so ganz optimal funktioniert wollte ich mir über fhem ein Möglichkeit schaffen mit den PID-Parametern des Reglers im UVR610 zu spielen. (Remote Zugriff von extern)
Hier beginnt mein Dilemma, denn ich kriege es einfach nicht gebacken von dem definierten Dummy des Sliders den Wert an das obj-h0- setexpr zu übergeben bzw erstmal einen Festwert auf dieses setexpr zu legen.
So könnte ich wenigstens prüfen ob der Wert am UVR610 ankommt, den ich dann im UVR610 durchschliefe und wieder als Input Register einlese.
hier mal das list des Slider:
Internals:
FUUID 5ee8f54a-f33f-03d5-1c74-7cc0c94fa86d5091
NAME Sol_PID_P_S
NR 171
STATE 12.0
TYPE dummy
Helper:
DBLOG:
state:
DBLogging:
TIME 1592419045.56303
VALUE 12.0
READINGS:
2020-06-17 20:37:25 state 12.0
Attributes:
room 0.1 Solarthermie
setList state:slider,12,0.2,24,1
webCmd state:18:19:20:21
und hier vom ModbusAttr zum UVR610:
Internals:
DEF 10 10
FUUID 5ed3752a-f33f-03d5-d280-c2d2914d107c0f69
INTERVAL 10
IODev ModbusUVR610
MODBUSID 10
MODE master
MODULEVERSION Modbus 4.1.5 - 17.9.2019
NAME UVR610_01
NOTIFYDEV global
NR 162
NTFY_ORDER 50-UVR610_01
PROTOCOL RTU
STATE opened
TRIGGERTIME 1592420869.54562
TRIGGERTIME_FMT 2020-06-17 21:07:49
TYPE ModbusAttr
lastUpdate 1592420859.54562
FRAME:
Helper:
DBLOG:
P1_PWM:
DBLogging:
TIME 1592420850.24872
VALUE 0
P1_PWM2:
DBLogging:
TIME 1592420850.35708
VALUE 5
Sol_PID_P_I:
DBLogging:
TIME 1592420849.77417
VALUE 0
Sol_PID_P_S:
DBLogging:
TIME 1592420849.88549
VALUE 0
T_Kollektor1:
DBLogging:
TIME 1592420849.99431
VALUE 50.6
T_Kollektor4:
DBLogging:
TIME 1592420859.82495
VALUE 64.7
T_Kollektor_Frost:
DBLogging:
TIME 1592420859.56265
VALUE 42.9
T_Speicher1_mitte:
DBLogging:
TIME 1592420859.71542
VALUE 57.7
T_Speicher1_oben:
DBLogging:
TIME 1592420850.46617
VALUE 62.8
T_Speicher2_unten:
DBLogging:
TIME 1592420850.57611
VALUE 38.6
READ:
READINGS:
2020-06-17 21:07:30 P1_PWM 0
2020-06-17 21:07:30 P1_PWM2 5
2020-06-15 22:09:09 SOL_Reg_P_I 0
2020-06-17 21:07:29 Sol_PID_P_I 0
2020-06-17 21:07:29 Sol_PID_P_S 0
2020-06-16 18:30:13 Sol_PID_P_S.* 0
2020-06-15 22:31:49 Sol_PID_P_S:Wert 0
2020-06-15 23:27:15 Sol_PID_P_S:Werteliste .* 0
2020-06-15 23:16:40 Sol_PID_P_S:Werteliste.* 0
2020-06-17 19:42:10 Sol_PID_P_S:state 0
2020-06-17 19:48:43 Sol_PID_P_S:state.* 0
2020-06-17 21:07:29 T_Kollektor1 50.6
2020-06-17 21:07:39 T_Kollektor4 64.7
2020-06-17 21:07:39 T_Kollektor_Frost 42.9
2020-06-17 21:07:39 T_Speicher1_mitte 57.7
2020-06-17 21:07:30 T_Speicher1_oben 62.8
2020-06-17 21:07:30 T_Speicher2_unten 38.6
2020-06-17 19:19:54 [2] 0
2020-06-17 20:16:46 state opened
REMEMBER:
lrecv 1592420859.82227
lsend 1592420859.94718
gotReadings:
T_Kollektor4 64.7
lastRead:
h0 1592420849.88395
i0 1592420859.82362
i10 1592420849.99284
i12 1592420850.2471
i14 1592420850.35575
i2 1592420850.46487
i4 1592420859.71415
i48 1592420849.77287
i6 1592420850.57406
i8 1592420859.56129
Attributes:
IODev ModbusUVR610
event-min-interval .*
obj-h0-len 2
obj-h0-poll 1
obj-h0-reading Sol_PID_P_S
obj-h0-set 1
obj-h0-setexpr $val*10
obj-i0-expr $val/10
obj-i0-len 2
obj-i0-poll 1
obj-i0-reading T_Kollektor4
obj-i0-unpack s>
obj-i10-expr $val/10
obj-i10-len 2
obj-i10-poll 1
obj-i10-reading T_Kollektor1
obj-i10-unpack s>
obj-i12-expr $val/10
obj-i12-len 2
obj-i12-poll 1
obj-i12-reading P1_PWM
obj-i12-unpack s>
obj-i14-expr $val/10
obj-i14-len 2
obj-i14-poll 1
obj-i14-reading P1_PWM2
obj-i14-unpack s>
obj-i2-expr $val/10
obj-i2-len 2
obj-i2-poll 1
obj-i2-reading T_Speicher1_oben
obj-i2-unpack s>
obj-i4-expr $val/10
obj-i4-len 2
obj-i4-poll 1
obj-i4-reading T_Speicher1_mitte
obj-i4-unpack s>
obj-i48-expr $val/10
obj-i48-len 2
obj-i48-poll 1
obj-i48-reading Sol_PID_P_I
obj-i48-unpack s>
obj-i6-expr $val/10
obj-i6-len 2
obj-i6-poll 1
obj-i6-reading T_Speicher2_unten
obj-i6-unpack s>
obj-i8-expr $val/10
obj-i8-len 2
obj-i8-poll 1
obj-i8-reading T_Kollektor_Frost
obj-i8-unpack s>
room 0.1 Solarthermie
userattr obj-h0-expr obj-h0-len obj-h0-poll obj-h0-reading obj-h0-set obj-h0-setexpr obj-h0-unpack obj-i0-expr obj-i0-len obj-i0-poll obj-i0-reading obj-i0-unpack obj-i10-expr obj-i10-len obj-i10-poll obj-i10-reading obj-i10-unpack obj-i12-expr obj-i12-len obj-i12-poll obj-i12-reading obj-i12-unpack obj-i14-expr obj-i14-len obj-i14-poll obj-i14-reading obj-i14-unpack obj-i2-expr obj-i2-len obj-i2-poll obj-i2-reading obj-i2-unpack obj-i4-expr obj-i4-len obj-i4-poll obj-i4-reading obj-i4-unpack obj-i48-expr obj-i48-len obj-i48-poll obj-i48-reading obj-i48-unpack obj-i6-expr obj-i6-len obj-i6-poll obj-i6-reading obj-i6-unpack obj-i8-expr obj-i8-len obj-i8-poll obj-i8-reading obj-i8-unpack
Wäre toll wenn mir mal jemand auf die Sprünge helfen könnte.
Viele Grüße
Wolfgang
Hallo Wolfgang,
ich kenne jetzt Modbus nicht und auch das Modul etc. nicht...
Aber es sieht (zumindest was ich verstehe) so aus als wolltest du "einfach" per Dummy-Slider ein Attribut setzen!?
Wenn dem so ist:
EventMonitor öffnen (Filter setzen) und am "Dummy drehen".
Dann sollten Events kommen...
Einen passenden Markieren und (mittels: create/modify) ein Notify anlegen lassen.
Das "leere" notify bzw. den "Ausführungsteil" (ist bei "leeren" notify vom EventMonitor einfach: { } ) dann anpassen, in etwa so:
{Log3(undef, 1, "Testnotify Event: $EVENT")}
Damit wird wenn du am dummy drehst die Logausgabe gemacht.
Somit kannst du sehen was "in" $EVENT steht.
Wenn dort was drin steht was ins Attribut soll, dann diesen teil nehmen: split oder auch mal mit $EVTPART0, $EVTPART1, ... versuchen.
Wenn nichts passt, dann eben beim Dummy "abfragen": ReadingsVal, Value, ...
mittels: fhem("attr UVR610_01 obj-h0-setexpr Wert") kannst du innerhalb Perl (falls du im Notify innerhalb von { } bleibst/bleiben musst [z.B. weil du ReadingsVal "brauchst"]) ansonsten eben ohne die "fhem-Funktion" drumrum...
EDIT: hier mal ein Beispiel, für den Fall, dass das was in $EVTPART1 steht ins Attribut soll (ob bzw. was passt bzw. ins Attribut soll kannst nur du wissen ;) )
{ fhem("attr UVR610_01 obj-h0-setexpr $EVTPART1") }
ANMERKUNG: wenn du ein Attribut änderst, änderst du die Konfiguration! D.h. es erscheint das "rote Fragezeichen"! Wenn du kein "save" nach schickst sind die Einstellungen bei "shutdown restart" WEG! "Einfach" ein save hinterher schicken hat das Risiko, dass etwas gespeichert wird, was du nicht wolltest... Also mal drüber nachdenken...
Weitere Anmerkung: dein remote Zugriff von extern ist hoffentlich ABGESICHERT!!!
Wenn du dann mal das notify hast einfach hier posten und auch mal posten was genau in $EVENT steht...
Alternative zu notify: userReadings im dummy. Ja das legt dann ein weiteres Reading im Dummy an (einfach ignorieren ;) ), man (sollte) kann aber da ja auch das Attribut setzen...
Gruß, Joachim
:o Bis gestern stand ich am Abgrund, heute bin ich ein Schritt weiter :-[
Manche Sachen kann man schon 100 mal gemacht haben und sie trotzdem wieder komplett aus dem Gedächtnis verlieren. :'(
Damit so etwas für mich als Gedächtnisstütze zum nachschauen bleibt die komplette funktionierende Variante.
notify, ReadingsVal, set fhem sind die Stichworte.
hier das list für den kleinen Controller UVR610 MB (mit Modbus RTU):
Internals:
DEF 10 10
FUUID 5ed3752a-f33f-03d5-d280-c2d2914d107c0f69
INTERVAL 10
IODev ModbusUVR610
MODBUSID 10
MODE master
MODULEVERSION Modbus 4.1.5 - 17.9.2019
NAME UVR610_01
NOTIFYDEV global
NR 162
NTFY_ORDER 50-UVR610_01
PROTOCOL RTU
STATE opened
TRIGGERTIME 1592468369.37447
TRIGGERTIME_FMT 2020-06-18 10:19:29
TYPE ModbusAttr
lastUpdate 1592468359.37447
FRAME:
Helper:
DBLOG:
P1_PWM:
DBLogging:
TIME 1592468359.6134
VALUE 23
P1_PWM2:
DBLogging:
TIME 1592468360.38023
VALUE 0
Sol_PID_1P_S:
DBLogging:
TIME 1592468360.05197
VALUE 8
Sol_PID_P_I:
DBLogging:
TIME 1592468359.72499
VALUE 8.1
T_Kollektor1:
DBLogging:
TIME 1592468359.94133
VALUE 45.7
T_Kollektor4:
DBLogging:
TIME 1592468359.83241
VALUE 66.5
T_Kollektor_Frost:
DBLogging:
TIME 1592468359.39369
VALUE 38.7
T_Speicher1_mitte:
DBLogging:
TIME 1592468359.50368
VALUE 50.2
T_Speicher1_oben:
DBLogging:
TIME 1592468360.16106
VALUE 55.1
T_Speicher2_unten:
DBLogging:
TIME 1592468360.27168
VALUE 31.5
state:
DBLogging:
TIME 1592467899.36426
VALUE Sol_PID_1P_S 8.1
READ:
READINGS:
2020-06-18 10:19:19 P1_PWM 23
2020-06-18 10:19:20 P1_PWM2 0
2020-06-15 22:09:09 SOL_Reg_P_I 0
2020-06-18 10:19:20 Sol_PID_1P_S 8
2020-06-18 10:19:19 Sol_PID_P_I 8.1
2020-06-17 22:56:27 Sol_PID_P_S 0
2020-06-16 18:30:13 Sol_PID_P_S.* 0
2020-06-15 22:31:49 Sol_PID_P_S:Wert 0
2020-06-15 23:27:15 Sol_PID_P_S:Werteliste .* 0
2020-06-15 23:16:40 Sol_PID_P_S:Werteliste.* 0
2020-06-17 19:42:10 Sol_PID_P_S:state 0
2020-06-17 19:48:43 Sol_PID_P_S:state.* 0
2020-06-18 10:19:19 T_Kollektor1 45.7
2020-06-18 10:19:19 T_Kollektor4 66.5
2020-06-18 10:19:19 T_Kollektor_Frost 38.7
2020-06-18 10:19:19 T_Speicher1_mitte 50.2
2020-06-18 10:19:20 T_Speicher1_oben 55.1
2020-06-18 10:19:20 T_Speicher2_unten 31.5
2020-06-17 19:19:54 [2] 0
2020-06-18 10:10:56 state opened
REMEMBER:
lrecv 1592468360.37747
lsend 1592468360.37144
gotReadings:
P1_PWM2 0
lastRead:
h0 1592468360.05057
i0 1592468359.83104
i10 1592468359.93999
i12 1592468359.61198
i14 1592468360.37883
i2 1592468360.1596
i4 1592468359.50214
i48 1592468359.72308
i6 1592468360.2701
i8 1592468359.39239
Attributes:
IODev ModbusUVR610
event-min-interval .*
obj-h0-len 2
obj-h0-poll 1
obj-h0-reading Sol_PID_1P_S
obj-h0-set 1
obj-h0-setexpr $val*10
obj-i0-expr $val/10
obj-i0-len 2
obj-i0-poll 1
obj-i0-reading T_Kollektor4
obj-i0-unpack s>
obj-i10-expr $val/10
obj-i10-len 2
obj-i10-poll 1
obj-i10-reading T_Kollektor1
obj-i10-unpack s>
obj-i12-expr $val/10
obj-i12-len 2
obj-i12-poll 1
obj-i12-reading P1_PWM
obj-i12-unpack s>
obj-i14-expr $val/10
obj-i14-len 2
obj-i14-poll 1
obj-i14-reading P1_PWM2
obj-i14-unpack s>
obj-i2-expr $val/10
obj-i2-len 2
obj-i2-poll 1
obj-i2-reading T_Speicher1_oben
obj-i2-unpack s>
obj-i4-expr $val/10
obj-i4-len 2
obj-i4-poll 1
obj-i4-reading T_Speicher1_mitte
obj-i4-unpack s>
obj-i48-expr $val/10
obj-i48-len 2
obj-i48-poll 1
obj-i48-reading Sol_PID_P_I
obj-i48-unpack s>
obj-i6-expr $val/10
obj-i6-len 2
obj-i6-poll 1
obj-i6-reading T_Speicher2_unten
obj-i6-unpack s>
obj-i8-expr $val/10
obj-i8-len 2
obj-i8-poll 1
obj-i8-reading T_Kollektor_Frost
obj-i8-unpack s>
room 0.1 Solarthermie
userattr obj-h0-expr obj-h0-len obj-h0-poll obj-h0-reading obj-h0-set obj-h0-setexpr obj-h0-unpack obj-i0-expr obj-i0-len obj-i0-poll obj-i0-reading obj-i0-unpack obj-i10-expr obj-i10-len obj-i10-poll obj-i10-reading obj-i10-unpack obj-i12-expr obj-i12-len obj-i12-poll obj-i12-reading obj-i12-unpack obj-i14-expr obj-i14-len obj-i14-poll obj-i14-reading obj-i14-unpack obj-i2-expr obj-i2-len obj-i2-poll obj-i2-reading obj-i2-unpack obj-i4-expr obj-i4-len obj-i4-poll obj-i4-reading obj-i4-unpack obj-i48-expr obj-i48-len obj-i48-poll obj-i48-reading obj-i48-unpack obj-i6-expr obj-i6-len obj-i6-poll obj-i6-reading obj-i6-unpack obj-i8-expr obj-i8-len obj-i8-poll obj-i8-reading obj-i8-unpack
dann der Dummy Slider:
Internals:
FUUID 5ee8f54a-f33f-03d5-1c74-7cc0c94fa86d5091
NAME Sol_PID_1P_S
NR 171
STATE 8.1
TYPE dummy
Helper:
DBLOG:
state:
DBLogging:
TIME 1592467899.30305
VALUE 8.1
READINGS:
2020-06-18 10:11:39 state 8.1
Attributes:
room 0.1 Solarthermie
setList state:slider,2,0.1,10,1
webCmd state:1:2:3:4:5:6:7:8:9:10
und zu guter letzt auch noch das notify:
Internals:
DEF Sol_PID_1P_S:.* {my $sliderval01 = ReadingsVal("Sol_PID_1P_S","state",""); fhem ("set UVR610_01 Sol_PID_1P_S $sliderval01");}
FUUID 5eeb131e-f33f-03d5-249d-b0232e6dcf9a6d26
NAME Sol_PID_1P_S_slide
NOTIFYDEV Sol_PID_1P_S
NR 173
NTFY_ORDER 50-Sol_PID_1P_S_slide
REGEXP Sol_PID_1P_S:.*
STATE 2020-06-18 10:11:39
TRIGGERTIME 1592467899.35156
TYPE notify
READINGS:
2020-06-18 10:10:56 state active
Attributes:
room 0.1 Solarthermie
kaum macht man richtig, schon gehts.
Mal ne Nacht drüber schlafen kann auch helfen.
Liebe Grüße
Wolfgang
Hallo Joachim,
vielen Dank.
Ist mir irgendwann auch wieder eingefallen.
Ich gehe heute auch nicht mehr vorm Spiegel, wegen der roten Ohren. :-[
Grüße
Wplfgang
Hallo Wolfgang,
kommt vor ;)
Setzt du noch ein [gelöst] vor den ersten Post, danke.
Viel Spaß dann weiterhin!
Gruß, Joachim