Speedtest optisch ansprechend auf einen Blick und Telegram-Anbindung

Begonnen von Michi1972, 22 Juni 2021, 13:02:17

Vorheriges Thema - Nächstes Thema

Michi1972

Moin,

mit dem FHEM-Eigenen Modul Speedtest kann man so einiges anstellen. Bisher führte es eher ein Schattendasein, aber ich habe für mich die Befehle per Telegram entdeckt und hier biete ich meinen Codeschnipsel an, wie das ganze bei mir funktioniert. Zusätzlich habe ich in die Statuszeile ein paar Infos "für den ersten Blick" eingebaut. Vielleicht kann ja noch jemand etwas mit meinem Code anfangen.

Zunächst mein Speedtest-Modul:

define Internetgeschwindigkeit speedtest 3600 31469
attr Internetgeschwindigkeit comment 31469) Deutsche Telekom (Hamburg, Germany)\
\
einzig funktionierende Version:\
pip install speedtest-cli\
https://github.com/sivel/speedtest-cli/
\
attr Internetgeschwindigkeit devStateIcon {\
my $alivecolor = 'it_i-net@red';;;;\
$alivecolor='it_i-net@green' if (ReadingsVal($name, "state", "error") eq "ok");;;;\
$alivecolor='it_i-net@lightblue' if (ReadingsVal($name, "state", "error") eq "running");;;;\
my $downcolor = 'control_arrow_down@red';;;;\
$downcolor='control_arrow_down@green' if (ReadingsVal($name, "download", "error") > 270);;;;\
my $upcolor = 'control_arrow_up@red';;;;\
$upcolor='control_arrow_up@green' if (ReadingsVal($name, "upload", "error") > 270);;;;\
my $pingcolor = 'time_timer@red';;;;\
$pingcolor='time_timer@green' if (ReadingsVal($name, "ping", "error") < 8);;;;\
"<div>" . FW_makeImage("$alivecolor","it_i-net")." ".ReadingsVal($name, "state", "error")." ".\
FW_makeImage("$pingcolor","clock")." ".\
ReadingsVal($name,"ping",0)." ms ". \
FW_makeImage("$downcolor","control_arrow_down")." ".\
ReadingsVal($name,"download",0)." MBit/s ". \
FW_makeImage("$upcolor","control_arrow_up")." ".\
ReadingsVal($name,"upload",0)." MBit/s<br>Letzter Test: ".\
ReadingsTimestamp($name,"state",0)."</br></div>"\
}
attr Internetgeschwindigkeit icon it_i-net
attr Internetgeschwindigkeit path /usr/local/bin/
attr Internetgeschwindigkeit room Netzwerk
attr Internetgeschwindigkeit userReadings last { ReadingsTimestamp("Internetgeschwindigkeit","state",0) }
attr Internetgeschwindigkeit webCmd statusRequest

setstate Internetgeschwindigkeit ok
setstate Internetgeschwindigkeit 2021-06-22 11:49:05 download 297.80
setstate Internetgeschwindigkeit 2021-06-22 11:49:05 last 2021-06-22 11:49:05
setstate Internetgeschwindigkeit 2021-06-22 11:49:05 ping 5.609
setstate Internetgeschwindigkeit 2021-06-22 11:49:05 state ok
setstate Internetgeschwindigkeit 2021-06-22 11:49:05 upload 299.73


Dann der erste Notifier:

define TelegramSpeedtest notify teleBot.msgText:.*(S|s)peedtest \
set teleBot message Ein Speedtest am Internetanschluss wird gestartet - bitte warten ... ;;\
set Internetgeschwindigkeit statusRequest;;\
sleep 16;;\
trigger Internetgeschwindigkeit Telegram;;
attr TelegramSpeedtest room FHEM-Verwaltung->Telegram

Der Sleep ist notwendig, damit der Speedtest auch zuende durchlaufen kann. Hatte eigentlich noch vor, eine Art wait...until einzubauen, aber es geht auch so.

Als letztes dann der entscheidende Punkt für die Auswertung und Ausgabe:

define Speedtest_n notify Internetgeschwindigkeit:.*(ok|failed|Telegram) {\
\
my $state=ReadingsVal("Internetgeschwindigkeit","state","fehlerhaft");;\
my $download=ReadingsVal("Internetgeschwindigkeit","download","-1");;\
my $schwelle_d=AttrVal($SELF,"down_min",500);;\
my $wertung_d="";; if ($download>$schwelle_d) {$wertung_d="✅"} else {$wertung_d="❌"};;\
my $upload=ReadingsVal("Internetgeschwindigkeit","upload","-1");;\
my $schwelle_u=AttrVal($SELF,"up_min",500);;;;\
my $wertung_u="";; if ($upload>$schwelle_u) {$wertung_u="✅"} else {$wertung_u="❌"};;\
my $ping=ReadingsVal("Internetgeschwindigkeit","ping","-1");;\
my $schwelle_p=AttrVal($SELF,"ping_min",5);;;;\
my $wertung_p="";; if ($ping<$schwelle_p) {$wertung_p="✅"} else {$wertung_p="❌"};;\
my $last=ReadingsVal("Internetgeschwindigkeit","last","-1");;\
my $text="🌍<b><i>Internetanschluß zuhause</i></b>\
<i>Stadtwerke Glasfaser FTTH mit 300 MBit/s up/down:</i>\
Werte der letzten Messung (".$last."):\
<i>Status:</i> ".$state."\
<i>Download:</i> ".$download." MBit/s ".$wertung_d." \
<i>Upload:</i> ".$upload." MBit/s ".$wertung_u." \
<i>Ping:</i> ".$ping." ms ".$wertung_p." \
<i>Test-Server:</i> Telekom Hamburg.\
Bei Bedarf kann die Messung mit dem Telegram-Befehl <i><b>Speedtest</b></i> wiederholt werden.";;\
\
if (($download < $schwelle_d) || ($upload < $schwelle_u) || ($ping > $schwelle_p) || ($EVTPART0 eq "Telegram"))\
{fhem("set teleBot msg ".$text)};;\
\
}
attr Speedtest_n userattr down_min up_min ping_min
attr Speedtest_n down_min 270
attr Speedtest_n ping_min 8
attr Speedtest_n room FHEM-Verwaltung->Logik,FHEM-Verwaltung->Telegram
attr Speedtest_n up_min 270


Wer die teleBot definition braucht, kann die SuFu benutzen oder googlen.

Das ganze funktioniert perfekt bei mir. Vielleicht kann ja noch jemand etwas mit diesem Codeschnipsel anfangen. Ansonsten ist es für mich als Notiz. Man kann den Code ja noch auf seine eigenen Bedürfnisse anpassen. Oder hat jemand noch eine Codeergänzung, dann gerne als Kommentar rein.

Gruß
Michi1972

gestein

Hallo Michi,

Vielen Dank für das Codeschnipsel.
Habe es gleich ausprobiert und funktioniert. Schaut sehr schön aus.
Ich habe nur im TelegramBot das Attribut "parseModeSend" auf "2_HTML" setzen müssen.

Und die Userattribute "up_min/down_min/ping_min" habe ich ins Device verlagert und im devStateIcon die absoluten Vergleichswerte auf diese Attribute umgeändert.
Damit sind die Vergleichswerte im Device und im notify die gleichen.

Aber eine coole Sache.
lg, Gerhard

Michi1972

Zitat von: gestein am 25 August 2021, 10:45:49
Hallo Michi,

Vielen Dank für das Codeschnipsel.
Habe es gleich ausprobiert und funktioniert. Schaut sehr schön aus.
Ich habe nur im TelegramBot das Attribut "parseModeSend" auf "2_HTML" setzen müssen.

Und die Userattribute "up_min/down_min/ping_min" habe ich ins Device verlagert und im devStateIcon die absoluten Vergleichswerte auf diese Attribute umgeändert.
Damit sind die Vergleichswerte im Device und im notify die gleichen.

Aber eine coole Sache.
lg, Gerhard

Danke, für die Rückmeldung! Es freut mich, dass es noch jemand gebrauchen kann.
LG
Michi