Wert ohne Kommastelle angeben

Begonnen von satprofi, 11 April 2025, 11:20:44

Vorheriges Thema - Nächstes Thema

satprofi

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

juemuc

Hi,

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

Viele Grüße
Jürgen
3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).

rabehd

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",""))
Auch funktionierende Lösungen kann man hinterfragen.

frober

#3
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).
Raspi 3b mit Raspbian Bullseye und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

satprofi

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

frober

#5
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.
Raspi 3b mit Raspbian Bullseye und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

satprofi

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

betateilchen

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

rabehd

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
Auch funktionierende Lösungen kann man hinterfragen.

frober

#9
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...
Raspi 3b mit Raspbian Bullseye und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

frober

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.
Raspi 3b mit Raspbian Bullseye und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

betateilchen

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

frober

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.
Raspi 3b mit Raspbian Bullseye und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

Prof. Dr. Peter Henning

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

satprofi

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