FHEM Forum

FHEM => Automatisierung => Thema gestartet von: satprofi am 11 April 2025, 11:20:44

Titel: Wert ohne Kommastelle angeben
Beitrag von: satprofi am 11 April 2025, 11:20:44
Hallo.
Bin gerade dabei ein script zu schreiben, wo ich aber Werte ohne Kommastelle benötige. Alle Tips der Suchergebnisse brachten nichts, deshalb meine Frage dazu, wie komme ich auf ganze Zahlen ?
Weiters würde ich einen Tipp benötigen um Werte in 2er Sprünge abzusetzen, also wenn Wert-x zwischen "10" u.  "11.9" ausgegeben wird dann soll er Wert 10 setzen, usw.
Das folgende Script soll meine Ladesteuerung regeln
sub xtender2(){
 
  my $ladestrom = ReadingsVal("Ladestrom","state","");
  my $ueberschuss = ReadingsVal("Ueberschuss","state","");
  my $Amp = $ueberschuss/50;
  my $cmd = $ladestrom + $Amp;

  if ($ladestrom >0)
     {
      fhem("set test_1 $Amp");
        if ($ladestrom <91)
           { fhem("set test_2 $cmd") };
     }
 
}


Getriggert wird das ganze vom Reading Ueberschuss, was im testbetrieb läuft, aber eben mit kommastellen. Die Kommandos dazu muss ich erst umsetzen, weiss aber noch nicht wie.
Titel: Aw: Wert ohne Kommastelle angeben
Beitrag von: juemuc am 11 April 2025, 11:26:35
Hi,

einen Wert ohne Nachkommastellen musst Du über eine Perl-Funktion "sprintf" erreichen.

Viele Grüße
Jürgen
Titel: Aw: Wert ohne Kommastelle angeben
Beitrag von: rabehd am 11 April 2025, 11:29:22
Zitat von: satprofi am 11 April 2025, 11:20:44wo ich aber Werte ohne Kommastelle benötige.
Das funktioniert nicht ?
sprintf( "%.0f",ReadingsVal("Ladestrom","state",""))
Titel: Aw: Wert ohne Kommastelle angeben
Beitrag von: frober am 11 April 2025, 11:30:25
Runden kannst du mit der Fhem eigenen Funktion round(Wert, Kommastelle), wobei hier nicht wirklich gerundet wird. Es werden nur die Nachkommastellen abgeschnitten.
Je nach dem kannst du auch mit ReadingsNum() direkt schon "runden".

Nachtrag:
Für die 2er-Sprünge müsstest du die gewünschten Werte mit dem IST vergleichen (größer/kleiner).
Titel: Aw: Wert ohne Kommastelle angeben
Beitrag von: satprofi am 11 April 2025, 11:32:32
Zitat von: juemuc am 11 April 2025, 11:26:35Hi,

einen Wert ohne Nachkommastellen musst Du über eine Perl-Funktion "sprintf" erreichen.

Viele Grüße
Jürgen

Hallo, ja das ist mir klar, aber wie schreibe ich das richtig ?

my $Amp = $ueberschuss/50; Ergebnis soll ohne Kommastelle sein
Titel: Aw: Wert ohne Kommastelle angeben
Beitrag von: frober am 11 April 2025, 11:35:17
my $Amp = round($ueberschuss/50, 0);
sprintf schneidet auch nur die Nachkommastellen ab.
Wenn du auf die Genauigkeit wert legst, kannst du vor dem runden 0,5 dazu addieren.
Titel: Aw: Wert ohne Kommastelle angeben
Beitrag von: satprofi am 11 April 2025, 11:45:16
Zitat von: frober am 11 April 2025, 11:35:17my $Amp = round($ueberschuss/50, 0);
sprintf schneidet auch nur die Nachkommastellen ab.
Wenn du auf die Genauigkeit wert legst, kannst du vor dem runden 0,5 dazu addieren.

DANKE !!
Titel: Aw: Wert ohne Kommastelle angeben
Beitrag von: betateilchen am 11 April 2025, 11:48:58
Zitat von: frober am 11 April 2025, 11:35:17sprintf schneidet auch nur die Nachkommastellen ab.

Diese Behauptung ist Unsinn.

sub test {
  my $val = 1.654;
  Debug sprintf("%.2f", $val);
  Debug sprintf("%.1f", $val);
  Debug sprintf("%.0f", $val);
  return;
}

liefert als Ergebnisse:

2025.04.11 11:47:12 1: DEBUG>1.65
2025.04.11 11:47:12 1: DEBUG>1.7
2025.04.11 11:47:12 1: DEBUG>2
Titel: Aw: Wert ohne Kommastelle angeben
Beitrag von: rabehd am 11 April 2025, 11:51:37
Zitat von: satprofi am 11 April 2025, 11:45:16Wenn du auf die Genauigkeit wert legst, kannst du vor dem runden 0,5 dazu addieren.
Echt? Das ist dann genauer?  :o
Titel: Aw: Wert ohne Kommastelle angeben
Beitrag von: frober am 11 April 2025, 11:54:41
Zitat von: betateilchen am 11 April 2025, 11:48:58
Zitat von: frober am 11 April 2025, 11:35:17sprintf schneidet auch nur die Nachkommastellen ab.
Diese Behauptung ist Unsinn.

Es gab doch mal eine Diskussion wg. Ungenauigkeiten beim runden und mWn verwendet round() im Hintergrund sprintf.
Habe ich da eine falsche Erinnerung?


Edit:
Ich habs mit runden in C (int) verwechselt...
Titel: Aw: Wert ohne Kommastelle angeben
Beitrag von: frober am 11 April 2025, 11:55:36
Zitat von: rabehd am 11 April 2025, 11:51:37
Zitat von: satprofi am 11 April 2025, 11:45:16Wenn du auf die Genauigkeit wert legst, kannst du vor dem runden 0,5 dazu addieren.
Echt? Das ist dann genauer?  :o

Probiers aus, bezogen auf das Abschneiden der Kommastellen.
Titel: Aw: Wert ohne Kommastelle angeben
Beitrag von: betateilchen am 11 April 2025, 11:56:50
Anmerkung 1:
Wenn man als Ergebnis ohnehin numerische Werte erwartet, sollte man besser mit ReadingsNum() anstatt ReadingsVal() arbeiten, insbesondere, wenn man mit den Werten mathematisch weiterarbeiten möchte.

Anmerkung 2:
ReadingsNum() kann auch schon selbst runden, was oft "vergessen" wird. (Hier im konkreten Szenario aber nicht relevant, weil erst gerechnet wird und dann das Ergebnis gerundet werden soll)
Titel: Aw: Wert ohne Kommastelle angeben
Beitrag von: frober am 12 April 2025, 10:20:45
Zitat von: rabehd am 11 April 2025, 11:51:37
Zitat von: satprofi am 11 April 2025, 11:45:16Wenn du auf die Genauigkeit wert legst, kannst du vor dem runden 0,5 dazu addieren.
Echt? Das ist dann genauer?  :o

Bsp.
{int(3.675)} ergibt 3
{int(3.675 + 0.5)} ergibt 4
int() schneidet die Nachkommastellen einfach ab

Da ich das mit Arduino (C/C++) verwende, hatte ich es mit round/sprintf verwechselt.
Titel: Aw: Wert ohne Kommastelle angeben
Beitrag von: Prof. Dr. Peter Henning am 12 April 2025, 17:13:39
Zitat von: rabehd am 11 April 2025, 11:51:37Echt? Das ist dann genauer? 
Ja. Hast Du hoffentlich in der 6. Klasse gelernt  8)

LG

pah
Titel: Aw: Wert ohne Kommastelle angeben
Beitrag von: satprofi am 13 April 2025, 09:25:44
Hallo.
Habe es so gelöst daß ich immer gerade Zahl erhalte

my $Amp = int($ueberschuss/50);
  my $Amp2 = int($Amp/2);
  my $Amp21 = $Amp2 *2
Titel: Aw: Wert ohne Kommastelle angeben
Beitrag von: frober am 13 April 2025, 09:39:17
Zitat von: satprofi am 13 April 2025, 09:25:44Hallo.
Habe es so gelöst daß ich immer gerade Zahl erhalte

my $Amp = int($ueberschuss/50);
  my $Amp2 = int($Amp/2);
  my $Amp21 = $Amp2 *2


Wenn's dich nicht stört, dass das Ergebnis durch abschneiden der Kommastelle verfälscht ist...


my $Amp2 = int($Amp/2);
  my $Amp21 = $Amp2 *2
Du teilst durch 2 und verdoppelst danach wieder...wo ist da der Sinn?
Titel: Aw: Wert ohne Kommastelle angeben
Beitrag von: RalfRog am 13 April 2025, 10:06:13
Siehe im Ursprungspost. Er will nur mit geraden Zahlen arbeiten.

Zitat von: satprofi am 11 April 2025, 11:20:44...Tipp benötigen um Werte in 2er Sprünge abzusetzen, also wenn Wert-x zwischen "10" u.  "11.9" ausgegeben wird dann soll er Wert 10 setzen...

Gruß Ralf
Titel: Aw: Wert ohne Kommastelle angeben
Beitrag von: frober am 13 April 2025, 10:15:36
Zitat von: RalfRog am 13 April 2025, 10:06:13Siehe im Ursprungspost. Er will nur mit geraden Zahlen arbeiten.

Zitat von: satprofi am 11 April 2025, 11:20:44...Tipp benötigen um Werte in 2er Sprünge abzusetzen, also wenn Wert-x zwischen "10" u.  "11.9" ausgegeben wird dann soll er Wert 10 setzen...

Gruß Ralf



?? ?? ??

Genau deswegen sollte man runden und nicht abschneiden...
OK, nochmal drüber nachgedacht...

...und mit teilen und wieder verdoppeln hat das auch nichts zu tun.
Titel: Aw: Wert ohne Kommastelle angeben
Beitrag von: satprofi am 13 April 2025, 10:23:04
Zitat von: frober am 13 April 2025, 09:39:17
Zitat von: satprofi am 13 April 2025, 09:25:44Hallo.
Habe es so gelöst daß ich immer gerade Zahl erhalte

my $Amp = int($ueberschuss/50);
  my $Amp2 = int($Amp/2);
  my $Amp21 = $Amp2 *2


Wenn's dich nicht stört, dass das Ergebnis durch abschneiden der Kommastelle verfälscht ist...


my $Amp2 = int($Amp/2);
  my $Amp21 = $Amp2 *2
Du teilst durch 2 und verdoppelst danach wieder...wo ist da der Sinn?

ich runde ja den geteilten Wert ab, und dann verdoppelt ergibt immer gerade Zahl.
Titel: Aw: Wert ohne Kommastelle angeben
Beitrag von: frober am 13 April 2025, 10:46:06
Zitat von: satprofi am 13 April 2025, 10:23:04ich runde ja den geteilten Wert ab, und dann verdoppelt ergibt immer gerade Zahl.

OK, du versuchst so deine 2er Schritte zu bekommen...

Besser ist es, wenn du das Endergebnis auch "rundest"
my $Amp21 = int($Amp2 *2)da Perl gerne auch bei einfachen Rechnungen so etwas ausgibt
2.000000001
Titel: Aw: Wert ohne Kommastelle angeben
Beitrag von: rabehd am 13 April 2025, 14:01:09
Zitat von: Prof. Dr. Peter Henning am 12 April 2025, 17:13:39Ja. Hast Du hoffentlich in der 6. Klasse gelernt
Das war 1978/79 im einem Land welches heute nicht mehr vorhanden ist.
Laplace-Transformation, gelernt 1984/85, ist mir auch entfallen.