Zitat von: betateilchen am 08 März 2026, 11:26:10Punkt 2 ist komplizierter. JsonMod hat noch einige funktionale Lücken und ich fürchte, verschachtelte arrays gehören dazu.
Mal sehen, ob mir dazu was einfällt.
multi(jsonPath('$.chargePoints.[*].connectors.0'),concat('test_',count()),property('maxPowerInKw'))
Zitat von: DS_Starter am 08 März 2026, 09:56:37aber die Leerzeichen in der Indexliste könnten stören. Wenn das so ist, kann ich an der Stelle noch nachbessern im Code.
Zitat von: Prof. Dr. Peter Henning am 08 März 2026, 10:52:19allerdings scheitere ich noch daran, 1.mehrere Properties des Ladepunktes in eine Zeile einzutragen
readingList single(concat("addInfo:",jsonPath('$.additionalInfo')," / stationId:",jsonPath('$.stationId')),'combiReading','?')Zitat von: betateilchen am 04 März 2026, 19:00:49Tipp: wenn man mit regex nicht klarkommt, kann man auch darüber nachdenken, ob es andere - einfachere - Möglichkeiten gibt, zum Ergebnis zu kommen.Klar das mag sein, diese Möglichkeit habe ich auch bereits selbst gefunden. Doch es hat ja nichts damit zu tun das ich nicht erkenne woher das Ergebnis in meiner Konstellation stammt und somit NIEMALS ohne Hilfe verstehen und lernen kann warum es so wie es ist nicht funktioniert bzw. das fehlerhafte Ergebnis kommt.
Zitat/Month:.([\d.]+)/Und genau so etwas verstehe ich nicht, darum lasse ich nach möglichkeit die Finger davon. Diese Symbolik und Bedeutung der einzelnen Platzhalter will einfach nicht in meinen Schädel rein - zumindest nicht dauerhaft zum behalten.
Zitat von: betateilchen am 05 März 2026, 08:34:45Du hast in Deinem Attribut userReadings vor allem das Problem, dass sinnvolle Trigger für die Anlage der einzelnen userReadings fehlen. Bei JEDEM beliebigen Event in diesem device versucht es, ALLE userReadings neu zu ermitteln.Das ist doch nach meinem Verständnis auch Sinn eines UserReadings. Ein UserReading soll soweit ich es verstehe bestehnde Readings manipulieren, verändern oder daraus ableitende Berechnungen vornehmen. Wenn das nicht bei jedem Trigger passiert, sind die hälfte der Werte doch ständig veraltet.
Zitat von: betateilchen am 05 März 2026, 08:34:45Das führt dazu, dass Du gar nicht erkennen kannst, aus welchem Event das userReading erzeugt wird, das dann mit dem Namen gefüttert wird. Höchstwahrscheinlich wird das gar nicht aus der Zeile erzeugt, die Du als problematisch vermutest.Es wird doch mit
statEnergy_kWh_Month { ReadingsVal("$name","statEnergy_kWh","") =~ /Month\":\"([^\"]*)\"/; return $1 }explizit das Reading "statEnergy_kWh" des Device ausgelesen und (ich nenne es mal) kastriert. In diesem Reading steht aber folgendes drin:Hour: 0.4 Day: 4.2 Month: 40.6 Year: 40.6 (since: 2026-03-05 )Es spielt doch gar keine Rolle wann oder wodurch die Berechnung ausgelöst wird, sondern NUR was berechnet wird, nämlich der Inhalt dieses spezifischen Readings. Wenn dieses Reading aber den Device-Namen gar nicht enthält, wie kann dann das UserReading diesen als Ergebnis ausspucken - das ist die Frage.Zitat von: betateilchen am 05 März 2026, 08:34:45(ob es sinnvoll ist, den Namen des userReadings so zu wählen, dass der Name des Ursprungsreadings darin 1:1 vorkommt, lasse ich jetzt unbetrachtet)Verstehe ich nicht, da ganau das es ist was ich mache. Mein UserReading hat den gleichen Namen wie das Ursrungsreading + eine Erweiterung.
Das erleichtert zum einen die Fehlersuche und zum anderen reduziert es die FHEM-interne Last durch unnötige Durchläufe bei jedem event.
Zitat von: Prof. Dr. Peter Henning am 07 März 2026, 12:15:53singularReadingsHabe ich exakt wie in der commandRef beschrieben benutzt was sofort zu einem Overflow geführt hat der mir den kompletten Server für einen halben Tag lahmgelegt hat. Sorry, aber nein Danke - das Risiko ist mir zu unüberschaubar.
Zitat von: RalfRog am 08 März 2026, 09:18:12Inwieweit das Sinn macht,wenn es durch das Modul bereit gestellt wird...Ich verstehe leider nicht den Kontext in dem dein Kommentar steht.
Zitat von: Prof. Dr. Peter Henning am 07 März 2026, 16:05:54P.S.: Beim Beispiel von betateilchen dachte ich "Donnerwetter, eine Ladestation am Gotthard?"...
attr Ladestation_xxx readingList\
single(jsonPath('$.additionalInfo'),'location','?')\
single(jsonPath('$.numberOfChargePoints'),'cports')\
single(jsonPath('$.availableChargePoints'),'cports_avail')\
single(jsonPath('$.unknownStateChargePoints'),'cports_unknown')\
multi(jsonPath('$.chargePoints.[*]'),concat('port_',count()),property('state.value'))
attr Ladestation_xxx stateFormat {my $n=ReadingsVal("$name","cports",0);;my $ret="<table>";;for(my $i=0;;$i<$n;;$i++){my $s=ReadingsVal("$name","port_$i","UNKNOWN");;my $t=($s=~/^A/)?"A":(($s=~/^O/)?"O":"U");;$ret.="<tr><td>$t</td></tr>\n"};;$ret.="</table>";;$ret}gibt es schon einmal eine vertikale Tabelle mit A/O/U-Einträgen. Ich würde jetzt gerne in jeder Zeile noch mehr Informationen hinzufügen - allerdings scheitere ich noch daran, 1.mehrere Properties des Ladepunktes in eine Zeile einzutragen und 2. einen Datenpunkt (z.B. maximale Ladeleistung) aus dem unter "chargePoints" liegenden Array "connectors" abzufragen. Mitmulti(jsonPath('$.chargePoints.[*]'),concat('portPower_',count()),property('connectors[0].maxPowerInKw.value')) geht es jedenfalls nicht.attr graphicControl showDiff=1:bottom,2:bottom,3:bottom hourStyle=:00 beamWidth=24 beamHeightlevel=1:250,2:250,3:250