FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: macfly am 30 Oktober 2023, 19:50:38

Titel: [gelöst] Werte eines Readings mit readingsChange aus einer Liste ersetzen
Beitrag von: macfly am 30 Oktober 2023, 19:50:38
Moin zusammen,

ich bastel mir gerade meine autarke Gartenhütte zusammen und möchte einige Victron-Messwerte, die ich über MQTT2_DEVICE bekomme, direkt ersetzen (und nicht mit userReadings noch vervielfältigen).

Dazu habe ich mir ein changereading gebastelt, das nur ab und zu so will, wie ich, und ich rätsele, warum das so ist.


das Reading lautet solarcharger288MppOperationModevalue, und kann die Werte 0, 1 oder 2 haben. Ich möchte das direkt zu "Off", "limited" und "mppt" ersetzen. mein readingsChange dazu, das funktioniert, sieht so aus:
defmod RC2_WR_Victron readingsChange WR_Victron (solarcharger288MppOperationModevalue) ^(.*)$ { \
      if ($1 == 0) { 'Off' } \
    elsif ($1 == 1) { 'limited' }\
    elsif ($1 == 2) { 'mppt' }\
}

Das readingsChange, das nicht funktioniert, sieht so aus:
defmod RC2_WR_Victron readingsChange WR_Victron (solarcharger288MppOperationModevalue) ^(.*)$ { \
    for ($1) {\
      when(0) { 'Off' } \
      when(1) { 'limited' }\
      when(2) { 'mppt' }\
  }\
}

Und was auch nicht funktioniert, ist:
defmod RC2_WR_Victron readingsChange WR_Victron (solarcharger288MppOperationModevalue) ^(.*)$ { \
    given ($1) {\
      when(0) { 'Off' } \
      when(1) { 'limited' }\
      when(2) { 'mppt' }\
  }\
}

Und jetzt grübel ich, wieso nur das häßliche if elsif elsif geht, und das etwas hübschere for oder given nicht.

Jemand dazu einen Tipp?
Titel: Aw: Werte eines Readings mit readingsChange aus einer Liste ersetzen
Beitrag von: TomLee am 30 Oktober 2023, 19:59:36
Mit readingsChange hab ich mich bisher noch nicht einmal beschäftigt und kann deshalb nichts dazu beitragen.

Ich kann mir gut vorstellen das Dir hier:
https://wiki.fhem.de/wiki/MQTT2-Module_-_Praxisbeispiele#Die_JSON-Daten_vor_dem_auspacken_manipulieren
das zweite Beispiel hilft das direkt in dem MQTT2_DEVICE umzusetzen ?
Titel: Aw: Werte eines Readings mit readingsChange aus einer Liste ersetzen
Beitrag von: macfly am 30 Oktober 2023, 20:29:53
Zitat von: TomLee am 30 Oktober 2023, 19:59:36Ich kann mir gut vorstellen das Dir hier:
https://wiki.fhem.de/wiki/MQTT2-Module_-_Praxisbeispiele#Die_JSON-Daten_vor_dem_auspacken_manipulieren
das zweite Beispiel hilft das direkt in dem MQTT2_DEVICE umzusetzen ?

hm, könnte, aber dann kommt ein Folgeproblem. Der Victron schickt alle Messwerte als json, z.B. so
{"value": 0}Mir ist dann nicht klar, wie ich im zweiten Beispiel auf die "0" in meinem json-payload zugreife...
Titel: Aw: Werte eines Readings mit readingsChange aus einer Liste ersetzen
Beitrag von: TomLee am 30 Oktober 2023, 20:40:16
Zeig mal ein List von dem Device und was genau unter diesem Topic solarcharger288MppOperationModevalue im "Traffic-Monitor" rein kommt.
Titel: Aw: Werte eines Readings mit readingsChange aus einer Liste ersetzen
Beitrag von: macfly am 30 Oktober 2023, 20:46:11
Internals:
   CID        venus
   DEF        venus
   FUUID      65292279-f33f-129d-ffde-9b9c279e6d362d4f
   IODev      venus
   LASTInputDev venus
   MSGCNT     257825
   NAME       WR_Victron
   NR         535
   STATE      0 W PV - 0 W AC
   TYPE       MQTT2_DEVICE
   eventCount 254372
   venus_MSGCNT 257825
   venus_TIME 2023-10-30 20:41:01
   Helper:
     DBLOG:
       battery289Dc0Currentvalue:
         logdb:
           TIME       1698681534.06606
           VALUE      0.0
       battery289Dc0Powervalue:
         logdb:
           TIME       1698681534.05839
           VALUE      0.0
       battery289Dc0Voltagevalue:
         logdb:
           TIME       1698646747.02219
           VALUE      5.949999809265137
       battery289Socvalue:
         logdb:
           TIME       1698679409.6322
           VALUE      98.80000305175781
       grid30AcL1Power:
         logdb:
           TIME       1698694861.39515
           VALUE      0
       grid30AcPowervalue:
         logdb:
           TIME       1698665000.87386
           VALUE      269.5
       system0DcBatteryVoltagevalue:
         logdb:
           TIME       1698682026.4264
           VALUE      1.4500000476837158
       system0DcPvCurrentvalue:
         logdb:
           TIME       1698681534.09876
           VALUE      0.0
       system0DcPvPowervalue:
         logdb:
           TIME       1698681534.09078
           VALUE      0.0
   JSONMAP:
     grid30AcL1Powervalue grid30AcL1Power
     grid30AcPowervalue grid30AcPower
   OLDREADINGS:
   READINGS:
     2023-10-30 16:53:15   battery289ConsumedAmphoursvalue -2.700000047683716
     2023-10-30 16:59:02   battery289Dc0Currentvalue 0.0
     2023-10-30 16:59:02   battery289Dc0Powervalue 0.0
     2023-10-30 16:59:06   battery289Dc0Voltagevalue 5.670000076293945
     2023-10-30 16:58:52   battery289TimeToGovalue 863999.9375
     2023-10-30 20:41:01   grid30AcL1Currentvalue 0.0
     2023-10-30 20:25:28   grid30AcL1EnergyForwardvalue 0.0
     2023-10-30 20:25:28   grid30AcL1EnergyReversevalue 2.0
     2023-10-30 20:41:01   grid30AcL1Powervalue 0
     2023-10-30 20:41:01   grid30AcL1Voltagevalue 232.4
     2023-10-30 16:58:54   solarcharger288Dc0Currentvalue 0.0
     2023-10-30 17:07:06   solarcharger288Dc0Voltagevalue 1.4500000476837158
     2023-10-30 16:30:02   solarcharger288HistoryDaily0Yieldvalue 0.1899999976158142
     2023-10-30 20:23:28   solarcharger288MppOperationModevalue Off
     2023-10-30 17:07:06   solarcharger288PvVvalue 6.730000019073486
     2023-10-30 20:22:48   solarcharger288Statevalue 0
     2023-10-30 17:00:02   solarcharger288YieldPowervalue 0.0
     2023-10-30 16:30:02   solarcharger288YieldSystemvalue 21.540000915527344
     2023-10-30 20:41:01   system0AcGridL1Currentvalue 0.004
     2023-10-30 20:41:01   system0AcGridL1Powervalue 0.0
     2023-10-30 16:59:02   system0DcBatteryCurrentvalue 0.0
     2023-10-30 16:59:02   system0DcBatteryPowervalue 0.0
     2023-10-30 16:58:52   system0DcBatteryTimeToGovalue 863999.9375
     2023-10-30 17:07:06   system0DcBatteryVoltagevalue 1.4500000476837158
     2023-10-30 16:58:54   system0DcPvCurrentvalue 0.0
     2023-10-30 16:58:54   system0DcPvPowervalue 0.0
     2023-10-30 16:59:02   system0DcSystemPowervalue 0.0
     2023-10-30 20:25:29   system0SystemStateBatteryLifevalue 0
     2023-10-30 20:25:29   system0SystemStateStatevalue 0
   hmccu:
Attributes:
   DbLogInclude grid30AcL1Powervalue,system0DcPvCurrentvalue,system0DcPvPowervalue,battery289Socvalue,battery289Dc0Powervalue,battery289Dc0Currentvalue,system0DcBatteryVoltagevalue
   IODev      venus
   group      PV-Anlage
   icon       measure_photovoltaic_inst
   readingList venus:N/e45f01b70d5a/battery/289/ConsumedAmphours:.* { json2nameValue($EVENT, 'battery289ConsumedAmphours', $JSONMAP) }
venus:N/e45f01b70d5a/battery/289/Dc/0/Current:.* { json2nameValue($EVENT, 'battery289Dc0Current', $JSONMAP) }
venus:N/e45f01b70d5a/battery/289/Dc/0/MidVoltage:.* { json2nameValue($EVENT, 'battery289Dc0MidVoltage', $JSONMAP) }
venus:N/e45f01b70d5a/battery/289/Dc/0/MidVoltageDeviation:.* { json2nameValue($EVENT, 'battery289Dc0MidVoltageDeviation', $JSONMAP) }
venus:N/e45f01b70d5a/battery/289/Dc/0/Power:.* { json2nameValue($EVENT, 'battery289Dc0Power', $JSONMAP) }
venus:N/e45f01b70d5a/battery/289/Dc/0/Voltage:.* { json2nameValue($EVENT, 'battery289Dc0Voltage', $JSONMAP) }
venus:N/e45f01b70d5a/battery/289/History/ChargeCycles:.* { json2nameValue($EVENT, 'battery289HistoryChargeCycles', $JSONMAP) }
venus:N/e45f01b70d5a/battery/289/History/ChargedEnergy:.* { json2nameValue($EVENT, 'battery289HistoryChargedEnergy', $JSONMAP) }
venus:N/e45f01b70d5a/battery/289/History/DischargedEnergy:.* { json2nameValue($EVENT, 'battery289HistoryDischargedEnergy', $JSONMAP) }
venus:N/e45f01b70d5a/battery/289/History/FullDischarges:.* { json2nameValue($EVENT, 'battery289HistoryFullDischarges', $JSONMAP) }
venus:N/e45f01b70d5a/battery/289/Soc:.* { json2nameValue($EVENT, 'battery289Soc', $JSONMAP) }
venus:N/e45f01b70d5a/battery/289/TimeToGo:.* { json2nameValue($EVENT, 'battery289TimeToGo', $JSONMAP) }
venus:N/e45f01b70d5a/grid/30/Ac/L1/Current:.* { json2nameValue($EVENT, 'grid30AcL1Current', $JSONMAP) }
venus:N/e45f01b70d5a/grid/30/Ac/L1/Energy/Forward:.* { json2nameValue($EVENT, 'grid30AcL1EnergyForward', $JSONMAP) }
venus:N/e45f01b70d5a/grid/30/Ac/L1/Energy/Reverse:.* { json2nameValue($EVENT, 'grid30AcL1EnergyReverse', $JSONMAP) }
venus:N/e45f01b70d5a/grid/30/Ac/L1/Power:.* { json2nameValue($EVENT, 'grid30AcL1Power', $JSONMAP) }
venus:N/e45f01b70d5a/grid/30/Ac/L1/Voltage:.* { json2nameValue($EVENT, 'grid30AcL1Voltage', $JSONMAP) }
venus:N/e45f01b70d5a/grid/30/Ac/L2/Current:.* { json2nameValue($EVENT, 'grid30AcL2Current', $JSONMAP) }
venus:N/e45f01b70d5a/solarcharger/288/Dc/0/Current:.* { json2nameValue($EVENT, 'solarcharger288Dc0Current', $JSONMAP) }
venus:N/e45f01b70d5a/solarcharger/288/Dc/0/Voltage:.* { json2nameValue($EVENT, 'solarcharger288Dc0Voltage', $JSONMAP) }
venus:N/e45f01b70d5a/solarcharger/288/History/Daily/0/Consumption:.* { json2nameValue($EVENT, 'solarcharger288HistoryDaily0Consumption', $JSONMAP) }
venus:N/e45f01b70d5a/solarcharger/288/History/Daily/0/Yield:.* { json2nameValue($EVENT, 'solarcharger288HistoryDaily0Yield', $JSONMAP) }
venus:N/e45f01b70d5a/solarcharger/288/MppOperationMode:.* { json2nameValue($EVENT, 'solarcharger288MppOperationMode', $JSONMAP) }
venus:N/e45f01b70d5a/solarcharger/288/Pv/V:.* { json2nameValue($EVENT, 'solarcharger288PvV', $JSONMAP) }
venus:N/e45f01b70d5a/solarcharger/288/State:.* { json2nameValue($EVENT, 'solarcharger288State', $JSONMAP) }
venus:N/e45f01b70d5a/solarcharger/288/Yield/Power:.* { json2nameValue($EVENT, 'solarcharger288YieldPower', $JSONMAP) }
venus:N/e45f01b70d5a/solarcharger/288/Yield/System:.* { json2nameValue($EVENT, 'solarcharger288YieldSystem', $JSONMAP) }
venus:N/e45f01b70d5a/system/0/Ac/Grid/L1/Current:.* { json2nameValue($EVENT, 'system0AcGridL1Current', $JSONMAP) }
venus:N/e45f01b70d5a/system/0/Ac/Grid/L1/Power:.* { json2nameValue($EVENT, 'system0AcGridL1Power', $JSONMAP) }
venus:N/e45f01b70d5a/system/0/Dc/Battery/Current:.* { json2nameValue($EVENT, 'system0DcBatteryCurrent', $JSONMAP) }
venus:N/e45f01b70d5a/system/0/Dc/Battery/Power:.* { json2nameValue($EVENT, 'system0DcBatteryPower', $JSONMAP) }
venus:N/e45f01b70d5a/system/0/Dc/Battery/Soc:.* { json2nameValue($EVENT, 'system0DcBatterySoc', $JSONMAP) }
venus:N/e45f01b70d5a/system/0/Dc/Battery/State:.* { json2nameValue($EVENT, 'system0DcBatteryState', $JSONMAP) }
venus:N/e45f01b70d5a/system/0/Dc/Battery/TimeToGo:.* { json2nameValue($EVENT, 'system0DcBatteryTimeToGo', $JSONMAP) }
venus:N/e45f01b70d5a/system/0/Dc/Battery/Voltage:.* { json2nameValue($EVENT, 'system0DcBatteryVoltage', $JSONMAP) }
venus:N/e45f01b70d5a/system/0/Dc/Charger/Power:.* { json2nameValue($EVENT, 'system0DcChargerPower', $JSONMAP) }
venus:N/e45f01b70d5a/system/0/Dc/FuelCell/Power:.* { json2nameValue($EVENT, 'system0DcFuelCellPower', $JSONMAP) }
venus:N/e45f01b70d5a/system/0/Dc/Pv/Current:.* { json2nameValue($EVENT, 'system0DcPvCurrent', $JSONMAP) }
venus:N/e45f01b70d5a/system/0/Dc/Pv/Power:.* { json2nameValue($EVENT, 'system0DcPvPower', $JSONMAP) }
venus:N/e45f01b70d5a/system/0/Dc/System/Power:.* { json2nameValue($EVENT, 'system0DcSystemPower', $JSONMAP) }
venus:N/e45f01b70d5a/system/0/SystemState/BatteryLife:.* { json2nameValue($EVENT, 'system0SystemStateBatteryLife', $JSONMAP) }
venus:N/e45f01b70d5a/system/0/SystemState/State:.* { json2nameValue($EVENT, 'system0SystemStateState', $JSONMAP) }

   room       Solar
   stateFormat {sprintf("%.0f W PV", (ReadingsVal($name,"solarcharger288YieldPowervalue",0) / 1) )  .  " - " . sprintf("%.0f W AC", (ReadingsVal($name,"grid30AcL1Powervalue",0) / 1) ) }
   verbose    4

Daten zu solarcharger288MppOperationModevalue  hab ich nicht, weil es jetzt dunkel ist und sich da nichts ändert, aber die anderen Messwerte sehen so aus:
2023.10.30 20:43:29 5: venus: received PUBLISH (0)1N/e45f01b70d5a/system/0/Ac/Consumption/L1/Current{"value": 0.004}
2023.10.30 20:43:29 5: venus: received PUBLISH (0) N/e45f01b70d5a/system/0/Ac/ActiveIn/L1/Current{"value": 0.004}
2023.10.30 20:43:29 5: venus: received PUBLISH (0) N/e45f01b70d5a/system/0/Timers/TimeOff{"value": 1556155}
2023.10.30 20:43:31 5: venus: received PUBLISH (0) N/e45f01b70d5a/grid/30/Ac/Current{"value": 0.0}
2023.10.30 20:43:31 5: venus: received PUBLISH (0) N/e45f01b70d5a/grid/30/Ac/L1/Current{"value": 0.0}
2023.10.30 20:43:31 5: venus: received PUBLISH (0) N/e45f01b70d5a/system/0/Ac/Grid/L1/Current{"value": 0.0}
2023.10.30 20:43:31 5: venus: received PUBLISH (0) N/e45f01b70d5a/system/0/Ac/ConsumptionOnInput/L1/Current{"value": 0}
2023.10.30 20:43:31 5: venus: received PUBLISH (0) N/e45f01b70d5a/system/0/Ac/Consumption/L1/Current{"value": 0}
2023.10.30 20:43:31 5: venus: received PUBLISH (0) N/e45f01b70d5a/system/0/Ac/ActiveIn/L1/Current{"value": 0.0}
2023.10.30 20:43:33 5: venus: received PUBLISH (0) N/e45f01b70d5a/grid/30/Ac/L1/Voltage{"value": 234.8}
2023.10.30 20:43:33 5: venus: received PUBLISH (0) N/e45f01b70d5a/grid/30/Ac/Voltage{"value": 234.8}
2023.10.30 20:43:35 5: venus: received PUBLISH (0) N/e45f01b70d5a/grid/30/Ac/L1/Voltage{"value": 234.9}
2023.10.30 20:43:35 5: venus: received PUBLISH (0) N/e45f01b70d5a/grid/30/Ac/Voltage{"value": 234.9}

ps: das ist auch der Grund, warum alle Readings auf "value" enden ....  ::)
Titel: Aw: Werte eines Readings mit readingsChange aus einer Liste ersetzen
Beitrag von: TomLee am 30 Oktober 2023, 20:58:37
Ich denke ich kann Dir zeigen wie es geht, dazu muss ich mich aber kurz eindenken und brauch ein paar Minuten am PC, jetzt geht gerade nicht, später oder morgen.
Titel: Aw: Werte eines Readings mit readingsChange aus einer Liste ersetzen
Beitrag von: TomLee am 31 Oktober 2023, 13:13:04
Ersetze mal diesen readingList-Eintrag:
venus:N/e45f01b70d5a/solarcharger/288/MppOperationMode:.* { json2nameValue($EVENT, 'solarcharger288MppOperationMode', $JSONMAP) }
durch diesen
venus:N/e45f01b70d5a/solarcharger/288/MppOperationMode:.* { my $ret=json2nameValue($EVENT, 'solarcharger288MppOperationMode', $JSONMAP);my %hret = %$ret;;my %h=(0=>'Off',1=>'limited',2=>'NurPV',3=>'mppt');return { OperationMode=>$h{$hret{solarcharger288MppOperationModevalue}}}}
klappt das ?
Du solltest ein Reading OperationMode erhalten welches den gemappten Wert enthält.

OperationMode in dem return kannst du nennen wie du willst und sparst Dir die Verwendung von dem Attribut jsonMap solltest du mal die Readings umbenennen wollen.
Titel: Aw: Werte eines Readings mit readingsChange aus einer Liste ersetzen
Beitrag von: betateilchen am 31 Oktober 2023, 13:18:03
Warum ein hash und kein array?
Das Szenario ist doch nix weiter als ein enum.
Titel: Aw: Werte eines Readings mit readingsChange aus einer Liste ersetzen
Beitrag von: macfly am 31 Oktober 2023, 13:22:56
Zitat von: betateilchen am 31 Oktober 2023, 13:18:03Warum ein hash und kein array?
Das Szenario ist doch nix weiter als ein enum.
diese Beispiel ja, das nächste wäre
/State                    <-- 0=Off
                              2=Fault
                              3=Bulk
                              4=Absorption
                              5=Float
                              6=Storage
                              7=Equalize
                              252=External control
da sind Lücken drin, also passt hash schon ...
Titel: Aw: Werte eines Readings mit readingsChange aus einer Liste ersetzen
Beitrag von: TomLee am 31 Oktober 2023, 13:54:03
Etwas kürzer, davor schreiben kann man ja was man will, warum dann nicht gleich nutzen als Readingname:

{ my $rn = 'OperationMode';my $ret=json2nameValue($EVENT, $rn, $JSONMAP);my %hret = %$ret;my %h=(0=>'Off',1=>'limited',2=>'NurPV',3=>'mppt');return { $rn=>$h{$hret{$rn.'value'}}}}
Titel: Aw: Werte eines Readings mit readingsChange aus einer Liste ersetzen
Beitrag von: macfly am 31 Oktober 2023, 14:33:32
jepp, so scheint das gut zu funktionieren.

Das erklärt zwar nicht, wieso das readingsChange nicht funktioniert, aber so sind es insgesamt für fhem weniger Schritte, also weniger Last.

Dankeschön!
Titel: Aw: [gelöst] Werte eines Readings mit readingsChange aus einer Liste ersetzen
Beitrag von: TomLee am 31 Oktober 2023, 14:54:01
Es funzt auch mit Array, ich hab keine Probleme mit den Lücken oder hab ich was falsch verstanden ?

{ my $EVENT='{"value": 1}';;my $rn = 'OperationMode';;my $ret=json2nameValue($EVENT, $rn);;my %hret = %$ret;;my @a=('Off','limited','Nur PV');;print $a[$hret{$rn.'value'}]}
Titel: Aw: [gelöst] Werte eines Readings mit readingsChange aus einer Liste ersetzen
Beitrag von: TomLee am 31 Oktober 2023, 16:31:47
Ah, ich hab die 252 nicht sehen wollen, dachte die Leerzeichen waren gemeint.