Hallo.
Ich möchte gerne den SOC meiner Pylons überwachen, um ein zu weites auseinander driften zu verhindern.
Wie schaffe ich es , den MAX-Wert u. MIN-Wert abzufragen? Habe ein readingsGroup angelegt. Oder muss man alle Devices extra abfragen?
[edit]
habe ein DOIF angelegt,
define writeSOC DOIF ([US2000_1:packSOC]) ( ({ my $sld1 = (ReadingsNum('US2000_1','packSOC','')); fhem("setreading SOC US2000_1 $sld1");})
({ my $sld2 = (ReadingsNum('US2000_2','packSOC','')); fhem("setreading SOC US2000_2 $sld2");})
({ my $sld3 = (ReadingsNum('US2000_3','packSOC','')); fhem("setreading SOC US2000_3 $sld3");})
({ my $sld4 = (ReadingsNum('US2000_4','packSOC','')); fhem("setreading SOC US2000_4 $sld4");})
({ my $sld5 = (ReadingsNum('US2000_5','packSOC','')); fhem("setreading SOC US2000_5 $sld5");})
({ my $sld6 = (ReadingsNum('US2000_6','packSOC','')); fhem("setreading SOC US2000_6 $sld6");})
({ my $sld7 = (ReadingsNum('US2000_7','packSOC','')); fhem("setreading SOC US2000_7 $sld7");})
({ my $sld8 = (ReadingsNum('US2000_8','packSOC','')); fhem("setreading SOC US2000_8 $sld8");})
({ my $sld9 = (ReadingsNum('US2000_9','packSOC','')); fhem("setreading SOC US2000_9 $sld9");})
({ my $sld10 = (ReadingsNum('US2000_A','packSOC','')); fhem("setreading SOC US2000_A $sld10");})
({ my $sld11 = (ReadingsNum('US2000_B','packSOC','')); fhem("setreading SOC US2000_B $sld11");})
({ my $sld12 = (ReadingsNum('US2000_C','packSOC','')); fhem("setreading SOC US2000_C $sld12");})
({; fhem ("setreading SOC max [#max:"SOC":"US.*"]");})
({; fhem ("setreading SOC min [#min:"SOC":"US.*"]");})
)
LG
{ my $max=0;; map { $max=maxNum($max,ReadingsNum("SOC",$_,0)) } grep(/^US.*/, keys %{$defs{SOC}{READINGS}});; setReadingsVal($defs{SOC},"max",$max,TimeNow()) }
Und wenn moeglich, bitte im obigen Beispiel die Anzahl der Klammern ({...}) reduzieren, einem Programmierer wirds beim zuschauen schlecht.
- viel zu viele Klammern, die man nicht braucht: einen Funktionsaufruf wie (ReadingsNum()) muss man nicht in Klammern setzen.
- es ist ziemlich unsinnig, bei einer Funktion, die einen numerischen Wert als Ergebnis liefern soll, einen String ('') als default-Wert anzugeben.
- Wenn man 12 Mal das gleiche macht, kann man das auch in eine loop packen und die benötigten Namen dynamisch erzeugen.
- um Minimal- und Maximalwerte aus einer Menge von Werten zu ermitteln, stellt FHEM interne Funktionen zur Verfügung, denen man jeweils eine Liste von Werten übergeben kann.
Edit: Rudi war schneller.
Hat es eine Bewandtnis, dass du die Readings alle in ein Device umkopierst?
Wenn du nur das Maximum bilden willst, dann reicht einfach:
[#max:"^US2000":"^packSOC$"]
#max kann ja über verschiedene Devices das Maximum bilden und entsprechend mit #min für Minimum
Zitat von: Damian am 24 Mai 2024, 19:51:10Hat es eine Bewandtnis, dass du die Readings alle in ein Device umkopierst?
Wenn du nur das Maximum bilden willst, dann reicht einfach:
[#max:"^US2000":"^packSOC$"]
#max kann ja über verschiedene Devices das Maximum bilden und entsprechend mit #min für Minimum
jeses US2000 ist ein eigenes Device, PylonLowVoltage.pm , deshalb meine Frage. Aber wie kann man über verschiedene Devices werte suchen?
Das Beispiel habe ich von einem DOIF für Strompreis aktuelle Stunde.
Und nochmals sorry, bin nur laienprogrammierer.
Zitat von: satprofi am 25 Mai 2024, 10:03:31jeses US2000 ist ein eigenes Device, PylonLowVoltage.pm , deshalb meine Frage. Aber wie kann man über verschiedene Devices werte suchen?
Die Lösung habe ich dir schon geschrieben:
[#max:"^US2000":"^packSOC$"]
Und hier eine komplette Definition im DOIF-Perlmodus:
defmod minmaxSOC DOIF {set_Reading("max",[#max:"^US2000":packSOC])}\
{set_Reading("min",[#min:"^US2000":packSOC])}
Getriggert wird das DOIF-Device durch Events, die von Devices beginnend mit US2000 kommen. Da es offenbar in allen Devices das Reading packSOC ist, kann man es direkt ohne Regex angeben. set_Reading schreibt dann das errechnete Maximum bzw. Minimum in das Reading max bzw. min des DOIF-Devices. Das war es, mehr muss man nicht machen, um von
verschiedenen Devices das Maximum bzw. Minimum eines bestimmten Readings zu bilden.
Und hier die Doku zu den Aggregationsfunktionen von DOIF:
https://fhem.de/commandref_DE.html#DOIF_aggregation
ZitatIch möchte gerne den SOC meiner Pylons überwachen, um ein zu weites auseinander driften zu verhindern.
@satprofi, sorry wenn die Frage nicht ganz zur Aufgabenstellung passt bzw. etwas weiter führt.
Aber mich interessiert, was genau du tust wenn du ein zu weites Driften der einzelnen SOC feststellst?
Welchen Wert definierst du als "zu weit"?
LG