Traffic Monitor einer SFR Neufbox (NB6) in Frankreich

Begonnen von _hndrk, 25 Dezember 2017, 10:56:03

Vorheriges Thema - Nächstes Thema

_hndrk

Liebe Community,

anbei ein paar kurze Zeilen, mit der ich meine SFR/RED Neufbox (Version NB6V-MAIN-R3.5.8) an FHEM angebunden habe.

Da ein Scraping der HTTP Schnittstelle nicht in Frage kam (Daten nur mit Login zugreifbar), habe ich nach offenen Ports geschaut und auf einen SNMP Zugang oder Ähnliches gehofft. Ich wurde fündig: Unter TCP Port 1287 gibt die Box aktuelle Statusinformationen aus, die man schön parsen kann. Hier ein (leicht anonymisiertes) Beispiel:

01=1;02=86.67.66.222;03=NB6V-FXC-r0;04=44CE7D123456;05=VU2005200512345678;06=684159;07=684084;08=1;09=1;0A=0;0B=NDI01234567.CAZ.THD@sfr.fr;0C=86.67.66.222;0D=NB6V-BOOTLOADER-R3.3.2_NB6V-MAIN-R3.5.8_NB6V-MAIN-R3.4.5_NB6V-XDSL-A2pv5F1234m_NB6V-CONFIG-R3.5.8.0;0E=RL6ZSM7;0F=0;10=off;11=45558;12=12224;15=684085;16=G.DMT;18=auto;19=0;1A=0;1B=0;1C=0;1D=0.0;1E=0.0;1F=0.0;20=0.0;21=0.0;22=13.0;23=0;24=0;25=0;26=0;27=0;28=0;29=0;2A=0;2B=0;2C=0;2D=0;2E=0;2F=0;30=0;31=0;32=684108;33=0;34=0;35=0;36=0;37=0;38=0;39=0;3A=0;41=1513472010;42=-31.35239;43=2.96539;44=5.64;45=28.000000;46=3.299990;47=662;48=GW32LOU5;49=PTIN112A99FF;4A=0;4B=0;4C=0;4D=0;4E=2;4F=0;50=1;51=1;52=1;53=0;54=1;55=1;56=1;57=0;58=1;59=1;5A=1;5B=1;5C=1;5D=1;5E=1;5F=1;60=1;61=1;62=0;63=1;64=1;65=385819109;66=350313441;67=53817;68=19;69=684108;6A=1;6B=0;6C=down;6D=1;6E=2a02:8429:801a:600::/56;6F=on;70=684063;71=Native;72=0;73=1;74=1;75=A2pv6F038m.d24;76=djI6ZnR0aC9wb246fE5JQzUtQ08tMixOSUMxLUNPLTF8NVRIRHxGVFRINTV8fDA1cmFpMSgwMTIzNDUpfDA1cmFpMS1ucm8tNXx8fDA1cmFpMS1nYS0wNXwwNXJhaTEtZ2EtMDUvMXwwNXJhaTEtZ2EtMDUvMS81fDA1cmFpMS1nYS0wNS8xLzUvMXxTUk8tQlBJLTEyMzQ1Cg;77=wan;78=1 GBit/s (Full-Duplex);79=|||100 Mbit/s (Full-Duplex);7C=1;7F=ok;80=0;81=ok;82=684066;83=26;84=684066;85=26;86=684066;87=26;88=ipv4;89=djI6ZnR0aC9wb246fE5JQzUtQ08tMixOSUMxLUNPLTF8NVRIRHxGVFRINTV8fDA1cmFpMSgwMTIzNDUpfDA1cmFpMS1ucm8tNXx8fDA1cmFpMS1nYS0wNXwwNXJhaTEtZ2EtMDUvMXwwNXJhaTEtZ2EtMDUvMS81fDA1cmFpMS1nYS0wNS8xLzUvMXxTUk8tQlBJLTEyMzQ1Cg;8A=684066;8B=onhook;8F=86.67.66.222;91=0;93=0;94=0;95=0;96=djI6ZnR0aC9wb246fE5JQzUtQ08tMixOSUMxLUNPLTF8NVRIRHxGVFRINTV8fDA1cmFpMSgwMTIzNDUpfDA1cmFpMS1ucm8tNXx8fDA1cmFpMS1nYS0wNXwwNXJhaTEtZ2EtMDUvMXwwNXJhaTEtZ2EtMDUvMS81fDA1cmFpMS1nYS0wNS8xLzUvMXxTUk8tQlBJLTEyMzQ1Cg


Nach kurzem Test welche Werte sich bei entsprechendem Upload/Download Traffic verändern, habe ich die Felder 65= und 66= als Bytes-down bzw. Bytes-up identifiziert.

Mit einem kleinen Script, das diese Werte als cronjob alle 15 Minuten ausliest, aktualisiere ich FHEM über die telnet Schnittstelle. Hierzu habe ich in /etc/cron.d/fhem habe den folgenden Eintrag gemacht: */15 *   * * *   root    /usr/local/sbin/fhem-SFRinet

Das Script fhem-SFRinet ist denkbar einfach: Ich hole die Daten von der SFRbox und spiele sie per telnet in FHEM (dummy sensor SFR_inet) ein:


#!/usr/bin/env python

import socket

SFR_NB6_IP   = '192.168.1.1'
SFR_NB6_PORT = 1287
BUFFER_SIZE  = 1024

FHEM_HOST    = 'localhost'
FHEM_PORT    = 7072
FHEM_SENS    = 'SFR_inet'


def send_string(hostname, port, content):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((hostname, port))
    s.sendall(content)
    s.shutdown(socket.SHUT_WR)
    while 1:
        data = s.recv(1024)
        if data == "":
            break
    if data:
        print "Received:", repr(data)
    s.close()



#get string from SFR Neufbox
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((SFR_NB6_IP, SFR_NB6_PORT))
data = s.recv(BUFFER_SIZE)
s.close()

#interpret data into dict
d = dict(item.split("=") for item in data.split(";"))

#debug:
#print "down:", d["65"]
#print "up:", d["66"]
#print "compete:", d

bytes_down = d["65"]
bytes_up   = d["66"]


fhemstring = ''
fhemstring += 'setreading {0} BytesDown {1}\n'.format(FHEM_SENS, bytes_down)
fhemstring += 'setreading {0} BytesUp {1}\n'.format(FHEM_SENS, bytes_up)
fhemstring += 'quit'

send_string(FHEM_HOST, FHEM_PORT, fhemstring)



Den Sensor "SFR_inet" habe ich folgendermaßen definiert, so dass mir der Status in Megabyte angezeigt wird:


define SFR_inet dummy
attr SFR_inet alias Internet
attr SFR_inet icon it_internet
attr SFR_inet room Wohnzimmer
attr SFR_inet stateFormat { sprintf("Down: %d MB Up: %d MB", ReadingsVal($name, "BytesDown",0)/1024/1024, ReadingsVal($name,"BytesUp",0)/1024/1024) }


Ich hoffe meine Ausführungen und kleinen Skripte werden auch einmal jemandem helfen können.

Frohe Feiertage und ein riesig großes Dankeschön an das gesamte FHEM Team! FHEM hat mir im vergangenen Jahr viel Freude bereitet.

Hendrik