Wechselrichter Status von Zahl in eindeutigen Text ändern

Begonnen von punker, 15 Februar 2024, 09:01:38

Vorheriges Thema - Nächstes Thema

punker

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)}
LG

Dieter

The truth is out there!

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Beta-User

#2
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.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

punker

@betateilchen @Beta-User Danke,
habs jetzt einfach mit eventMap gemacht, ging mir ja nur um die Anzeige.

LG

Dieter

The truth is out there!