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?
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 ?
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...
Zeig mal ein List von dem Device und was genau unter diesem Topic solarcharger288MppOperationModevalue im "Traffic-Monitor" rein kommt.
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 .... ::)
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.
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.
Warum ein hash und kein array?
Das Szenario ist doch nix weiter als ein enum.
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 ...
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'}}}}
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!
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'}]}
Ah, ich hab die 252 nicht sehen wollen, dachte die Leerzeichen waren gemeint.