Chart-Darstellung von Fritzbox-Daten (CPU...)

Begonnen von juemuc, 06 August 2025, 12:16:53

Vorheriges Thema - Nächstes Thema

juemuc

Hallo @schwatter,

Du hast ja unter FB-Charts ein kleines Skript zur Darstellung von FB-Daten bereitgestellt. Nach einem Neustart der FB ist mir aufgefallen, dass die Linie für "CPU" und "TEMP" immer noch bei null sind, obwohl schon Daten vorhanden sind.
Du darfst diesen Dateianhang nicht ansehen.

box_cpu_Data 8,8,7,8,8,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,8,7,7,8,8,8,8,8,8,7,8,8,7,7,7,7,7,7,8,9,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,10,9,9,8,10,8,8,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
oder
box_cpuTemp_Data
   
55,55,55,55,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,55,55,55,55,54,55,54,54,53,54,54,54,54,54,54,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,54,55,55,55,55,54,55,55,55,55,55,54,55,55,55,54,54,54,53,53,53,53,53,53,53,53,53,54,53,54,53,53,53,53,53,53,53,54,54,53,54,54,54,54,54,54,54,53,54,54,54,53,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,55,55,55,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

und hier zur Sicherheit das Skript:
{
  my @series = (
    { name => 'box_cpu_Data', label => 'CPU', unit => '%', color => '#3b82f6' },
    { name => 'box_cpuRAMCacheUsed_Data', label => 'RAM Cache', unit => '%', color => '#10b981' },
    { name => 'box_cpuRAMPhysFree_Data', label => 'RAM Free', unit => '%', color => '#f59e0b' },
    { name => 'box_cpuRAMStrictlyUsed_Data', label => 'RAM Used', unit => '%', color => '#ef4444' },
    { name => 'box_cpuTemp_Data', label => 'Temp', unit => '°C', color => '#8b5cf6' },
  );

  my $width = 155;
  my $chart_count = scalar @series;
  my $row_height = 36;

  # SVG-Höhe +4px Puffer, Container entsprechend anpassen
  my $svg_height = $row_height * $chart_count + 4;    # 184px
  my $container_height = $svg_height + 20;            # 204px inkl. Padding

  my (@paths, @labels, @values);

  foreach my $i (0 .. $#series) {
    my $s = $series[$i];

    my @v = (split /,/, ReadingsVal($name, $s->{name}, ''))[-40..-1];
    @v = grep { defined && $_ ne '' } @v;

    my $min = 0;
    my $max = 100;
    my $range = $max - $min;
    my $w = $width / (@v - 1 || 1);
    my $y_offset = $i * $row_height;

    # Y-Berechnung mit 2px Puffer oben, damit nicht bis ganz unten (Clip) bei 0
    my @points = map {
      my $x = $_ * $w;
      my $y = $row_height - (($v[$_] - $min) / $range * ($row_height - 2));
      [$x, $y + $y_offset];
    } 0 .. $#v;

    my $path_d = "M" . join(" L", map { sprintf("%.2f,%.2f", @$_) } @points);
    push @paths, qq{<path d="$path_d" fill="none" stroke="$s->{color}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />};

    # Leicht unterhalb der Mitte ausrichten (für optisch bessere Zentrierung)
    my $text_top = $y_offset + int($row_height / 2) + 5;
    push @labels, qq{<div style="position:absolute; top:${text_top}px; left:10px; width:90px; color:$s->{color}; font-weight:bold; font-size:12px;">$s->{label}</div>};

    my $val_str = ReadingsVal($name, $s->{name}, '');
    my ($last_val) = (split /,/, $val_str)[-1];
    $last_val = '--' unless defined $last_val && $last_val ne '';
    push @values, qq{<div style="position:absolute; top:${text_top}px; left:100px; width:60px; text-align:center; font-size:12px; font-weight:bold;">$last_val $s->{unit}</div>};
  }

  my $label_html = join '', @labels;
  my $value_html = join '', @values;
  my $path_svg = join '', @paths;

  my $grid_lines = join '', map {
    my $y = $_ * $row_height;
    qq{<line x1="0" y1="$y" x2="$width" y2="$y" stroke="#ccc" stroke-dasharray="2,2" stroke-width="0.5" />}
  } 1 .. ($chart_count - 1);

  return qq{
    <style>
      div#$name { pointer-events:none; }
    </style>
    <div style="width:365px; padding:10px; border:1px solid #ddd; border-radius:6px; font-family:sans-serif; box-shadow:0 2px 4px rgba(0,0,0,0.1); box-sizing:border-box; height:${container_height}px; position:relative;">
      $label_html
      $value_html
      <div style="position:absolute; top:10px; right:10px; width:160px; height:${svg_height}px; overflow:hidden;">
        <svg style="width:160px!important; height:${svg_height}px!important; display:block;" viewBox="0 0 $width $svg_height" preserveAspectRatio="xMidYMid meet">
          $grid_lines
          $path_svg
        </svg>
      </div>
    </div>
  };
}

Wo liegt der Fehler?

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).

schwatter

Tag,
ist mir einmal bei dem Update auf 8.20 aufgefallen. Am nächsten Tag war es dann wieder ok.
Schau dir die Arraydaten an von box_cpuTemp_Data und box_cpu_Data an. Beide haben rechts viele Nullen.
Theorie, entweder liefert die Fritzbox falsche/keine Daten, oder die Arrays werden falsch herum erzeugt? In der Fritzbox oder dem Fhemmodul?
Normal ist links der älteste Wert und Rechts der neuste Wert.

Gruß schwatter

JoWiemann

Hallo schwatter,

im Fhem Web kannst Du über
get <name> callApifromList <data.lua|query.lua|tr064|javascript>

Es wird jeweils für data.lua, query.lua, tr064 oder javascript eine HTML-Tabelle mit den bekannten sinnvollen Parametern bereit gestellt.
In der Tabelle befinden sich in der ersten Spalte Links, mit denen der Aufruf sofort angestoßen werden kann. Das Ergebnis wird dann in einem PopUp-Fenster angezeigt.
in der Liste javascript den API cpu aufrufen. Als Rückmeldung wird Dir dann das von der FB gelieferte JSON angezeigt.
Das Reading wird dann basierend auf dem Attribut

enableCPUInfo <0 | (-1) | 1 | 2 ... | 24>

Einige FritzBox stellen ab der Fritz!OS Version 8.00 Zeitreihen zur CPU zur Verfügung:
StatCurrentInterval (Einzelwert) => Reading: box_cpuCurrentInterval_Data
StatCPU (240 Werte, letzte 24 Stunden) => Reading: box_cpu_Data
StatTemperature (240 Werte, letzte 24 Stunden) => Reading: box_cpuTemp_Data
StatRAMCacheUsed (240 Werte, letzte 24 Stunden) => Reading: box_cpuRAMCacheUsed_Data
StatRAMStrictlyUsed (240 Werte, letzte 24 Stunden) => Reading: box_cpuRAMStrictlyUsed_Data
StatRAMPhysFree (240 Werte, letzte 24 Stunden) => Reading: box_cpuRAMPhysFree_Data

Ist das Attribut nicht gesetzt oder 0 werden keine Readings bereit gestellt.
Ist das Attribut auf -1 gesetzt werden die Readings mit dem aktuellsten Wert bereit gestellt.
Ist das Attribut auf >= 1 werden die Readings auf 1..24 Stunden * 10 Werte pro Stunde gesetzt.
wie folgt gebildet
my $StatCPU             = join(",", (split /,/, $resultData->{data}{StatCPU})[$intValLeft..-1]);

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

schwatter

Mh,
sieht so aus, als wenn my $StatCPU rechts Werte hinzufügt. Dann werden die Nullen im ersten Moment von der Fritzbox
nach einem Neustart erzeugt und man muss damit leben?

Gruß schwatter

JoWiemann

Hallo schwatter,

die FB schiebt die neuen Daten von links in das Array. Ich passe das an.

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM