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?
Schau dir mal (z.B) das an: http://www.perlmonks.org/?node_id=378538
Werde daraus nicht wirklich schlau.
sprintf oder substr verwenden. Anwendung bitte im Selbststudium versuchen zu erlernen.
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?
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.
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.
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...
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?
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.
Ok, dann reicht ein substr natürlich nicht... falls mir niemand zuvor kommt, bastle ich heute abend mal ein Beispiel...
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
Ok der Code kommt in die 99_myutils.
Aber wie setze ich dann die Umrechnung um? Ich steh irgendwie aufnähe Schlauch.
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
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.
das machst du dann über ein User Reading, etwa so
attr mySynology userReadings disc_in_TB { prettyBytes(ReadingsVal("mySynology","disc_in_byte",0)); }
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
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
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
@Chiemgauer: Hast du das userreading, das ich etwas weiter oben vorgeschlagen habe mal ausprobiert? (Nachdem du die sub in der 99_myUtils angelegt hast)?
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
Wobei ich bei Volume1TB den Code in der my Utils verwendet habe, der aber, so scheint mir, von der Rechnung nicht ganz stimmt.
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
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
Vielen Dank!
Mit
Volume1_ { myUtils_prettyBytes(ReadingsVal("DS216Status","/volume1",0)); }
funktioniert es!