FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Chiemgauer am 27 Mai 2017, 12:22:13

Titel: [gelöst] Zahlen umwandeln, bzw. nur teile verwenden
Beitrag von: Chiemgauer am 27 Mai 2017, 12:22:13
Servus,
ich bekomme von meiner synology eine Festplattenspeicher von 4949679534080 Bytes gemeldet. Ichmöchte dies nun in Terra, giga und MB anzeigen. Das rechnen ist mir klar, nur wenn ich terra berechne ist der Wert 4.949679534080. hier einfach die kommastellen weglassen und man hat eine reine Anzeige von 4 Terra. Aber wie macht man das für giga und MB?
Titel: Antw:Zahlen umwandeln, bzw. nur teile verwenden
Beitrag von: KernSani am 27 Mai 2017, 12:34:05
Schau dir mal (z.B) das an: http://www.perlmonks.org/?node_id=378538
Titel: Antw:Zahlen umwandeln, bzw. nur teile verwenden
Beitrag von: Chiemgauer am 27 Mai 2017, 12:37:38
Werde daraus nicht wirklich schlau.
Titel: Antw:Zahlen umwandeln, bzw. nur teile verwenden
Beitrag von: CoolTux am 27 Mai 2017, 12:46:03
sprintf oder substr verwenden. Anwendung bitte im Selbststudium versuchen zu erlernen.
Titel: Antw:Zahlen umwandeln, bzw. nur teile verwenden
Beitrag von: KernSani am 27 Mai 2017, 13:07:51
Vielleicht mal grundsätzliche Frage: Willst du einzelne (user-)readings für GB, MB usw... oder willst du alles via stateFormat formatieren? Was hast du bisher probiert?
Titel: Antw:Zahlen umwandeln, bzw. nur teile verwenden
Beitrag von: Chiemgauer am 27 Mai 2017, 22:02:43
Eigentlich möchte ich einzelne userreadings, da ich es in Ftui, detailliert und übersichtlich, darstellen möchte. Probiert habe ich  noch nicht viel, da ich nicht weiß wie ich es anpacken soll. Viel gesucht und gelesen, aber nicht wirklich was gefunden.
Titel: Antw:Zahlen umwandeln, bzw. nur teile verwenden
Beitrag von: Chiemgauer am 27 Mai 2017, 22:31:00
Substr ist mir bekannt, aber das hilft mir nur die hinteren Zahlen weg zu kürzen. Was die Schwierigkeit ist, ist die vorderen Zahlen zu kürzen. Das heißt bei 4957GB die 4 weg zu bekommen.
Titel: Zahlen umwandeln, bzw. nur teile verwenden
Beitrag von: KernSani am 28 Mai 2017, 00:06:24
Wenn du nur wegkürzen willst, kannst du dich ja von hinten nach vorne durch arbeiten, Pseudocode:

$byte = substr <dein reading>, -3;
$kbyte = substr <dein reading>, -6,3;
...



Nicht elegant, aber sollte funktionieren...



Titel: Antw:Zahlen umwandeln, bzw. nur teile verwenden
Beitrag von: SabineT am 28 Mai 2017, 07:11:21
Zitat von: Chiemgauer am 27 Mai 2017, 22:31:00
Substr ist mir bekannt, aber das hilft mir nur die hinteren Zahlen weg zu kürzen. Was die Schwierigkeit ist, ist die vorderen Zahlen zu kürzen. Das heißt bei 4957GB die 4 weg zu bekommen.
du willst aus 4957GB dann 957GB machen?
Titel: Antw:Zahlen umwandeln, bzw. nur teile verwenden
Beitrag von: Chiemgauer am 28 Mai 2017, 15:25:45
Ich möchte aus 4949679534080bytes eine Anzeige in tb,gb,mb machen. Das heißt (natürlich mit den Faktor 1024)  4tb, 609gb, 382mb machen. Finde es übersichtlicher als eine ewige Zahl.
Titel: Antw:Zahlen umwandeln, bzw. nur teile verwenden
Beitrag von: KernSani am 28 Mai 2017, 15:34:37
Ok, dann reicht ein substr natürlich nicht... falls mir niemand zuvor kommt, bastle ich heute abend mal ein Beispiel...
Titel: Antw:Zahlen umwandeln, bzw. nur teile verwenden
Beitrag von: SabineT am 28 Mai 2017, 16:29:43
dann müsste ja das Beispiel aus dem Link http://www.perlmonks.org/?node_id=378538 (http://www.perlmonks.org/?node_id=378538), den KernSani weiter oben angegeben hat, brauchbar sein:
sub prettyBytes {
my $size = $_[0];
foreach ('b','kb','mb','gb','tb','pb')
{
    return sprintf("%.2f",$size)."$_" if $size < 1024;
    $size /= 1024;
}
}
und einfach beim sprintf die gewünschte Anzahl an Kommastellen verwenden.

Sabine
Titel: Antw:Zahlen umwandeln, bzw. nur teile verwenden
Beitrag von: Chiemgauer am 31 Mai 2017, 18:13:55
Ok der Code kommt in die 99_myutils.
Aber wie setze ich dann die Umrechnung um? Ich steh irgendwie aufnähe Schlauch.
Titel: Antw:Zahlen umwandeln, bzw. nur teile verwenden
Beitrag von: Thorsten Pferdekaemper am 31 Mai 2017, 20:29:51
Zitat von: Chiemgauer am 31 Mai 2017, 18:13:55
Aber wie setze ich dann die Umrechnung um? Ich steh irgendwie aufnähe Schlauch.
In Deinem ersten Post hast Du den Eindruck erweckt, dass Dir das im Prinzip klar wäre. Wie hättest Du das denn bei Deinem dort genannten Beispiel gemacht?
Gruß,
   Thorsten
Titel: Antw:Zahlen umwandeln, bzw. nur teile verwenden
Beitrag von: Chiemgauer am 01 Juni 2017, 13:18:26
Das aktuelle Reading mit der Rechnung, der aus Bytes Terra macht, kann ich heute Abend wenn ich zuhause bin posten.
Grob gesagt 4949679534080 / 1000000000 =4.949679534080. Im FTUI nur ganze Zahl darstellen. Genaues heute Abend.
Mein Problem ist ja nicht das Rechnen, das denke ich zumindest, sondern wie ich den Code, gespeichert in der 99-MyUtils, dann im Reading einbinde bzw. verwende.
Titel: Antw:Zahlen umwandeln, bzw. nur teile verwenden
Beitrag von: KernSani am 01 Juni 2017, 13:43:58
das machst du dann über ein User Reading, etwa so

attr mySynology userReadings disc_in_TB { prettyBytes(ReadingsVal("mySynology","disc_in_byte",0)); }

Titel: Antw:Zahlen umwandeln, bzw. nur teile verwenden
Beitrag von: Thorsten Pferdekaemper am 01 Juni 2017, 19:56:32
Zitat von: Chiemgauer am 01 Juni 2017, 13:18:26
Das aktuelle Reading mit der Rechnung, der aus Bytes Terra macht, kann ich heute Abend wenn ich zuhause bin posten.
Genau das. Davon ausgehend kann man dann sehen, ob und wie man da was anderes einbaut.

Zitat
Mein Problem ist ja nicht das Rechnen, das denke ich zumindest, sondern wie ich den Code, gespeichert in der 99-MyUtils, dann im Reading einbinde bzw. verwende.
Das ist schon klar, aber dafür ist es halt gut, zu sehen was Du bisher machst.

Gruß,
   Thorsten
Titel: Antw:Zahlen umwandeln, bzw. nur teile verwenden
Beitrag von: Chiemgauer am 03 Juni 2017, 09:25:27
Sorry hat etwas gedauert:
Readings:
/
1619812352
2017-06-03 09:16:29
/dev/shm
345075712
2017-06-03 09:16:29
/run
341159936
2017-06-03 09:16:29
/tmp
343932928
2017-06-03 09:16:29
/volume1
4949681082368
2017-06-03 09:16:29
Cachedmemory
0
2017-06-03 09:16:29
Memorybuffers
641937408
2017-06-03 09:16:29
Physicalmemory
61849600
2017-06-03 09:16:29
Sharedmemory
0
2017-06-03 09:16:29
Swapspace
2147414016
2017-06-03 09:16:29
Virtualmemory
2209263616
2017-06-03 09:16:29
Volume1
4.949681082368
2017-06-03 09:15:29
Volume1GB
4949.681082368
2017-06-03 09:22:29
load
4.24
2017-06-03 09:22:29
state
4.24 4.16 4.15
2017-06-03 09:22:29
temperature
38
2017-06-03 09:22:29
uptime
7 days, 06:40:19.17
2017-06-03 09:22:29

Attributes
filesystems
1,3,6,7,8,10,31,36,37,38,42
deleteattr
mibs
.1.3.6.1.4.1.6574.2.1.1.6.0:temp_hdd1 ,
.1.3.6.1.4.1.6574.2.1.1.6.1:temp_hdd2 ,
.1.3.6.1.4.1.6574.2.1.1.5.0:state_hdd1 ,
.1.3.6.1.4.1.6574.2.1.1.5.1:state_hdd2 ,
.1.3.6.1.4.1.2021.4.6.0:freier_Speicher
deleteattr
room
0.4 Technikraum,5.4 Server
deleteattr
snmp
1
deleteattr
snmpCommunity
DS216Technikraum
deleteattr
snmpVersion
2
deleteattr
synologytemperature
1
deleteattr
uptime
7 days, 06:42:19.17
deleteattr
userReadings
Volume1GB { ReadingsVal("DS216Status","/volume1",0) *.000000001;; }
deleteattr
webCmd
Volume1
deleteattr
Titel: Antw:Zahlen umwandeln, bzw. nur teile verwenden
Beitrag von: Thorsten Pferdekaemper am 03 Juni 2017, 19:58:47
Was soll denn das sein? Könntest Du vielleicht einfach mal ein list Deines Device liefern?
Anonsten: Wahrscheinlich musst Du die neue Funktion einfach so aufrufen, wie Du heute ReadingsVal aufrufst, nur halt ohne die Berechnungen außen herum.
Gruß,
   Thorsten
Titel: Antw:Zahlen umwandeln, bzw. nur teile verwenden
Beitrag von: KernSani am 03 Juni 2017, 20:37:19
@Chiemgauer: Hast du das userreading, das ich etwas weiter oben vorgeschlagen habe mal ausprobiert? (Nachdem du die sub in der 99_myUtils angelegt hast)?
Titel: Antw:Zahlen umwandeln, bzw. nur teile verwenden
Beitrag von: Chiemgauer am 04 Juni 2017, 19:37:05
Das sind meine user Readings:
userReadings
Volume1GB { ReadingsVal("DS216Status","/volume1",0) *.000000001;; }, Volume1TB { prettyBytes(ReadingsVal("DS216Status","/volume1",0)); }, Volume1MB { ReadingsVal("DS216Status","/volume1",0) *.000001;; }, Volume1MB_belegt { 5000000.0 - ReadingsVal("DS216Status","Volume1MB",0);; }


Die Readings sehen so aus:

Volume1GB 4866.543456256
Volume1MB 4866543.456256
Volume1MB_belegt 133456.543744001
Volume1TB 4.43tb

Titel: Antw:Zahlen umwandeln, bzw. nur teile verwenden
Beitrag von: Chiemgauer am 04 Juni 2017, 19:38:59
Wobei ich bei Volume1TB den Code in der my Utils verwendet habe, der aber, so scheint mir, von der Rechnung nicht ganz stimmt.
Titel: Antw:Zahlen umwandeln, bzw. nur teile verwenden
Beitrag von: Thorsten Pferdekaemper am 04 Juni 2017, 20:35:12
Hi,
es kommt dabei darauf an, was man genau meint. Manchmal wird mit Basis 1000 gerechnet, manchmal mit 1024. Das kannst Du ja im Coding ändern, einfach die 1024 durch 1000 ersetzen.
Allerdings willst Du doch was anderes oder? Du wolltest doch sowas haben wie "4TB 27GB 18MB 12kB 8B". Richtig?
Gruß,
   Thorsten
Titel: Antw:Zahlen umwandeln, bzw. nur teile verwenden
Beitrag von: Thorsten Pferdekaemper am 04 Juni 2017, 21:16:35
Hi,
ich habe mal schnell was gebastelt:

sub myUtils_prettyBytes($;$) {
  my ($bytes,$base) = @_;
  $base = 1000 unless($base);
  use integer;
  my $result = "";
  foreach my $unit ('B','KB','MB','GB','TB','PB') {
    my $part = $bytes % $base;
    $result = $part.$unit.($result ? " " : "").$result if($part);
    $bytes /= $base;
  };
  return $result if($result);
  return "0B";
};

...und hier ein list für die Anwendung und das Ergebnis:

Internals:
   CFGFN
   NAME       bytes
   NR         95
   STATE      off
   TYPE       dummy
   Readings:
     2017-06-04 21:13:49   prettyBytes     4TB 949GB 679MB 534KB 80B
     2017-06-04 21:13:49   state           off
Attributes:
   userReadings prettyBytes { myUtils_prettyBytes(4949679534080) }

Mit dem zweiten Parameter der sub kann man die Basis ändern. Default ist 1000, da Du das auch so machst. Irgendwo schreibst Du aber, dass Du eigentlich 1024 willst, also als zweiten Parameter einfach 1024 reinschreiben.
Gruß,
   Thorsten
Titel: Antw:Zahlen umwandeln, bzw. nur teile verwenden
Beitrag von: Chiemgauer am 05 Juni 2017, 13:58:00
Vielen Dank!
Mit
Volume1_ { myUtils_prettyBytes(ReadingsVal("DS216Status","/volume1",0)); }
funktioniert es!