Online-Zähler (Traffic) der FritzBox auslesen

Bearbeitet am 14.06.2016: Erstellen eines eigenen Readings für den täglichen Traffic

Das Modul FritzBox stellt neben den bekannten Readings (Anrufe, ….) auch Readings zur Verfügung die in der Standartkonfiguration von FHEM nicht direkt angezeigt werden. Zu diesen versteckten Readings zählt auch der Online-Zähler. In diesem Beitrag erkläre ich euch wie ihr diese Readings sichtbar macht und in FHEM den Tagesverbrauch und den Gesamtverbrauch plottet.

Einrichtung in FHEM

Um in FHEM auch die versteckten Readings anzeigen zu lassen, bedarf es ein globales Attribut

Nun werden auch die versteckten Reading angezeigt.

Traffic_reading

Wie man erkennt, gibt es vier Readings die etwas mit dem Traffic zu tun haben. Es gibt je zwei für die Empfangenen und für die Gesendeten Daten. Diese sind noch jeweils in HIGH und LOW unterteilt. Den Gesamtwert erhält man durch folgende Gleichung:

LOW + HIGH * 2^32

Die Readings geben jeweils die Werte für den aktuellen Tag wieder. Den Gesamtverbrauch muss man innerhalb von FHEM selber ermitteln. Mehr dazu weiter unten.

Um mit diesen Werten arbeiten zu können, ist es am einfachsten, diese mit Hilfe von einem at-Befehl an einen dummy zu schicken. Dazu definieren wir uns zunächst einen at-Erweiterungsmodul:

Als auszuführender Befehl geben wir erstmal den Platzhalter „xx“ an. Später im Editor fügen wir dann den endgültigen Befehl ein. Als Zeitangabe habe ich 1 Minute gewählt. Man sollte jedoch darauf achten, dass es hier nichts bringt, den Befehl alle 5 Sekunden auszuführen, obwohl das Modul FritzBox nur jede Minute aktualisiert wird.

Anschließend noch je einen Dummy für Empfangen und Gesendet:

Nun wird es Zeit den eigentlichen Befehl von atTraffic zu definieren. Dazu öffnen wir den DEF-Editor von atTraffic und fügen folgenden Befehl ein:

 FHEM Traffic Fritzbox

Da die Readings die Werte in Bytes ausgeben, nehme ich noch einige mathematische Spielereien vor um die Werte in GigaByte zu erhalten. Einmal das Umwandeln in MB (geteilt durch 1000*1000) und anschließend noch das Umrechnen in GigaByte (geteilt durch 1000).

Die eingetragene Definition erstellt die Variablen „d“ und „e“ und setzt das entsprechende dummy.

Die Dummys Gesendet und Empfangen erhalten nun jede Minute einen aktuellen Wert. Den gesamten Traffic erhalten wir nun durch ein userReading, welches wir wie folgt definieren

Das gleiche entsprechend für den Empfangen-Dummy. Der Zusatz monotonic bewirkt, dass das Reading „Gesendet“ (der tägliche Traffic) dem userReading Gesendet_ges dazu addiert wird. Sollte sich also das Reading „Gesendet“ beim Tageswechsel wieder auf 0 setzen, fängt „Gesendet_ges“ nicht auch bei 0 an, sondern zählt weiter hoch.

FHEM_FritzBox_Traffic_Daten

Die Readings lassen sich nun in ein LogFile schreiben:

Wichtig ist es, darauf zu achten, Gesendet und Empfangen jeweils in ein getrenntes LogFile zu schreiben, da wir zwei getrennte Plots erstellen wollen.

Über den Plot-Editor erstellen wir uns nun den Plot:

create SVG Traffic

SVG Traffic

Wir erhalten nun eine grafische Darstellung des Online-Zählers der FritzBox. Der Vorteil gegenüber dem direkten Zugriff über die FritzBox ist der, dass man den Verbrauch auch über einen längeren Zeitraum verfolgen kann. Der Online-Zähler der FritzBox zeigt nur den Verbrauch vom aktuellen und letzten Monat an.

Zum Schluss kann man noch ein paar optischen Anpassungen vornehmen. Zu einem das stateFormat:

Für Gesendet entsprechend anpassen.

Und das Hinzufügen eines Symbols:

bzw.

Traffic FritzBox Plot

Jetzt einfach nur noch warten und sich wundern wie viel man so in 10 Jahren aus dem Internet herunterlädt 😉

26 Kommentare zu “Online-Zähler (Traffic) der FritzBox auslesen

  1. Hallo,

    ich finde dies sehr interessant und wollte dies bei mir auch direkt einsetzen.

    Leider klappte „define dummy Gesendet“ nicht. Es muss glaube ich „define Gesendet dummy“ heißen. Und bei dem Befehl: attr Gesendet userReading Gesendet_ges monotonic { ReadingsVal(„Gesendet“,“state“,0)}
    Bekomme ich immer „unknown attribute userReading“
    Ich nehme an, es muss userReadings heißen?

    Viele Grüße
    Jay

    • Hi,
      vielen Dank für dein Interesse.
      Mit den beiden Anmerkungen hast du recht gehabt. Habe es im Beitrag verbessert. Danke für den Hinweis. Hat es den mit den Änderungen geklappt?

      Viele Grüße
      Daniel

  2. hi, wenn ich das hier wie oben in den FHEM Editor eingebe:
    define FritzBox FRITZBOX
    attr FritzBox allowTR064Command 1
    attr FritzBox room Wohnzimmer

    define atTraffic at +*00:01:00 {
    my $d= ((ReadingsVal(„FritzBox“,“.box_TodayBytesReceivedLow“,0) / (1000*1000) ) / 1000 + ( ReadingsVal(„FritzBox“,“.box_TodayBytesReceivedHigh“,0) * 4294967296 / (1000*1000) ) / 1000);
    fhem(„set Empfangen $d“);

    my $e= ((ReadingsVal(„FritzBox“,“.box_TodayBytesSentLow“,0) / (1000*1000) ) / 1000 + ( ReadingsVal(„FritzBox“,“.box_TodayBytesSentHigh“,0) * 4294967296 / (1000*1000) ) / 1000);
    fhem(„set Gesendet $e“);
    }
    define Empfangen dummy
    define Gesendet dummy

    kommt:

    Unknown command my, try help. Unknown command fhem(„set, try help. Unknown command my, try help. Unknown command fhem(„set, try help. Unknown command }, try help.

    habt ihr da eine Idee was da falsch sein könnte?

    • Hallo,
      so wie es aussieht hat es etwas mit dem Befehle „set Empfangen $e“ zu tun. Eigentlich müsste es so funktionieren. Ich habe es jedoch selber vor einiger Zeit etwas optimiert. Ich setze nicht mehr das state-Reading vom Device „Empfangen“ sondern habe ein extra Reading erstellt um es ein bisschen übersichtlicher zu gestalten.
      Anstelle mit „set Empfangen $e“ setze ich das Device nun mit folgendem Befehl:
      „setreading Empfangen Empfangen $e“. Das Device „Empfangen“ erhält nun das Reading „Empfangen“. Vielleicht klappt dies ja auch bei dir. Bei Gelegenheit passe ich den Beitrag mal an.
      Gruß Daniel

  3. Hallo,
    Vielen Dank für die Anleitung! Echt klasse.
    Ich verstehe jedoch den Screenshot mit dem PLOT nicht ganz.

    1. Im Plot-Editor: Wieso gebe ich in der Zeile wo ich „Aktuell [GB]“ definiere, die Spalte „3“ an. und nicht 4?
    2. Auch das RegEx für Aktuell [GB]“ erscheint mir seltsam. Ich meine weil man da mit .* arbeitet?
    3. Wie sehen die Plots nach mehreren Tagen aus?
    Wenn ich Aktuell und Gesamt in einem Plot mische… Habe ich dann nicht in der Y-Achse extreme werte?
    Der Gesamt Zähler wird im laufe der Zeit extrem hohe Werte erreichen, währen der aktuell Zähler immer bei 0 anfängt. => die Y Skala muss also Werte zwischen 0 und z.B. 100 (bzw noch höher) abbilden oder? Durch so eine extremes Intervall auf der Y Achse wird der „Aktuell-Graph“ wohl nicht schön werden oder ist mein Verständniss falsch?

    Würde mich über Feedback sehr freuen!

    • Hallo Stefan,
      danke für das Lob.

      Bei Punkt 1 und 2 hat sich leider ein Fehler in meinem Beitrag eingeschlichen, bzw. ich habe vergessen das Bild anzupassen. Wie bereits in der Antwort auf patmans Kommentar erwähnt, habe ich das dummy-device „Gesendet“ bzw. „Empfangen“ bisschen angepasst. Anstatt das Reading „state“ mit dem aktuellen Traffic zu beschreiben, habe ich ein extra Reading angelegt mit dem Namen „Gesendet“ bzw. „Empfangen“ –> deswegen der Befehl „setreading Empfangen Empfangen $e“ im atTraffic-Device.
      Der aktuelle Wert wird also im Reading „Empfangen“ / „Gesendet“ gespeichert, nicht mehr im state-reading. Deswegen ändert sich auch die Spalte von Spalte 3 auf Spalte 4 und der Eintrag bei RegEx ist dann auch entsprechend „Empfangen.Empfangen“ bzw. „Gesendet.Gesendet“. Deine Vermutung ist also richtig.

      Zu Punkt 3: Der Graph sieht später so aus, dass auf der rechten Seite die Y-Achse von 0-.. geht –> So weit, wie halt der tägliche Traffic ist.
      Auf der linken Seite fängt die Y-Achse jedoch nicht bei 0 an, sondern viel höher, je nach Gesamt-Verbrauch. Sehr gut ist dies auch im letzten Bild zu sehen.
      Dadurch, dass die rechte und linke Y-Achse andere Skalierungen haben, sehen beide Graphen eigentlich ganz ok aus. Möchte man natürlich, dass die Skala beim Gesamt-Verbrauch auch bei 0 anfängt, dann ist es sinnvoll zwei getrennte Graphen zu erstellen, da sonst, wie du schon erwähnst, der aktuelle Verbrauch irgendwann total unter geht.

      Hoffe ich konnte dir etwas weiter helfen und sorry für den Fehler meinerseits. Werde morgen das Bild entsprechend anpassen.

      Gruß Daniel

    • Hallo Daniel,
      Danke für die schnelle und verständliche Antwort. Jetzt hab ich alles verstanden.

      Werde jetzt öfter bei dem Blog reinschaun :).

      Danke & Gruss
      Stefan

  4. Hallo,

    klasse Anleitung!

    Eine Kleinigkeit will bei mir nicht funktionieren. Die dunkelgrüne Linie liegt nicht so auf dem hellgrünen Bereich auf, wie in deinem Beispiel. Die Linie für Empfangen durchzieht einfach das Hellgrüne. Dasselbe im Gesendet-Plot. Das sieht nicht wirklich schön aus.

    Was überseh ich? Oder habe ich etwas vergessen?

    • Hallo Roberto,

      danke für das Lob. Beim Bild im Beitrag ist es nur ein Zufall, dass beide Linien aufeinander liegen. Das liegt daran, dass ich der Y-Achse keinen Festen Zahlenbereich zugewiesen habe. FHEM stellt deswegen den Bereich der Y-Achse automatisch fest.
      Da kann es dann zufällig mal sein, dass die beiden Linien aufeinander liegen.

      Heute zum Beispiel liegen sie nicht aufeinander.

      Traffic Linien

      Gruß Daniel

  5. Hi Daniel, hab alles genau wie hier angegeben durchgeführt, doch leider bekomme ich absolut keine Werte rein. Der FileLog -text  bleibt leer. Und im „at“ wird auch nur angezeigt das gleich das neue „Reading“ kommt. Aber es wird einfach kein Wert aus der Fritzbox gelesen.

    Bitte hier um kurze Unterstützung.

    Gruß Tim

    • Halo Tim,

      die Readings selber bekommst du aber? Also die FritzBox ist korrekt in FHEM eingerichtet und liefert auch die Readings für den Traffic?

      Gruß Danel

    • Hey Daniel, ja die Readings von der FritzBox bekomme ich, lasse mir diese auch ständig per Email zuschicken. Daher bekomme ich die Readings rein.

      Ich habe

      allowTR064Command 1

      und soweit alles übernommen von deiner Anweisung.

    • Hallo Tim,

      wenn du die Readings erhält, dann muss es ja am at-Device liegen. Am besten überprüfst du nochmal die Definition des at-Devices. Ich kann mir sonst nicht vorstellen, woran es liegen kann. Die Readings sind ja vorhanden, d.h. das Auslesen der Readings und das Senden an den Dummys klappt nicht und dafür ist ja das at-Device zuständig.

      Gruß Daniel

    • Hi Daniel, ich habe nochmal nachgeforscht und mir ist aufgefallen das keine aktuellen Readings reinkommen. Hab ich daran gesehen das die DebianMail immer die gleiche Externe IP mitschickt. D.h. „NEIN“ die Readings kommen nicht sauber rein. Denke das ist der Grund warum die Trafficanzeige keine Change hat was anzuzeigen.

      Didn’t get a session ID  !!!

      Ich habe das Device schon mehrmals gelöscht >> reboot >> neuangelegt >> reboot etc.

      Ich bekomme einfach keine Verbindung mehr zur Fritzbox! Hast Du evtl. eine Idee ?

      Gruß Tim

      Internals:
         APICHECKED 1
         DEF        192.168.2.1
         HOST       192.168.2.1
         INTERVAL   300
         LUAQUERY   0
         M3U_LOCAL  ./www/images/FritzBox.m3u
         M3U_URL    unknown
         NAME       FritzBox
         NR         161
         REMOTE     1
         SECPORT    49443
         STATE      Didn’t get a session ID
         TELNET     0
         TR064      1
         TYPE       FRITZBOX
         WEBCM      0
         Readings:
           2017-02-08 09:20:11   box_fwVersion   113.06.80
           2017-02-08 09:20:11   box_model       FRITZ!Box 7490 [avm]
           2017-02-08 09:20:11   lastReadout     13 values captured in 3.00 s
           2017-02-08 08:48:25   state           Didn’t get a session ID
         Fhem:
           LOCAL      0
           definedHost 192.168.2.1
           is_double_wlan -1
           lastHour   0
           modulVersion $Date: 2016-07-17 15:13:57 +0200 (Sun, 17 Jul 2016) $
         Helper:
           TimerCmd   FritzBox.Cmd
           TimerReadout FritzBox.Readout
           Readout_running_pid:
             abortFn    FRITZBOX_Readout_Aborted
             finishFn   FRITZBOX_Readout_Done
             fn         FRITZBOX_Readout_Run_Web
             pid        23652
             Abortarg:
      Attributes:
         allowTR064Command 1
         boxUser    User1
         devStateIcon .*on.*off:WLAN_on_gWLAN_off .*on.*on.*:WLAN_on_gWLAN_on WLAN..off.*:WLAN_off
         icon       it_router
         room       0.0_Übersicht,9.6_FritzBox  

    • Nachtrag : Ein FHEM Update hat geholfen ! Eine Verbindung steht wieder… doch irgendwie hab ich immer noch ein Fehler.

      Hier mal ein Auszug aus der FHME LOG :

      atTraffic: Unknown command { my, try help. Unknown command fhem("setreading, try help. Unknown command my, try help. Unknown command fhem("setreading, try help. Unknown command } , try help.

      +*00:01:00 {
      my $d= ((ReadingsVal("FritzBox",".box_TodayBytesReceivedLow",0) / (1000*1000) ) / 1000 + ( ReadingsVal("FritzBox",".box_TodayBytesReceivedHigh",0) * 4294967296 / (1000*1000) ) / 1000);
      fhem("setreading Empfangen Empfangen $d");

      my $e= ((ReadingsVal("FritzBox",".box_TodayBytesSentLow",0) / (1000*1000) ) / 1000 + ( ReadingsVal("FritzBox",".box_TodayBytesSentHigh",0) * 4294967296 / (1000*1000) ) / 1000);
      fhem("setreading Gesendet Gesendet $e");
      }

      Gruß Tim

       

       

    • Hallo Tim,
      ich habe diese Fehlermeldung auch schonmal gehabt. Damals hatte ich ein at-Device direkt über die Befehlszeite definiert. Das wollte er dann nicht so recht übernehmen. Wenn ich das at-Device erst nur über „define atTraffic at +*00:01:00 a“ definiert und dann die richtige Definition über den DEF-Editor erstellt, dann hat es bei mir geklappt. Im FHEM-Forum hatte auch jemand dieses Problem.

      Da hat ein Löschen des at-Devices geholfen und dann ein erneutes Definieren über den Umweg über den DEF-Editor.

      Gruß Daniel

    • Daniel ! ! Es läuft…  🙂

      Sehr gut, vielen Dank für den Tip!

      Hast Du evtl. ein paar Informationen bezüglich Fhem/FritzBox und Licht schalten bei Anruf?  Da komm ich auch nicht weiter… wenn es Dir hier zu viel wird können wir auch gerne über Email weiterschreiben.

      Callmonitor in FHEM definieren:

      define Telefon FB_CALLMONITOR 192.168.1.1
      attr Telefon event-on-change-reading event

      Licht einschalten bei Anruf

      define TelefonLichtAn notify Telefon {\
      if(ReadingsVal("Telefon","internal_number","") eq "56789"\
      ReadingsVal("Telefon","external_number","") eq "0177xxxxxxx") {\
      fhem ("set LAMPE on-for-timer 30") }\
      }

      Vielen Dank für deine Unterstützung, bin ein Fan von deinem Block, mach weiter so!

      Gruß Tim

  6. Hallo,

    super Anleitung. Bie mir ist jedoch das Problem das in der Datenbank der Täglicher Zähler der Fritzbox erst um 00:05 bei null begint. Im Plott ist das dann mit der Autoskalierung problematisch. Da um Mitternacht die Linie bei zb 8 Gb und dann 5 Minuten später auf fast null Abfällt…. Gibt es dafür eine Lösung, zb das Reading 5 Minuten auszusetzen oder dass der Grapg erst ab 00:05 angängt?

     

    Vielen dank

     

    Gruß

    Thorsten

    • Hallo Thorsten, ich habe bei mir nochmal geschaut. Die FritzBox setzt den Traffic bei mir um Punkt 0:00 Uhr zurück.
      Was mir bei deinem Problem zu erst einfällt, vllt ist ja die Zeit von der FritzBox und die Systemzeit des Raspberrys nicht identisch. Die FritzBox setzt um 0:00 Uhr seiner Zeit zurück, der Raspberry hat dann jedoch schon 0:05 Uhr.
      Ich denke die x-Achse zu ändern wird relativ kompliziert. Da ja die Messwerte mit den Zeitpunkten der Messung verknüpft sind. Und um 0:04 hat er halt noch 8gb gemessen.

      Gruß Daniel

  7. Hallo,
    Die Zeiten sind bei synron. Als Übergangslösung werde das at Modul welches die Readings ausliest von 23:59 bist 00:06 mit einem notify disbablen.

    Gruß

    Thorsten

    • Was mir grad noch eingefallen ist. Es spielen ja mehrere Zeitintervalle eine Rolle. Da ist ja zum Einen der Intervall der FritzBox, in dem die Daten geladen werden. Bei mir 300, also alle 5min. Und zum Anderen das at-Device, welches die Traffic-Dummys mit den Werten bedient. Wenn diese Intervalle ungünstig gewählt sind bzw. zu ungünstigen Zeitpunkten ausgelöst werden, dann kann es ja schon vorkommen, dass der Reset um 0:00 erst 5min später (Intervall 300 –> 5min) im Graph erscheint.

      Du kannst ja mal die Intervalle verringern und schauen ob es hilft.

      Gruß Daniel

  8. Hallo Daniel,

    wie könnte ich das anstellen das er den Zähler des gesamten Traffics am Monatsende zurücksetzt?

    Das Problem, dass das Reading der Fritzbox erst um 00:05 zurückgesetzt wird habe ich erstmal mit den automatischen Disablen des „atTraffic“ von 23:59 bis 00:06 gelöst..

     

    Gruß

    Thorsten

    • Hallo Thorsten,

      das kannst du einfach über ein atBefehl realisieren:

      define atTrafficReset at *00:00:00 {if(mday==1){fhem("setreading Empfangen Empfangen_ges 0"); fhem("setreading Gesendet Gesendet_ges 0");}

      So wird jedesmal um 0:00 Uhr überprüft ob aktuell der 1. Tag im Monat ist. Ist dies der Fall, dann wird das GesamtTraffic auf 0 gesetzte.

      Wenn du bisschen mehr Kontrolle über die Readings haben möchtest, dann kannst du natürlich auch weitere Dummys anlegen. Zum Beispiel ein Dummy für den Tagesverbrauch, ein Dummy für den Monatsverbrauch und ein Dummy für den Gesamtverbrauch. Wenn du bisschen mehr Infos dazu möchtest, dann kannst du gerne meinen Beitrag über Stromkosten als Diagramm. Dort wird für die den Stromverrbrauch jeweils ein dummy für unterschiedliche Zeiträume eingerichtet. Und auch hübsch aufgewertet. Das kann man ja dann auch für den Traffic umsetzte.

      Gruß Daniel

  9. Hey,

    danke für die Hilfe. Jetzt möchte ich zum Monatsende einen Dummy den Verbauch des vergangenen Monat verpassen….. Dafür habe ich folgenden atBefehl gebastelt

    *00:00:00 {if(mday==1) { my $d= ReadingsVal(„Empfangen“,“Empfangen_ges“,“0″); fhem(„set Empfangen_letzten_Monat $d“)} }

    Ich wollte erst nicht hier fragen, aber irgendwie komme ich nicht weiter….. ich denke da ist irgendwo eine Klammer falsch…..

    danke

    Gruß

    Thorsten

     

    • Hallo Thorsten,

      die Klammern stimmen alle. Du hast jedoch ein „$“ vergessen –> ...{if($mday==1)....
      Des Weiteren sind die „Gänsefüßchen“ falsch. Kann jetzt natürlich auch durch die Formatierung des Kommentars passiert sein. Aber da solltest du nochmal nachschauen –> richtig: “ falsch: “
      Kleiner Tipp: So welche Definitionen entweder direkt im DEF-Editor schreiben oder im Text-Editor und dann kopieren. Wenn man es in Word etc. schreibt, dann bekommt man oft Probleme mit diesen ähnlichen Zeichen.
      Ich habe mir das mal nachgebaut. So hat es bei mir funktioniert:
      *00:00:00 {
      if($mday==1) {
      my $d= ReadingsVal("Empfangen","Empfangen_ges","0");
      fhem("set Empfangen_letzten_Monat $d")}
      }

      Und keine Scheu zu fragen, dafür betreibe ich ja diesen Blog 😉

      Gruß Daniel

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Hinweis: Das Betreiben dieser Homepage kostet einiges an Zeit und Geld. Ich bitte euch deswegen von eigenen Affiliate-Links abzusehen. Vielen Dank.

*