[Gelöst] Differenzwert von 4 Zahlen ermitteln

Begonnen von Knallfrosch, 02 Februar 2022, 15:31:58

Vorheriges Thema - Nächstes Thema

Knallfrosch

Hallo,

ich lese die Spg. von 4 Lipo-Zellen aus:


cellVoltage1  3.395
cellVoltage2  3.394
cellVoltage3  3.395
cellVoltage4  3.396


Nun würde ich gerne die maximale Spannungsdifferenz ermitteln.

Klar, es muss der größte Wert - kleinster Wert = Differenz gerechnet werden.

In Excel ist das kein Ding, da kann man das ja so: =MAX(E6:E9)-MIN(E6:E9) ziemlich einfach umsetzen.

Kann mir bitte jemand dabei helfen, wie ich das in FHEM als Reading hinbekomme!?


Vielen Dank.

Grüße
-FHEM auf Raspm B+ mit FHEM2FHEM auf einem weiteren Rasp B+
-LaCrosse über Jeelink-Clone und diverses HM über HM-USB.
-S0-Stromzähler und Reed-Gaszähler

DeeSPe

Vorweg: es geht sicher auch anders/einfacher.

Mein Lösungsvorschlag:
Alles Werte in ein Array, dann sortieren und dann sollte im ersten und im letzten Element des Arrays der größte und der kleinste Wert drin sein.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Knallfrosch

OK, ich habe schon befürchtet, das es nicht so ganz einfach ist.

Aber mit "Array" kann ich (auch) absolut nichts anfangen.
Kannst du mir da etwas auf die Sprünge helfen?

Danke.


Grüße
-FHEM auf Raspm B+ mit FHEM2FHEM auf einem weiteren Rasp B+
-LaCrosse über Jeelink-Clone und diverses HM über HM-USB.
-S0-Stromzähler und Reed-Gaszähler

DeeSPe

Ich finde das eigentlich recht einfach!  ;D
Na dann mal langsam: Woher kommen denn Deine ursprünglichen Daten bzw. wo findest Du diese in FHEM wieder?

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Knallfrosch

Die Daten werden durch ein Pyhton-Skript an FHEM über das Modul 70_GenericSmartBMS.pm geliefert.


List ergibt folgendes:

Internals:
   DEF        192.168.178.153 9998 15 1
   FUUID      61f9048f-f33f-563c-3335-6af24ec1e5b8d6cb
   Host       192.168.178.153
   Interval   15
   Invalid    -1
   NAME       BatteryPack1
   NR         14
   Port       9998
   STATE      Online
   TYPE       GenericSmartBMS
   Timeout    1
   READINGS:
     2022-02-02 15:56:40   batteryBalance  0
     2022-02-02 15:56:40   batteryCurrent  11.25
     2022-02-02 15:56:40   batterySoC      93
     2022-02-02 15:56:40   batteryVoltage  13.61
     2022-02-02 15:56:40   cellVoltage1    3.403
     2022-02-02 15:56:40   cellVoltage2    3.4
     2022-02-02 15:56:40   cellVoltage3    3.404
     2022-02-02 15:56:40   cellVoltage4    3.407
     2022-02-02 15:56:40   cellVoltage5    65.174
     2022-02-02 15:56:40   cellVoltage6    0
     2022-02-02 15:56:40   cellVoltage7    0
     2022-02-02 15:56:40   state           Online
     2022-02-02 15:56:40   temp1           13.1
     2022-02-02 15:56:40   temp2           11.6
Attributes:


cellVoltage1 - 4 sind die relevanten Werte, aus denen die Differenz errechnet werden soll.

-FHEM auf Raspm B+ mit FHEM2FHEM auf einem weiteren Rasp B+
-LaCrosse über Jeelink-Clone und diverses HM über HM-USB.
-S0-Stromzähler und Reed-Gaszähler

DeeSPe

Okay! Und wo willst du den Differenzwert haben?
Mit einem userReading sollte es sehr gut machbar sein.
z.B. (ungetestet):
attr BatteryPack1 userReadings voltagediff:cellVoltage.* {my @ar=(ReadingsNum($NAME,"cellVoltage1",0),ReadingsNum($NAME,"cellVoltage2",0),ReadingsNum($NAME,"cellVoltage3",0),ReadingsNum($NAME,"cellVoltage4",0)); sort @ar; my $min = $ar[0]; my $max = $ar[-1]; return $max - $min;}

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Knallfrosch

#6
Ja, genau als Userreading in dem selben Device habe ich mir das vorgestellt.


Deinen Code habe ich gerade in der Befehlszeile eingegeben.

Aber ich bekomme folgende Fehlermeldungen:

Unknown command sort, try help.
Unknown command my, try help.
Unknown command my, try help.
Unknown command return, try help.
Unknown command }, try help.




NACHTRAG: Es hat wohl am Ende eine } gefehlt.
War wohl mein Fehler!  :-X

Es scheint sogar jetzt zu funktionieren.
Werde das Reading mal beobachten ob der Wert auch stimmt. :-)

Vielen Dank nochmal für die Hilfe.
Melde mich später nochmal.

Grüße
-FHEM auf Raspm B+ mit FHEM2FHEM auf einem weiteren Rasp B+
-LaCrosse über Jeelink-Clone und diverses HM über HM-USB.
-S0-Stromzähler und Reed-Gaszähler

Knallfrosch

READINGS:
     2022-02-02 16:50:14   batteryBalance  0
     2022-02-02 16:50:14   batteryCurrent  6.66
     2022-02-02 16:50:14   batterySoC      98
     2022-02-02 16:50:14   batteryVoltage  13.98
     2022-02-02 16:50:14   cellVoltage1    3.497
     2022-02-02 16:50:14   cellVoltage2    3.491
     2022-02-02 16:50:14   cellVoltage3    3.494
     2022-02-02 16:50:14   cellVoltage4    3.499
     2022-02-02 16:50:14   cellVoltage5    64.807
     2022-02-02 16:50:14   cellVoltage6    0
     2022-02-02 16:50:14   cellVoltage7    0
     2022-02-02 16:50:29   state           Offline
     2022-02-02 16:50:14   temp1           12.7
     2022-02-02 16:50:14   temp2           11.6
     2022-02-02 16:50:14   voltagediff     0.00200000000000022


Das Ergebnis stimmt leider doch nicht.

Das Ergebnis müsste in dem obigen Zustand 0,008 sein.


Grüße



-FHEM auf Raspm B+ mit FHEM2FHEM auf einem weiteren Rasp B+
-LaCrosse über Jeelink-Clone und diverses HM über HM-USB.
-S0-Stromzähler und Reed-Gaszähler

Knallfrosch

#8
     2022-02-02 17:07:47   cellVoltage1    3.624
     2022-02-02 17:07:47   cellVoltage2    3.594
     2022-02-02 17:07:47   cellVoltage3    3.614
     2022-02-02 17:07:47   cellVoltage4    3.624
     2022-02-02 17:07:47   cellVoltage5    65.352
     2022-02-02 17:07:47   cellVoltage6    0
     2022-02-02 17:07:47   cellVoltage7    0
     2022-02-02 17:07:47   state           Online
     2022-02-02 17:07:47   temp1           12.7
     2022-02-02 17:07:47   temp2           11.6
     2022-02-02 17:07:47   voltagediff     0



Der Code rechnet, wie es aussieht einfach nur immer cellVoltage1 - cellVolatge4


D.h. die Sortierung scheint nicht zu funktionieren.



Grüße




NACHTRAG:


     2022-02-02 17:12:04   cellVoltage1    3.631
     2022-02-02 17:12:04   cellVoltage2    3.598
     2022-02-02 17:12:04   cellVoltage3    3.621
     2022-02-02 17:12:04   cellVoltage4    3.63
     2022-02-02 17:12:04   cellVoltage5    65.328
     2022-02-02 17:12:04   cellVoltage6    0
     2022-02-02 17:12:04   cellVoltage7    0
     2022-02-02 17:12:04   state           Online
     2022-02-02 17:12:04   temp1           12.7
     2022-02-02 17:12:04   temp2           11.6
     2022-02-02 17:12:04   voltagediff     -0.00099999999999989



Es wird nur Cell1-Cell4 gerechnet. 
Daher auch das Ergebnis mit "falschem" Vorzeichen.
-FHEM auf Raspm B+ mit FHEM2FHEM auf einem weiteren Rasp B+
-LaCrosse über Jeelink-Clone und diverses HM über HM-USB.
-S0-Stromzähler und Reed-Gaszähler

DeeSPe

Probier mal:

attr BatteryPack1 userReadings voltagediff:cellVoltage.* {my @ar=sort(ReadingsNum($NAME,"cellVoltage1",0),ReadingsNum($NAME,"cellVoltage2",0),ReadingsNum($NAME,"cellVoltage3",0),ReadingsNum($NAME,"cellVoltage4",0)); my $min=$ar[0]; my $max=$ar[-1]; return sprintf("%.3f",$max - $min);}


Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Knallfrosch

2022-02-02 17:25:34   cellVoltage1    3.639
2022-02-02 17:25:34   cellVoltage2    3.601
2022-02-02 17:25:34   cellVoltage3    3.631
2022-02-02 17:25:34   cellVoltage4    3.64
   
2022-02-02 17:25:34   voltagediff     0.039


Hey, super!
Das sieht schon besser aus!

Die Zellen sind gleich voll!
Daher wird sich die Differenz wahrscheinlich nicht mehr stark verschieben.

Werde heute spät oder spätestens morgen ein Entladen anstoßen. Dann sehe ich das genau ob die Rechnung auch passt wenn die Zellen sich gegeneinander verschieben.


Ich gebe da aber dann nochmal abschließend eine Rückmeldung.

Vielen Dank für deine Hilfe. Auch wenn ich den Code ungefähr entschlüsseln kann, würde ich sowas niemals hinbekommen.

Grüße und einen schönen Abend
-FHEM auf Raspm B+ mit FHEM2FHEM auf einem weiteren Rasp B+
-LaCrosse über Jeelink-Clone und diverses HM über HM-USB.
-S0-Stromzähler und Reed-Gaszähler

TomLee

Sry, für das reingrätschen, interessiert mich aber. Es klappt auch wenn man das sortierte Array in einer neuen Variablen speichert und dann daraus die min/max Werte nimmt.

Was denn der Grund dafür das es nur so klappt ?

Zitat{my @ar=(ReadingsNum($NAME,"cellVoltage1",0),ReadingsNum($NAME,"cellVoltage2",0),ReadingsNum($NAME,"cellVoltage3",0),ReadingsNum($NAME,"cellVoltage4",0)); my @sar = sort @ar; my $min = $sar[0]; my $max = $sar[-1]; return $max - $min;}

DeeSPe

Zitat von: Knallfrosch am 02 Februar 2022, 17:29:58
2022-02-02 17:25:34   cellVoltage1    3.639
2022-02-02 17:25:34   cellVoltage2    3.601
2022-02-02 17:25:34   cellVoltage3    3.631
2022-02-02 17:25:34   cellVoltage4    3.64
   
2022-02-02 17:25:34   voltagediff     0.039


Hey, super!
Das sieht schon besser aus!

Die Zellen sind gleich voll!
Daher wird sich die Differenz wahrscheinlich nicht mehr stark verschieben.

Werde heute spät oder spätestens morgen ein Entladen anstoßen. Dann sehe ich das genau ob die Rechnung auch passt wenn die Zellen sich gegeneinander verschieben.


Ich gebe da aber dann nochmal abschließend eine Rückmeldung.

Vielen Dank für deine Hilfe. Auch wenn ich den Code ungefähr entschlüsseln kann, würde ich sowas niemals hinbekommen.

Grüße und einen schönen Abend

Na super!
Viel Spaß damit.

Zitat von: TomLee am 02 Februar 2022, 17:38:44
Sry, für das reingrätschen, interessiert mich aber. Es klappt auch wenn man das sortierte Array in einer neuen Variablen speichert und dann daraus die min/max Werte nimmt.

Was denn der Grund dafür das es nur so klappt ?

Ja, das ist der Grund. Das sortierte Array muss in eine eigene Variable.
Deswegen habe ich das im 2. Versuch so umgebaut.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

CoolTux

sort{$a<=>$b}(@z))

Weil ich unterwegs bin.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

DeeSPe

Zitat von: CoolTux am 02 Februar 2022, 17:57:00
sort{$a<=>$b}(@z))
"{$a<=>$b}" ist doch die "default" Sortierung wenn man es weglässt, oder!?

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe