Hi,
wie kann ich das Status-Reading (0 - 8 ) meines Wechselrichters in einen eindeutigen Begriff (z.B. Idle oder OnGrid) ändern?
Mittels Stateformat?
Internals:
CID mqtt2server
DEF mqtt2server
FUUID 65c36a96-f33f-81d5-873b-c109d2e621129d9d
IODev mqtt2server
LASTInputDev mqtt2server
MSGCNT 5016
NAME FoxESS_WR
NR 872
STATE PVGesamt - 490.0 W / Batterie - 15 %
TYPE MQTT2_DEVICE
eventCount 5016
mqtt2server_CONN mqtt2server_192.168.2.23_35938
mqtt2server_MSGCNT 5016
mqtt2server_TIME 2024-02-15 09:04:30
READINGS:
2024-02-15 09:04:30 31002_PV1_Leistung 181
2024-02-15 09:04:30 31005_PV2_Leistung 309
2024-02-15 08:53:57 31038_Battery_SoC 15
2024-02-15 06:51:38 31041_Inverter_Status 2
2024-02-14 08:03:06 IODev mqtt2server
2024-02-15 09:04:30 WRLeistungGesamt 490
Attributes:
autocreate 1
disable 0
fp_wohnung 723,1633,3,WRLeistungGesamt,PV Erzeugung (W)
readingList mqtt2server:modbus/0/holdingRegisters/31002\x20PV1\x20Leistung:.* 31002_PV1_Leistung
mqtt2server:modbus/0/holdingRegisters/31005\x20PV2\x20Leistung:.* 31005_PV2_Leistung
mqtt2server:modbus/0/holdingRegisters/31038\x20Battery\x20SoC:.* 31038_Battery_SoC
mqtt2server:modbus/0/holdingRegisters/31041\x20Inverter\x20Status:.* 31041_Inverter_Status
room Energie
stateFormat {sprintf("PVGesamt - %.1f W / Batterie - %.0f %%",ReadingsVal($name,"WRLeistungGesamt",0),ReadingsVal($name,"31038_Battery_SoC",0))}
userReadings WRLeistungGesamt {return ReadingsVal("FoxESS_WR","31002_PV1_Leistung",0) + ReadingsVal("FoxESS_WR","31005_PV2_Leistung",0)}
Wenn man mit Zahlen aus readings arbeiten möchte, sollte man besser mit ReadingsNum() anstatt ReadingsVal() arbeiten, insbesondere, wenn man dabei noch auf die Idee kommt, als default-Value 0 anzugeben, anstatt "0".
Um Deine Frage nach der Zuordung von Zahlen zu Texten zu beantworten: am einfachsten geht sowas, in dem man die Texte in ein Array packt und dann auf die Werte des Arrays zugreift.
Sowas in der Art:
my @texte = ("Wert_0","Wert_1");
my $val = 1;
return $texte[$val];
Da das Ganze, in ein userReading gepackt, ziemlich unübersichtlich werden kann, empfiehlt es sich, das in eine Funktion in die 99_myUtils.pm auszulagern und im userReading die Funktion aufzurufen.
stateFormat wäre etwas Kosmetik für die Anzeige. Hat seine Vorteile, die Zahlenwerte lassen sich z.B. besser als SVG darstellen.
Für "echten Text" könntest du die Zeile
modbus/0/holdingRegisters/31041\x20Inverter\x20Status:.* 31041_Inverter_Status
dahingehend ändern, dass "hinten" Perl aufgerufen wird und als Ergebnis (per Hash-Rückgabe) sowohl der Ausgangswert wie die "Übersetzung" mit ausgegeben wird.
Ungetestet (und nur für 2 Beispielwerte):
modbus/0/holdingRegisters/31041\x20Inverter\x20Status:.* { my %rets; $rets{31041_Inverter_Status} = $EVENT; my %translates = ("1" => "standby","2" => "producing"); $rets{state} = $translates{$EVENT} if defined $translates{$EVENT}; return \%rets; }
Oder eben - wie von betateilchen vorgeschlagen (und wenn die Werte sauber durchnummeriert sind) - über ein Array statt über ein Hash zuordnen.
@betateilchen @Beta-User Danke,
habs jetzt einfach mit eventMap gemacht, ging mir ja nur um die Anzeige.