Hallo zusammen,
ich bin nicht so der HTTP Experte, aber ich würde gerne Daten aus dem Engineer Menü meines Speerports auslesen.
Dazu gibt es momentan 2 Möglichkeiten:
1. kleines Shell-Script, keine Ahnung wo ich das gefunden habe, aber es läuft bei mir:
#!/bin/bash
challengev=$(curl -s -d csrf_token=nulltoken -d showpw=0 -d challengev=null http://speedport.ip/data/Login.json?lang=en | grep -A 1 challengev | tail -1 | awk -F'"' '{print $4}')
encryptpwd=$(perl -e "use Digest::SHA qw(sha256_hex); print sha256_hex('${challengev=}:passwort');")
sessionid=$(curl -s -i -d password=${encryptpwd} http://speedport.ip/data/Login.json?lang=en | grep SessionID | awk -F'=' '{print $2}' | awk -F';' '{print $1}')
echo "$(date +"%Y-%m-%d_%T") SYS.lteinfo RSRP: $(curl -s --cookie "SessionID_R3=${sessionid}" http://speedport.ip/data/lteinfo.json | grep rsrp | awk -F"'" '{print $4}')"
echo "$(date +"%Y-%m-%d_%T") SYS.lteinfo RSRQ: $(curl -s --cookie "SessionID_R3=${sessionid}" http://speedport.ip/data/lteinfo.json | grep rsrq | awk -F"'" '{print $4}')"
Das ist aber umständlich und man muss außerhalb von FHEM noch etwas haben.
2. http://blog.mellenthin.de/archives/2015/04/29/telekom-speedport-hybrid-logging-mit-rrdtool/
Noch nicht getestet aber auch nicht das was ich will
Jetzt zu meiner Frage, kann man das mit HTTPMOD realisieren und was ist dafür zu tun, es gibt ja so viele Möglichkeiten aber ich weiß nicht wie ich genau anfangen soll.
Danke und Grüße
Christian
Ich habe es zwar nicht mit HTTPMOD versucht sondern mit den Tools aus dem von dir verlinkten Blog. Ist leider schon einige Zeit her und ich müsste mich wieder einfuchsen. Aber evtl. hilft es dir ja doch.
In eine MyUtils folgende subs:
sub
SpeedportStatus_function {
my $json_text = `node /home/joe/Downloads/l33tport-master/l33tport.js -o json -f Status`;
my $element;
my @jsonarray = split(/{/,$json_text);
foreach $element (@jsonarray) {
my @element_array = split(/,/,$element);
my (undef,$varid) = split(/: /,@element_array[1]);
my (undef,$varval) = split(/: /,@element_array[2]);
my ($reading1) = $varid =~ /([A-Za-z_][A-Za-z0-9_]*)/;
my ($reading2) = $varval =~ /([A-Za-z0-9_][A-Za-z0-9_.-]*)/;
if ($reading1 ne '' && $reading2 ne '') {
fhem("setreading SpeedportStatus_dummy $reading1 $reading2");
}
}
SpeedportLTE_function();
}
sub
SpeedportLTE_function {
my $json_text = `node /home/joe/Downloads/l33tport-master/l33tport.js -o json -f lteinfo`;
$json_text =~s/'/"/g;
$json_text =~s/[{: ]\K(\w+):\s/"$1":/g;
print $json_text;
my $data = decode_json($json_text);
my %f = %{$data} ;
foreach my $key (keys(%f)) {
fhem("setreading SpeedportStatus_dummy $key $f{$key}");
}
}
Ein dummy mit Namen SpeedportStatus_dummy anlegen.
Die sub mit:
{SpeedportStatus_function()}
ausführen
Internals:
CFGFN
NAME SpeedportStatus_dummy
NR 135397
STATE ???
TYPE dummy
Readings:
2016-05-30 17:08:30 addphonenumber Object
2016-05-30 17:08:30 antenna_mode Antennal set to external
2016-05-30 17:08:30 bngscrat 0
2016-05-30 17:08:30 bonding_status Online
2016-05-30 17:08:30 card_status SIM OK
2016-05-30 17:08:30 cellid xx
2016-05-30 17:08:30 connect 0
2016-05-30 17:08:30 datetime 30.05.2016
2016-05-30 17:08:30 device_name Speedport
2016-05-30 17:08:30 device_status Attached
2016-05-30 17:08:30 dsl_downstream 2298
2016-05-30 17:08:30 dsl_link_status online
2016-05-30 17:08:30 dsl_upstream 543
2016-05-30 17:08:30 firmware_version 050124.02.00.012
2016-05-30 17:08:30 hsfon_status 0
2016-05-30 17:08:30 imei xx
2016-05-30 17:08:30 imsi xx
2016-05-30 17:08:30 lan1_device 1
2016-05-30 17:08:30 lan2_device 0
2016-05-30 17:08:30 lan3_device 0
2016-05-30 17:08:30 lan4_device 0
2016-05-30 17:08:30 loginstate 1
2016-05-30 17:08:30 lte_signal 5
2016-05-30 17:08:30 lte_status 10
2016-05-30 17:08:30 onlinestatus online
2016-05-30 17:08:30 phycellid 410
2016-05-30 17:08:30 ppp_bnguser 0
2016-05-30 17:08:30 provis_inet x03
2016-05-30 17:08:30 provis_voip xx3
2016-05-30 17:08:30 router_state OK
2016-05-30 17:08:30 rsrp -78
2016-05-30 17:08:30 rsrq -10
2016-05-30 17:08:30 serial_number HFxx
2016-05-30 17:08:30 service_status Effective service
2016-05-30 17:08:30 status online
2016-05-30 17:08:30 support_https 0
2016-05-30 17:08:30 tac 3030
2016-05-30 17:08:30 title Speedport
2016-05-30 17:08:30 use_dect 0
2016-05-30 17:08:30 use_lte 1
2016-05-30 17:08:30 use_wlan 1
2016-05-30 17:08:30 use_wlan_5ghz 1
2016-05-30 17:08:30 use_wps 0
2016-05-30 17:08:30 wlan_5ghz_devices 0
2016-05-30 17:08:30 wlan_5ghz_ssid WLAN-NW8DFL-5GHz
2016-05-30 17:08:30 wlan_devices 0
2016-05-30 17:08:30 wlan_ssid WLAN-NW8DFL
Attributes:
room LTE
Gruß
Hans
Edit:
Wird nicht mehr funktionieren da eine neuere l33tport.js in github.
Der krude Code meinerseits kam wohl, wenn ich mich recht erinnere, durch ein malformed json. Das scheint behoben. Werde, wenn ich Zeit finde, versuchen mich wieder einzuarbeiten.
Habe es aber nicht viel genutzt, da die FritzBox hinter dem Router hängt und die Hauptarbeit verrichtet.
Es hat mir keine Ruhe gelassen... :-\
Anbei eine erste
99_myUtilsSpeedport.pm. Büschen quick'n dirty.
Vorgehenweise:
Von hier die zip-Datei (https://github.com/melle/l33tport/archive/master.zip) downloaden, auspacken und Pfad merken.
In der Datei
l33tport.js ip-Adresse und Passwort editieren.
In der
99_myUtilsSpeedport.pm den Pfad(
$l33tport_path) anpassen. Evtl. auch den Pfad zu
node(üblicherweise:/usr/bin/node oder /usr/local/bin/node) ergänzen.
Mit
{SpeedportStatus()}
ausführen.
Ist aber bei weitem noch nicht fertig. Bisher nur:
Es gibt noch einige mehr. Siehe hier (https://github.com/melle/l33tport).
Sind aber jetzt schon reichlich Readings.
Gruß
Hans
Wenn ich
{SpeedportStatus()}
ausführe, bekomme ich
malformed JSON string, neither array, object, number, string or atom, at character offset 0 (before "(end of string)") at ./FHEM/99_myUtilsSpeedport.pm line 40.
ein Test mit
node /home/pi/l33tport-master/l33tport.js -o json -f Status
ist ok.
Gruß,
Hajo
Hast du die neuste Version von hier? (https://github.com/melle/l33tport/archive/master.zip)
Ich meine mich zu erinnern, dass ich mit einer alten Version auch fehlerhafte jsons bekam.
Gruß
Hans
wenn ich in 99_myUtilsSpeedport.pm
/usr/local/bin/node /home/pi/l33tport-master/l33tport.js ...
nehme läuft es :)
Danke für den Hinweis.
Gruß
Hans