Autor Thema: [Gelöst] Differenzwert von 4 Zahlen ermitteln  (Gelesen 2155 mal)

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 18922
Antw:Differenzwert von 4 Zahlen ermitteln
« Antwort #15 am: 02 Februar 2022, 18:04:58 »
Schneller ist es vermutlich, wenn man ohne das Zwischenarray arbeitet und dann nur die Startwerte aus Reading1 nimmt {my $min = ReadingsNum($name,'cellVoltage1',100000); my $max = ReadingsNum($name,'cellVoltage1',0); for (2..4) { $min = minNum(ReadingsNum($name,"cellVoltage$_",$min),$min);  $max = maxNum(ReadingsNum($name,"cellVoltage$_",$max),$max);} return $max - $min }"sort" muss ja intern auch (mehrfach!, aber ggf. gegen mehr Werte) vergleichen.
« Letzte Änderung: 02 Februar 2022, 18:07:06 von Beta-User »
Server: HP-T620@Debian 11, 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
Informativ Informativ x 1 Liste anzeigen

Offline DeeSPe

  • Developer
  • Hero Member
  • ****
  • Beiträge: 4532
  • Wer anderen eine Bratwurst brät...
    • Buy me a coffee
Antw:Differenzwert von 4 Zahlen ermitteln
« Antwort #16 am: 02 Februar 2022, 18:16:20 »
Schneller ist es vermutlich, wenn man ohne das Zwischenarray arbeitet und dann nur die Startwerte aus Reading1 nimmt {my $min = ReadingsNum($name,'cellVoltage1',100000); my $max = ReadingsNum($name,'cellVoltage1',0); for (2..4) { $min = minNum(ReadingsNum($name,"cellVoltage$_",$min),$min);  $max = maxNum(ReadingsNum($name,"cellVoltage$_",$max),$max);} return $max - $min }"sort" muss ja intern auch (mehrfach!, aber ggf. gegen mehr Werte) vergleichen.
Ich finde es immer wieder klasse zu sehen wie andere so etwas lösen.
Man lernt immer dazu!

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
Zustimmung Zustimmung x 2 Liste anzeigen

Offline CoolTux

  • Developer
  • Hero Member
  • ****
  • Beiträge: 27989
Antw:Differenzwert von 4 Zahlen ermitteln
« Antwort #17 am: 02 Februar 2022, 18:19:18 »
"{$a<=>$b}" ist doch die "default" Sortierung wenn man es weglässt, oder!?

Gruß
Dan

Möglich aus dem Kopf weiß ich das gerade ehrlich gesagt nicht.
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/
Mein Dokuwiki:
https://www.cooltux.net

Offline TomLee

  • Hero Member
  • *****
  • Beiträge: 4249
  • ... wer sät, der erntet ...
Antw:Differenzwert von 4 Zahlen ermitteln
« Antwort #18 am: 02 Februar 2022, 18:29:13 »
Zitat
"{$a<=>$b}" ist doch die "default" Sortierung wenn man es weglässt, oder!?

Nö,  8).

{my @ar=sort(14,12,2,23,3 );; return join ',',@ar}
12,14,2,23,3

{my @ar=sort { $a <=> $b } (14,12,2,23,3 );; return join ',',@ar}
2,3,12,14,23

https://perlmaven.com/sorting-arrays-in-perl
Gefällt mir Gefällt mir x 1 Informativ Informativ x 1 Liste anzeigen

Offline CoolTux

  • Developer
  • Hero Member
  • ****
  • Beiträge: 27989
Antw:Differenzwert von 4 Zahlen ermitteln
« Antwort #19 am: 02 Februar 2022, 18:56:31 »
Und dann einfach den ersten und den letzten Index aus dem sortier Array raus ziehen. War so meine Idee.
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/
Mein Dokuwiki:
https://www.cooltux.net

Offline DeeSPe

  • Developer
  • Hero Member
  • ****
  • Beiträge: 4532
  • Wer anderen eine Bratwurst brät...
    • Buy me a coffee
Antw:Differenzwert von 4 Zahlen ermitteln
« Antwort #20 am: 02 Februar 2022, 19:39:25 »
Nö,  8).

{my @ar=sort(14,12,2,23,3 );; return join ',',@ar}
12,14,2,23,3

{my @ar=sort { $a <=> $b } (14,12,2,23,3 );; return join ',',@ar}
2,3,12,14,23

https://perlmaven.com/sorting-arrays-in-perl

Ahh, verstehe! Klappt hier aber dennoch da es nur um die Nachkommastellen geht.

Und dann einfach den ersten und den letzten Index aus dem sortier Array raus ziehen. War so meine Idee.

Das ist doch auch meine Herangehensweise gewesen. ;)
Wusste nur nicht das die "default" Sortierung nur auf die erste Ziffer der Zahlen achtet.

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

Offline CoolTux

  • Developer
  • Hero Member
  • ****
  • Beiträge: 27989
Antw:Differenzwert von 4 Zahlen ermitteln
« Antwort #21 am: 02 Februar 2022, 19:41:26 »
Zitat
#!/usr/bin/perl
#
use strict;
use warnings;
use feature qw /say/;

my @zahlen = ( 34, 76, 23, 1, 5, 9, 4, 7, 234, 98, 34 );

say join ',', ( sort { $a <=> $b } (@zahlen) )[ 0, -1 ];

exit;

Bin jetzt zu Hause.
Zum anschauen und rumspielen.
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/
Mein Dokuwiki:
https://www.cooltux.net

Offline CoolTux

  • Developer
  • Hero Member
  • ****
  • Beiträge: 27989
Antw:Differenzwert von 4 Zahlen ermitteln
« Antwort #22 am: 02 Februar 2022, 20:49:58 »
So weiter geht es

return join ', ', ( sort { $a <=> $b } ( @{ $defs{'BatteryPack1'}->{READINGS} }{ ( 'cellVoltage1', 'cellVoltage2', 'cellVoltage3', 'cellVoltage4' ) } ) )[ 0, -1 ];
Das als userreadings und Du bekommst Deine 2 Werte. Den kleinsten und den größten aus Deinen Readings cellVoltage 1-4




Grüße

PS: Nachträgliche Korrektur bei den READINGS
Mein Beispiel wird ohne weitere Anpassung nicht gehen. Siehe unten Beispiel zum Aufbau des Hash einer Geräteinstanz
$hash->{READINGS}{<readingname>}{VAL}
Ich lasse mein Beispiel aber stehen als Ansatz zum weiterprobieren.
« Letzte Änderung: 03 Februar 2022, 11:42:51 von CoolTux »
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/
Mein Dokuwiki:
https://www.cooltux.net
Gefällt mir Gefällt mir x 1 Liste anzeigen

Offline yersinia

  • Hero Member
  • *****
  • Beiträge: 1417
    • Cyanide & Happiness
Antw:Differenzwert von 4 Zahlen ermitteln
« Antwort #23 am: 03 Februar 2022, 07:43:33 »
Mal für nen Rookie: warum sind min() und max() keine Optionen?
voltagediff:cellVoltage.* {my @ar= (ReadingsNum($NAME,"cellVoltage1",0), ReadingsNum($NAME,"cellVoltage2",0), ReadingsNum($NAME,"cellVoltage3",0), ReadingsNum($NAME,"cellVoltage4",0));
return sprintf("%.3f",max(@ar) - min(@ar));}
viele Grüße, yersinia
----
FHEM 6.1 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

Offline CoolTux

  • Developer
  • Hero Member
  • ****
  • Beiträge: 27989
Antw:Differenzwert von 4 Zahlen ermitteln
« Antwort #24 am: 03 Februar 2022, 08:04:16 »
Mal für nen Rookie: warum sind min() und max() keine Optionen?
voltagediff:cellVoltage.* {my @ar= (ReadingsNum($NAME,"cellVoltage1",0), ReadingsNum($NAME,"cellVoltage2",0), ReadingsNum($NAME,"cellVoltage3",0), ReadingsNum($NAME,"cellVoltage4",0));
return sprintf("%.3f",max(@ar) - min(@ar));}

Wer hat gesagt das min und max keine Optionen sind. Es gibt viele Wege. Persönlich finde ich es gut auch andere Wege zu kennen. Für das was Du vorhast ist min und max voll ausreichend. Wenn jemand mehr machen möchte, größere Mengen mehr Perl Code findet er das hier beim suchen und erfreut sich der unterschiedlichen Möglichkeiten.
Meine Lösung sollte laut meiner Einbildung effizienter sein. Was aber nur bei größeren Datenmengen auffallen dürfte und im ms Bereich liegt.


Grüße
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/
Mein Dokuwiki:
https://www.cooltux.net

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 18922
Antw:Differenzwert von 4 Zahlen ermitteln
« Antwort #25 am: 03 Februar 2022, 08:09:34 »
 :P Meiner einer....
Aber beschränkt auf main.
Server: HP-T620@Debian 11, 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

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 18922
Antw:Differenzwert von 4 Zahlen ermitteln
« Antwort #26 am: 03 Februar 2022, 08:54:34 »
:P Meiner einer....
Nanu? Keine unmittelbare Reaktion?!?

Sorry vorab, am Handy war nur nicht gut zu sehen, dass es da einen Link auf List::Util gab, und das ist an sich durchaus eine Option.
Ansonsten mal vergleichen:
{min 3,9,12}{List::Util::min 3,9,12}
Das Problem damit ist nur, dass man aufpassen muss, dass man sich nicht versehentlich was anderes damit zerhaut:
Es gibt nämlich im main-Kontext schon eine Funktion "min", und wenn man im falschen lexikalischen Kontext ein "use List::Util;" einbaut, funktionieren eventuell auch einzelne FHEM-Module oder eigener Code wie erwartet...

Und noch ein Nachtrag: Das mit dem Ersatzwert "0" ist schwierig, wenn (anders als hier) tatsächlich mal kein Wert vorhanden sein könnte. Da hier anscheinend der Code des Moduls immer numerische Werte bringt, kann man auf den "num"-Overhead übrigens auch verzichten...
« Letzte Änderung: 03 Februar 2022, 09:01:45 von Beta-User »
Server: HP-T620@Debian 11, 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

Offline CoolTux

  • Developer
  • Hero Member
  • ****
  • Beiträge: 27989
Antw:Differenzwert von 4 Zahlen ermitteln
« Antwort #27 am: 03 Februar 2022, 09:02:14 »
Nanu? Keine unmittelbare Reaktion?!?

Sorry vorab, am Handy war nur nicht gut zu sehen, dass es da einen Link auf List::Util gab, und das ist an sich durchaus eine Option.

Das Problem damit ist nur, dass man aufpassen muss, dass man sich nicht versehentlich was anderes damit zerhaut:
Es gibt nämlich im main-Kontext schon eine Funktion "min", und wenn man im falschen lexikalischen Kontext ein "use List::Util;" einbaut, funktionieren eventuell auch einzelne FHEM-Module oder eigener Code wie erwartet...

Ich habe es still zur Kenntnis genommen  :D  Hätte da aber auch nichts weiter zu sagen können da ich mir nicht alles im ganzen an gelesen habe was hier im Thread steht.
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/
Mein Dokuwiki:
https://www.cooltux.net

Offline Sany

  • Full Member
  • ***
  • Beiträge: 383
Antw:Differenzwert von 4 Zahlen ermitteln
« Antwort #28 am: 04 Februar 2022, 10:14:55 »
@Knallfrosch

falls Du noch Möglichkeiten suchst, hier mal eine Version in "DOIF":

defmod di_BatteryPack1 DOIF ##\

attr di_BatteryPack1 event-on-change-reading maxDiff
attr di_BatteryPack1 event_Readings maxDiff:sprintf("%.3f",[#max:"^BatteryPack1$":"^cellVoltage[1-4]"] - [#min:"^BatteryPack1$":"^cellVoltage[1-4]"])

realisiert mit einem event_Readings. Sobald sich einer der 4 Werte im Device BatteryPack1 ändert wird neu gerechnet. Der neue Wert erzeugt ein event. Solltest Du z.B. innerhalb dieses DOIF den Wert verwenden wollen (z.B. Anzeige mittels uiTable) dann könntest Du auch statt event_Readings DOIF_Readings nehmen. Macht das gleiche, nur ohne event "nach draussen".

Viel Erfolg!


Sany
fhem auf Zotac ZBox nano als LXC auf Proxmox, weitere LXC mit deConz(ZigBee), MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

Offline Knallfrosch

  • Full Member
  • ***
  • Beiträge: 203
Antw:Differenzwert von 4 Zahlen ermitteln
« Antwort #29 am: 04 Februar 2022, 11:57:48 »
Hallo,

interessant, wie viel mit 1-2 Zeilen Code möglich ist und das es wohl einige unterschiedliche Lösungen für das Problem gibt.

Die Lösung von DeeSpe funktioniert einwandfrei. Danke nochmal!

Aktuell werde ich nichts mehr umbauen, auch wenn die anderen Vorschläge sicherlich auch funktionieren. :-)


Ich schließe das Thema einfach mal als gelöst ab.


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
Gefällt mir Gefällt mir x 1 Liste anzeigen

 

decade-submarginal