MQTT2_DEVICE - Werte aus Readings mappen, Anwendungsfall go-e

Begonnen von naerschhersch, 25 April 2022, 08:57:01

Vorheriges Thema - Nächstes Thema

naerschhersch

Hallo miteinander,

ich sitze seit einiger Zeit meinem Projekt, eine Steuerung zur PV-Überschussladung zwischen E3DC S10E Pro und go-e Charger (Hardware V3, API V2) zu bauen.
Was habe ich bisher alles geschafft?

  • E3DC wird via Modbus ausgelesen
  • PV-Überschuss wird korrekt ermittelt, in Ampere umgerechnet
  • go-e Charger wird über die HTTP-V2-API (Dokumentation) gesteuert und ausgelesen

Wo liegt also mein Problem, sodass ich auf MQTT wechseln möchte?
Ich möchte den go-e Charger ohne Verzögerung und mit Intervallen kleiner 10s abfragen. Wird dies über die HTTP-API getan, kommen vergleichsweise häufig leere Antworten ohne Inhalt zurück.
So stieß ich auf MQTT, womit sich mein Ziel (vermutlich) erreichen lassen sollte.

Konkret stoße ich jetzt aber auf zwei Probleme:

  • Ich bin vom HTTPMOD gewohnt, den Wert eines Readings mappen zu lassen. Das findet bei mir unter bei dem Key frc (0:neutral, 1:aus, 2:an) Anwendung, da die Zahlen nicht inuitiv sind. Ich vermisse diese Möglichkeit beim MQTT2_DEVICE, übersehe ich etwas? Gibt es alternative Möglichkeiten hierfür?
  • Ein ähnliches Problem ergibt sich auch bei "setList". Auch hier möchte ich nicht die Auswahl "0,1,2", sondern "neutral, aus, an" haben. Die Wörter sollen dann wie beim HTTPMOD mit der Funktion setXXIMap in die zugehörigen Zahlen übersetzt werden.
Das Attribut setList hat im Moment folgende Werte: Leistung:selectnumbers,6,1,16,0,lin /go-eCharger/XXXXXX/amp/set $EVTPART1
Start/Stop:0,1,2 /go-eCharger/XXXXXX/frc/set $EVTPART1
Phasenzahl:1,2 /go-eCharger/XXXXXX/psm/set $EVTPART1


Kann mir hierzu jemand helfen? Ich suche mir schon seit geraumer Zeit einen Wolf und finde dazu nichts.
Ich hoffe auf eine Lösung ohne unnötige userReadings.
Danke im Vorraus.

Otto123

#1
Moin,

zu 1. attr jsonMap
ZitatjsonMap oldReading1:newReading1 oldReading2:newReading2...
space or newline separated list of oldReading:newReading pairs.
Used in the automatically generated readingList json2nameValue function to map the generated reading name to a better one. E.g.
attr m2d jsonMap SENSOR_AM2301_Humidity:Humidity
attr m2d readingList tele/sonoff/SENSOR:.* { json2nameValue($EVENT, 'SENSOR_', $JSONMAP) }
The special newReading value of 0 will prevent creating a reading for oldReading.
zu 2. klar geht das, Du musst lediglich Deine Events "übersetzen"
Eine Variante aus meinem "Rasenmäher"
PartyMode:on,off { my %hash = ( 'on' => 2, 'off' => 1);qq($DEVICETOPIC/commandIn {"sc":{"m":$hash{$EVTPART1}}})}

Also bei Dir (ungetestet)
Start/Stop:0,1,2 { my %hash = ( '0' => 'neutral', '1' => 'aus', '2' => 'an');qq(/go-eCharger/XXXXXX/frc/set $hash{$EVTPART1}) }

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

naerschhersch

#2
Hallo,
danke für die schnelle Antwort.

Der Tip zu 2. hilft auf jeden Fall, danke für das Entfernen des Brettes vor dem Kopf.
Dein für mich übertragener Code ist leider falsch herum, so funktioniert er aber: Start/Stop:neutral,aus,an { my %hash = ( 'neutral' => '0', 'aus' => '1', 'an' => '2');qq(/go-eCharger/XXXXXX/frc/set $hash{$EVTPART1}) }

Allerdings habe ich ebendieses zu 1. noch vor dem Kopf und glaube, dass wir uns falsch verstanden haben: Ich möchte nicht das Reading mappen, sondern den WERT des Readings. Geht das auch damit? Wenn ja - ich wäre über einen weiteren Schubs sehr erfreut.

Otto123

#3
ach so ok, falsch verstanden. Klar siehe 2. :) nur "andersherum"
Also ein kurzer Perlcode wo Du die Werte übersetzt.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

naerschhersch

Das würde dann ein UserReading sein oder geht es auch anders?

Otto123

das ginge auch, aber Du kannst doch dort direkt in der readingList den Code reinschreiben:
so schreibe ich den Wert in zwei andere Readings, jetzt muss Du $EVENT vorbehandeln.
$DEVICETOPIC/StatusStateAttribute/status:.* { {"state"=>$EVENT,"cleanerState"=>$EVENT} }
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

naerschhersch

Super, funktioniert. Danke dir.
Zum Beispiel:
go_echarger_XXXXXX:/go-eCharger/XXXXXX/trx:.* {my %n=( 'null' => 'kein Nutzer', '0' => 'ohne Karte', '1' => 'Nutzer 1' );; return { 'go-eCharger_057808_trx' =>$n{$EVENT}}}

Beta-User

Hinweis:
zumindest früher war die MQTT-Schnittstelle (zumindest nach meinem Verständnis) etwas "lieblos" - es wurden einfach "immer alle" Werte gepublisht...
Siehe dazu auch https://forum.fhem.de/index.php/topic,115620.0.html. Vielleicht ist der Code in https://forum.fhem.de/index.php/topic,115620.msg1099670.html#msg1099670 interessant ;) .
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

naerschhersch

Zitat von: Beta-User am 25 April 2022, 10:22:38
Hinweis:
zumindest früher war die MQTT-Schnittstelle (zumindest nach meinem Verständnis) etwas "lieblos" - es wurden einfach "immer alle" Werte gepublisht...
Siehe dazu auch https://forum.fhem.de/index.php/topic,115620.0.html. Vielleicht ist der Code in https://forum.fhem.de/index.php/topic,115620.msg1099670.html#msg1099670 interessant ;) .

Durchaus, möglicherweise. Ich sehe mir das mal an. Danke dir für den Link.

naerschhersch

#9
Zitat von: Beta-User am 25 April 2022, 10:22:38
Hinweis:
zumindest früher war die MQTT-Schnittstelle (zumindest nach meinem Verständnis) etwas "lieblos" - es wurden einfach "immer alle" Werte gepublisht...
Siehe dazu auch https://forum.fhem.de/index.php/topic,115620.0.html. Vielleicht ist der Code in https://forum.fhem.de/index.php/topic,115620.msg1099670.html#msg1099670 interessant ;) .

Wie ich das sehe funktioniert der Code leider nur für die go-e MQTT-API V1. Ich kann diese an meinem V3 aber nicht abrufen. Unter /status kommt nichts, er liefert für jeden Key ein eigenes Topic.
Dokumenationen: V1 vs. V2

Beta-User

Zitat von: naerschhersch am 25 April 2022, 11:15:32
Wie ich das sehe funktioniert der Code leider nur für die go-e MQTT-API V1. Ich kann diese an meinem V3 aber nicht abrufen. Unter /status kommt nichts, er liefert für jeden Key ein eigenes Topic.
Das klingt einerseits danach, als wäre da was passiert, was an sich gut ist, aber mir dreut, dass die Lösung jetzt trotzdem nicht unbedingt "gut" ist...

Hintergrund: Jede message dürfte dann jeweils eine eigene Event-Loop auslösen, und wenn das genauso "pauschal" gelöst ist wie früher, ist das nochmal deutlich mehr load für FHEM wie wünschenswert und sinnvoll... Du solltest in jedem Fall mal den Event-Monitor im Hinblick auf das Ding beobachten.

Falls man die Art und Weise beeinflussen kann, wie gepublisht wird, würde ich in jedem Fall die JSON-Variante wählen, falls da alle/mehrere Werte auf einmal drin sind. (Dann sollte man auch den Code irgendwie nutzen bzw. anpassen können)
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

naerschhersch

Zitat von: Beta-User am 25 April 2022, 11:23:56
Das klingt einerseits danach, als wäre da was passiert, was an sich gut ist, aber mir dreut, dass die Lösung jetzt trotzdem nicht unbedingt "gut" ist...
Ja, da scheint sich etwas getan haben.
Jetzt kommt für jede Änderung eine Message rein, quasi im Sekundentakt. Dafür kommen sie nicht mehr alle gesammelt, sondern getrennt, das eben nur die Änderung geschickt wird.

Zitat von: Beta-User am 25 April 2022, 11:23:56
Du solltest in jedem Fall mal den Event-Monitor im Hinblick auf das Ding beobachten.

Ich beschränke die events, da ich sonst durch DOIFs sowieso schon ein Loop auslösen würde (wie kann man das verhindern?).
So bekomme ich zwar jede Sekunde aktuelle Daten, schreibe aber nur für einen Teil davon bei Veränderung ein Event. Die UserReadings, die DOIFs alle paar Sekunden triggern müssen (_set am Ende), haben ein event-on-update-reading bekommen.

Zitat von: Beta-User am 25 April 2022, 11:23:56
Falls man die Art und Weise beeinflussen kann, wie gepublisht wird, würde ich in jedem Fall die JSON-Variante wählen, falls da alle/mehrere Werte auf einmal drin sind. (Dann sollte man auch den Code irgendwie nutzen bzw. anpassen können)
Kann man leider nicht.

Ich hab dir hier nochmal das List von dem Device angehangen:
Internals:
   CID        go_echarger_XXXXXX
   DEF        go_echarger_XXXXXX
   FUUID      62659de8-f33f-6332-cdc2-1baaa38ecf935cb2
   IODev      m2s
   LASTInputDev m2s
   MSGCNT     10061
   NAME       goe_mqtt
   NR         70
   STATE      go-eCharger_XXXXXX_amp A - Status go-eCharger_XXXXXX_car
   TYPE       MQTT2_DEVICE
   m2s_CONN   m2s_192.168.178.49_50738
   m2s_MSGCNT 10061
   m2s_TIME   2022-04-25 12:22:34
   JSONMAP:
     go-eCharger_XXXXXX_nrg_1 nrg_Spannung_L1
     go-eCharger_XXXXXX_nrg_10 nrg_Leistung_L3
     go-eCharger_XXXXXX_nrg_11 nrg_Leistung_N
     go-eCharger_XXXXXX_nrg_12 nrg_Leistung_gesamt
     go-eCharger_XXXXXX_nrg_13 nrg_Leistung_Faktor_L1
     go-eCharger_XXXXXX_nrg_14 nrg_Leistung_Faktor_L2
     go-eCharger_XXXXXX_nrg_15 nrg_Leistung_Faktor_L3
     go-eCharger_XXXXXX_nrg_16 nrg_Leistung_Faktor_N
     go-eCharger_XXXXXX_nrg_2 nrg_Spannung_L2
     go-eCharger_XXXXXX_nrg_3 nrg_Spannung_L3
     go-eCharger_XXXXXX_nrg_4 nrg_Spannung_N
     go-eCharger_XXXXXX_nrg_5 nrg_Strom_L1
     go-eCharger_XXXXXX_nrg_6 nrg_Strom_L2
     go-eCharger_XXXXXX_nrg_7 nrg_Strom_L3
     go-eCharger_XXXXXX_nrg_8 nrg_Leistung_L1
     go-eCharger_XXXXXX_nrg_9 nrg_Leistung_L2
   OLDREADINGS:
   READINGS:
     2022-04-25 11:52:49   alw_get         0
     2022-04-25 12:22:34   alw_set         0
     2022-04-25 11:52:44   amp_get         6
     2022-04-25 12:22:34   amp_nutzbar     0
     2022-04-25 12:22:34   amp_set         6
     2022-04-25 11:52:44   car_status      Leerlauf
     2022-04-25 12:22:34   car_status_detail 1
     2022-04-25 12:01:53   car_status_detailnr 2
     2022-04-25 11:52:44   cbl_limit       20
     2022-04-25 11:52:46   frc_forceState  aus
     2022-04-25 11:36:05   go-eCharger_XXXXXX_modelStatus 2
     2022-04-25 12:11:06   go-eCharger_XXXXXX_nrg_13 0
     2022-04-25 12:11:06   go-eCharger_XXXXXX_nrg_14 0
     2022-04-25 12:11:06   go-eCharger_XXXXXX_nrg_15 0
     2022-04-25 12:11:06   go-eCharger_XXXXXX_nrg_16 0
     2022-04-25 11:52:44   lbp_time        null
     2022-04-25 12:22:34   nrg_Leistung_Faktor_L1 0
     2022-04-25 12:22:34   nrg_Leistung_Faktor_L2 0
     2022-04-25 12:22:34   nrg_Leistung_Faktor_L3 0
     2022-04-25 12:22:34   nrg_Leistung_Faktor_N 0
     2022-04-25 12:22:34   nrg_Leistung_L1 0
     2022-04-25 12:22:34   nrg_Leistung_L2 0
     2022-04-25 12:22:34   nrg_Leistung_L3 0
     2022-04-25 12:22:34   nrg_Leistung_N  0
     2022-04-25 12:22:34   nrg_Leistung_gesamt 0
     2022-04-25 12:22:34   nrg_Spannung_L1 231
     2022-04-25 12:22:34   nrg_Spannung_L2 232
     2022-04-25 12:22:34   nrg_Spannung_L3 232
     2022-04-25 12:22:34   nrg_Spannung_N  0
     2022-04-25 12:22:34   nrg_Strom_L1    0
     2022-04-25 12:22:34   nrg_Strom_L2    0
     2022-04-25 12:22:34   nrg_Strom_L3    0
     2022-04-25 12:22:34   psm_3p_aktiv    false
     2022-04-25 11:52:45   psm_phaseswitchmode 1
     2022-04-25 12:22:34   psm_set         1
     2022-04-25 12:22:34   pv_mode         auto
     2022-04-25 11:36:21   result          success
     2022-04-25 11:36:20   state           Start/Stop
     2022-04-25 12:01:53   trx_user        kein Nutzer
     2022-04-25 11:52:44   wh              0
     2022-04-25 11:52:44   wh_gesamt       1009436
     2022-04-25 12:22:34   wh_kwh_geladen  0.00
Attributes:
   DbLogExclude .*
   autocreate 0
   event-on-change-reading ^nrg.*$
   event-on-update-reading ^.*soll$,^.*set$
   jsonMap    go-eCharger_XXXXXX_nrg_1:nrg_Spannung_L1
go-eCharger_XXXXXX_nrg_3:nrg_Spannung_L3
go-eCharger_XXXXXX_nrg_2:nrg_Spannung_L2
go-eCharger_XXXXXX_nrg_4:nrg_Spannung_N
go-eCharger_XXXXXX_nrg_5:nrg_Strom_L1
go-eCharger_XXXXXX_nrg_6:nrg_Strom_L2
go-eCharger_XXXXXX_nrg_7:nrg_Strom_L3
go-eCharger_XXXXXX_nrg_8:nrg_Leistung_L1
go-eCharger_XXXXXX_nrg_9:nrg_Leistung_L2
go-eCharger_XXXXXX_nrg_10:nrg_Leistung_L3
go-eCharger_XXXXXX_nrg_11:nrg_Leistung_N
go-eCharger_XXXXXX_nrg_12:nrg_Leistung_gesamt
go-eCharger_XXXXXX_nrg_13:nrg_Leistung_Faktor_L1
go-eCharger_XXXXXX_nrg_14:nrg_Leistung_Faktor_L2
go-eCharger_XXXXXX_nrg_15:nrg_Leistung_Faktor_L3
go-eCharger_XXXXXX_nrg_16:nrg_Leistung_Faktor_N
   readingList go_echarger_XXXXXX:/go-eCharger/XXXXXX/nrg:.* { json2nameValue($EVENT,"go-eCharger_XXXXXX_nrg_",$JSONMAP) }
go_echarger_XXXXXX:/go-eCharger/XXXXXX/amp:.* amp_get
go_echarger_XXXXXX:/go-eCharger/XXXXXX/modelStatus:.* car_status_detailnr
go_echarger_XXXXXX:/go-eCharger/XXXXXX/eto:.* wh_gesamt
go_echarger_XXXXXX:/go-eCharger/XXXXXX/cbl:.* cbl_limit
go_echarger_XXXXXX:/go-eCharger/XXXXXX/wh:.* wh
go_echarger_XXXXXX:/go-eCharger/XXXXXX/lbp:.* lbp_time
go_echarger_XXXXXX:/go-eCharger/XXXXXX/cus:.* cus_cable_status
go_echarger_XXXXXX:/go-eCharger/XXXXXX/frc/result:.* result
go_echarger_XXXXXX:/go-eCharger/XXXXXX/psm/result:.* result
go_echarger_XXXXXX:/go-eCharger/XXXXXX/trx:.* {my %n=( 'null' => 'kein Nutzer', '0' => 'ohne Karte', '1' => 'Nutzer 1' );; return { 'trx_user' =>$n{$EVENT}}}
go_echarger_XXXXXX:/go-eCharger/XXXXXX/psm:.* {my %psm=( '1' => '1', '2' => '3');; return { 'psm_phaseswitchmode' =>$psm{$EVENT}}}
go_echarger_XXXXXX:/go-eCharger/XXXXXX/car:.* {my %car=( '0' => 'unbekannt','1' => 'Leerlauf','2' => 'Ladevorgang','3' => 'Ladung verboten','4' => 'Stop','5' => 'Fehler',);; return { 'car_status' =>$car{$EVENT}}}
go_echarger_XXXXXX:/go-eCharger/XXXXXX/alw:.* {my %alw=( 'false' => '0','true' => '1');; return { 'alw_get' =>$alw{$EVENT}}}
go_echarger_XXXXXX:/go-eCharger/XXXXXX/frc:.* {my %frc=( '0' => 'neutral','1' => 'aus','2' => 'an');; return { 'frc_forceState' =>$frc{$EVENT}}}
   room       MQTT2_DEVICE,goe
   setExtensionsEvent 0
   setList    Leistung:selectnumbers,6,1,16,0,lin /go-eCharger/XXXXXX/amp/set $EVTPART1
Start/Stop:neutral,aus,an { my %hash = ( 'neutral' => '0', 'aus' => '1', 'an' => '2'); qq(/go-eCharger/XXXXXX/frc/set $hash{$EVTPART1}) }
Phasenzahl:1,3 { my %hash = ('1' => '1', '3' => '2'); qq(/go-eCharger/XXXXXX/psm/set $hash{$EVTPART1}) }
   stateFormat go-eCharger_XXXXXX_amp A - Status go-eCharger_XXXXXX_car
   userReadings amp_nutzbar {
if (ReadingsVal("S10E","Uberschuss",0)/230>0)
{sprintf("%.f",(ReadingsVal("S10E","Uberschuss",0)/230))}
else
{0};
},

psm_set {
if (ReadingsVal("goe_mqtt","amp_nutzbar",0)>16)
{3}
else
{1};
},

amp_set {
if (ReadingsVal("goe_mqtt","nrg_Leistung_L3",0)==0)
{if (ReadingsVal("goe_mqtt","amp_nutzbar",0)>16)
{16}
else
{if (ReadingsVal("goe_mqtt","amp_nutzbar",0)<6)
{6}
else
{ReadingsVal("goe_mqtt","amp_nutzbar",0)}
}
}
else
{if (ReadingsVal("goe_mqtt","amp_nutzbar",0)/3>16)
{16}
else
{sprintf("%.f",(ReadingsVal("goe_mqtt","amp_nutzbar",0)/3))}
};
},

psm_3p_aktiv {
if (ReadingsVal("goe_mqtt","nrg_Leistung_L3",0)==0)
{"false"}
else
{"true"};
},

alw_set {
if (ReadingsVal("goe_mqtt","amp_nutzbar",0)<6)
{0}
else
{1};
},

wh_kwh_geladen {
sprintf("%.2f",ReadingsVal("goe_mqtt","wh",0) / 1000)
},

pv_mode {
if (ReadingsVal("setPV","masterswitch",0)==1 and ReadingsVal("setPV","user_exception",0)==0)
{"auto"}
elsif (ReadingsVal("setPV","masterswitch",0)==1 and ReadingsVal("setPV","user_exception",0)==1)
{"Ausnahme aktiv"}
else
{"manuell"};
},

car_status_detail {
my $frc=(
'0' => 'NotChargingBecauseNoChargeCtrlData',
'1' => 'Ladestopp Temperatursensor',
'2' => 'Authentifizierung notwendig',
'3' => 'Laden erzwungen',
'4' => 'Laden verboten',
'5' => 'Zeitplan nicht eingehalten',
'6' => 'Energielimit nicht eingehalten',
'7' => 'preisgünstig Laden',
'22' => 'ausstecken simulieren',
'23' => 'Phasenwechsel',
'24' => 'NotChargingBecauseMinPauseDuration'
);;
ReadingsVal("goe_mqtt","car_status_detailnr",0) eq my $rv;;
$rv => $frc;;
print $frc
}
   verbose    2

Sicherlich an einigen Stellen optimierungswürdig, aber es funktioniert erstmal im Testbetrieb.

Beta-User

#12
Zitat von: naerschhersch am 25 April 2022, 12:26:58
Ja, da scheint sich etwas getan haben.
Jetzt kommt für jede Änderung eine Message rein, quasi im Sekundentakt. Dafür kommen sie nicht mehr alle gesammelt, sondern getrennt, das eben nur die Änderung geschickt wird.
Na ja, habe schon "schlimmeres" gesehen...

Ich beschränke die events, da ich sonst durch DOIFs sowieso schon ein Loop auslösen würde (wie kann man das verhindern?).
Eigentlich verhindert FHEM das selbst, es sei denn, du brichst bewußt aus der Event-Loop aus (per FHEM-sleep+setreading, z.B.)

So bekomme ich zwar jede Sekunde aktuelle Daten, schreibe aber nur für einen Teil davon bei Veränderung ein Event. Die UserReadings, die DOIFs alle paar Sekunden triggern müssen (_set am Ende), haben ein event-on-update-reading bekommen.

userReadings ohne trigger sind "bäh"! Du hast hier dann zusätzlich noch das "Problem", dass scheinbar/teilweise auch noch Daten von Extern abgerufen werden.

Würde also dringlich raten,
- trigger zu setzen, und
- statt "goe_mqtt" dann $name hinzuschreiben.
Das ergäbe dann z.B.:
amp_nutzbar:Uberschuss.* { my $us = ReadingsVal($name,'Uberschuss',0)/230; return 0 if !$us; sprintf("%.f",$us) },

Generell erscheint es mir aber ggf. sinnvoller, auch diesen Teil in myUtils auszulagern und dann nur bei passenden eingehenden Infos die ganze Berechnung anzuschubsen. Otto hatte ja schon ein paar Hinweise bzgl. Perl in readingList gegeben, unter https://wiki.fhem.de/wiki/MQTT2_DEVICE_-_Schritt_f%C3%BCr_Schritt gibt's dann ggf. noch ein paar weiterführende Hinweise und Links, wie man sowas (prinzipiell) auch lösen kann.

Wie auch immer du es eingrenzt, du solltest es tun, sonst triggerst du auch deine Eventhandler unnötig oft.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

naerschhersch

Meine DOIFs triggern im Moment eben noch alle userReadings. Ich werde jetzt erstmal auf meine Readings einen Trigger setzen.

Was meinst du mit Daten von Extern? Ich rufe Daten von anderen Devices ab, ja.

Der Code
amp_nutzbar:Uberschuss.* { my $us = ReadingsVal($name,'Uberschuss',0)/230; return 0 if !$us; sprintf("%.f",$us) },
passt nicht, denn Uberschuss kann auch negativ sein. Spricht denn irgendetwas gegen das IF-Konstrukt von vorher?

In das ganze myUtils müsste ich mich erst reinarbeiten. Ich habe das verstanden als global abrufbare Funktionen?

Otto123

#14
Zitat von: naerschhersch am 25 April 2022, 13:56:13
In das ganze myUtils müsste ich mich erst reinarbeiten. Ich habe das verstanden als global abrufbare Funktionen?
Naja sobald der Perl Code im userReadings / setList /readingList oder wo auch immer länger als eine Zeile wird schreibt man eine sub in die myUtils - oder sagen wir kann man.

aus dem go_echarger_XXXXXX:/go-eCharger/XXXXXX/trx:.* {my %n=( 'null' => 'kein Nutzer', '0' => 'ohne Karte', '1' => 'Nutzer 1' );; return { 'go-eCharger_057808_trx' =>$n{$EVENT}}}
wird go_echarger_XXXXXX:/go-eCharger/XXXXXX/trx:.* {mySub($EVENT)}
in der myUtils
sub mySub {
my $EVENT= shift;
my %n=( 'null' => 'kein Nutzer', '0' => 'ohne Karte', '1' => 'Nutzer 1' );
return { 'go-eCharger_057808_trx' =>$n{$EVENT}}
}

So vom Prinzip her :)

Übergibst Du noch den Device Namen und dann kannst Du das gleiche in 100 Devices nutzen
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz