FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: punker am 15 Februar 2024, 09:01:38

Titel: Wechselrichter Status von Zahl in eindeutigen Text ändern
Beitrag von: punker am 15 Februar 2024, 09:01:38
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)}
Titel: Aw: Wechselrichter Status von Zahl in eindeutigen Text ändern
Beitrag von: betateilchen am 15 Februar 2024, 09:19:02
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.
Titel: Aw: Wechselrichter Status von Zahl in eindeutigen Text ändern
Beitrag von: Beta-User am 15 Februar 2024, 09:28:33
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_Statusdahingehend ä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.
Titel: Aw: Wechselrichter Status von Zahl in eindeutigen Text ändern
Beitrag von: punker am 15 Februar 2024, 10:59:48
@betateilchen @Beta-User Danke,
habs jetzt einfach mit eventMap gemacht, ging mir ja nur um die Anzeige.