Maximal- u. Minimalwert suchen

Begonnen von satprofi, 24 Mai 2024, 16:49:05

Vorheriges Thema - Nächstes Thema

satprofi

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
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

rudolfkoenig

#1
{ 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.

betateilchen

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

Damian

#3
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


Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

satprofi

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.
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

Damian

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

DS_Starter

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
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter