[gelöst] ModbusAttr mit setexpr Werte an einen Slave schreiben

Begonnen von klickerkram, 17 Juni 2020, 21:12:43

Vorheriges Thema - Nächstes Thema

klickerkram

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

MadMax-FHEM

#1
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
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

klickerkram

 :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

klickerkram

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

MadMax-FHEM

Hallo Wolfgang,

kommt vor ;)

Setzt du noch ein [gelöst] vor den ersten Post, danke.

Viel Spaß dann weiterhin!

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)