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.
Hi,
einen Wert ohne Nachkommastellen musst Du über eine Perl-Funktion "sprintf" erreichen.
Viele Grüße
Jürgen
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",""))
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).
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
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.
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 !!
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
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
Zitat von: betateilchen am 11 April 2025, 11:48:58Zitat 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...
Zitat von: rabehd am 11 April 2025, 11:51:37Zitat 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.
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)
Zitat von: rabehd am 11 April 2025, 11:51:37Zitat 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.
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
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
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?
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
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.
Zitat von: frober am 13 April 2025, 09:39:17Zitat 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.
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
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.