FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: disorganizer am 09 November 2016, 21:52:06

Titel: Ping packetloss erfassen
Beitrag von: disorganizer am 09 November 2016, 21:52:06
Hallo zusammen,

Ich würde gerne von einem ping den packetloss erfassen.
Kann ich das in fhem machen?
Wenn ja wie?

Beispiel:
Alle minute folgendes kommando:
ping -c 30 -i1 -W 1 www.yahho.de
Ausführen und aus dem output
30 packets transmitted, 30 received, 0% packet loss, time 29043ms
rtt min/avg/max/mdev = 37.010/43.133/73.308/6.706 ms

den packet loss % rausholen

Hintergrund:
Ich möchte mir eine push nachricht schicken wenn mein provider mal wieder spinnt ;-)
Und ambesten dann gleich einen graph mitliefern der ausfälle.
Titel: Antw:Ping packetloss erfassen
Beitrag von: dev0 am 10 November 2016, 10:02:09
Ein shell script nicht blockierend aufrufen, das den Test durchführt und die Ergebnisse, mittels nc oder fhem.pl, an FHEM zurück meldet. Den gesuchten Wert kann man bsw. mit awk ausfiltern.
Titel: Antw:Ping packetloss erfassen
Beitrag von: disorganizer am 10 November 2016, 17:14:01
habs rausgefunden :-) manchnmal braucht man nur einen denkanstoss

inzwischen schaut mein dummy und doif so aus:
#####
# Netzwerkcheck
define DI_UMcheck DOIF ( [+300] )\
(\
  "/home/pi/netloss.sh 2 299 <ip1> NET.loss provider&",\
  "/home/pi/netloss.sh 2 299 <ip2> NET.loss router&"\
)
attr DI_UMcheck do always
attr DI_UMcheck room Netz
# NET.loss
# dummydevice
define NET.loss dummy
attr NET.loss event-min-interval 3600
attr NET.loss event-on-change-reading .*
attr NET.loss room Netz
define FileLog_NET.loss FileLog ./log/NET.loss-%Y-log NET.loss
attr FileLog_NET.loss logtype text
attr FileLog_NET.loss room Netz
#####

wobei <ip1> und <ip2> natürlich ip addressen sind

das script schaut so aus:
#!/bin/bash
interval=$1
time=$2
target=$3
dummy=$4
reading=$5
loss=`ping -qns 1000 -i $interval -w $time $target | grep -oE '[0-9]+%' | grep -oE '[0-9]+'`
/opt/fhem/fhem.pl 7072 "setreading $dummy $reading $loss"


wichtiger punkt hier was das das telnet passwort auf globalpassword statt password gesetzt werden musste :-)

es scheint zu funktiknieren. im endeffekt lasse ich alle 5 minuten einen ping starten auf beide ips parallel der alle 2 sekunden, 5 minuten lang pingt und den packetloss über 5 minuten ermittelt und den als wert im dummy speichert.

drei fragen noch:
1) sieht jemand noch eine möglichkeit den doppelgrep zu vermeiden oder das script resourcenschonender zu machen?
2) kann man das doif so einstellen das es immer um glatte 5 minuten läuft? also *:05:00, *:10:00, ...
3) kann man das doif so einstellen das bei einem neustart direkt das script gestartet wird und dann erst die 5 minuten laufen? zur zeit wird nach jeder änderung erst mal 5 minuten gewartet bis das script losläuft.


EDIT:
zu 1):
result=`ping -qns 1000 -i 1 -w 10 www.google.de`
loss=`echo $result | awk -F',|%' '{ print $3 }'`
avg=`echo $result | awk -F'/' '{ print $5 }'`
mdev=`echo $result | awk -F'/' '{ print $7 }'`

sollte mir da denke ich helfen :-) ich denke ich erweitere das dann auch um die antwortzeit.
Titel: Antw:Ping packetloss erfassen
Beitrag von: disorganizer am 12 November 2016, 10:26:39
Ich antworte mir mal selbst :-) Vieles hab ich inzwischen hinbekommen, aber ein paar dinge fehlen mir noch.

Am Ende des Posts kommt meine Implementierung, Jetzt aber erst die Fragen:

1) immer noch: wie schaffe ich es das doif alle 5 minuten glatt läuft? also um *:05:00, *:10:00, ...
2) immer noch: kann man doif so einstellen das es gleich läuft und erst dann der timer losläuft? (brauch ich evtl nicht wenn 1 geht)
und neu:
3) wie funktioniert denn event-aggregator?
ich habe "provider-avg::none:median:3600" eingetragen und erwartet das alle 5 minuten der median des readings "provider-avg" ins log geschrieben wird.
es passiert aber nix.
ziel wäre es provider und router avg nur alle stunde als mittelwert oder median zu schreiben.
und das dann auch mit den speed upload download und delay werten um nicht alle 5 minuten einen logeintrag zu haben (speed und delays ändern sich ja alle 5 minuten).


so, nun die lösung wie ich sie jetzt implementiert habe:
define DI.NETZcheck DOIF ( [+300] )\
(\
  "/home/pi/netcheck.sh 2 299 10.124.224.1 NETZ provider&",\
  "/home/pi/netcheck.sh 2 299 192.168.2.1 NETZ router&",\
  "/home/pi/netspeed.sh NETZ&"\
)
attr DI.NETZcheck do always
attr DI.NETZcheck room Netz


define NETZ dummy
attr NETZ event-aggregator provider-avg::none:median:3600
attr NETZ event-min-interval .*loss:3600
attr NETZ event-on-change-reading .*loss
attr NETZ room Netz
define FileLog_NETZ FileLog ./log/NETZ-%Y-log NETZ
attr FileLog_NETZ logtype text
attr FileLog_NETZ room Netz
define SVG_FileLog_NETZ_1 SVG FileLog_NETZ:SVG_FileLog_NETZ_1:CURRENT
attr SVG_FileLog_NETZ_1 room Netz


und die scripts dazu:
netcheck.sh
#!/bin/bash
interval=$1
time=$2
target=$3
dummy=$4
reading=$5
reloss=$5-loss
reavg=$5-avg
remdev=$5-mdev
result=`ping -qns 1000 -i $interval -w $time $target`
received=`echo $result | awk -F',' '{ printf "%.0f", $2 }'`
if [ $received -eq 0 ]; then
  loss=100
  avg=-
  mdev=-
else
  loss=`echo $result | awk -F',|%' '{ printf "%.0f", $3 }'`
  avg=`echo $result | awk -F'/' '{ printf "%.0f", $5 }'`
  mdev=`echo $result | awk -F'/' '{ printf "%.0f", $7 }'`
fi
/opt/fhem/fhem.pl 7072 "setreading $dummy $reloss $loss;setreading $dummy $reavg
$avg;setreading $dummy $remdev $mdev"


und netspeed.sh:
#!/bin/bash
dummy=$1
result=`speedtest-cli --simple`
delay=`echo $result | awk -F' ' '{ printf "%.2f", $2 }'`
download=`echo $result | awk -F' ' '{ printf "%.2f", $5 }'`
upload=`echo $result | awk -F' ' '{ printf "%.2f", $8 }'`
/opt/fhem/fhem.pl 7072 "setreading $dummy speed-delay $delay;setreading $dummy s
peed-download $download;setreading $dummy speed-upload $upload"


für netspeed.sh ist eine erweiterung nach folgender anleitung nötig:
http://makezine.com/projects/send-ticket-isp-when-your-internet-drops/

Titel: Antw:Ping packetloss erfassen
Beitrag von: disorganizer am 04 Januar 2017, 12:51:31
so, nach langer zeit mal wieder eine zusätzliche frage:

diesmal zum thema svg erstellen.


inzwischen erfasse ich alle 5 minuten den loss und speed.
so weit so gut.

daraufhin habe ich mit event-on-change das so eingestellt das nur noch alle stunde ein wert geschrieben wird wenn sich nichts ändert.

nun habe ich in der grafik folgendes problem:
um 15:00 steht der wert 0 im log
um 15:40 wird dann 100 ins log geschrieben
um 15:45 wieder 0 im log.

so schaut der graph aus:
linie auf 0 bis 15:00, dann schräg hoch auch 100 um 15:40 und dann wieder runter auf 0 um 15:45.

folgendes verhalten wäre aber gewünscht:
linie auf 0 bis 15:35, dann auf 100 um 15:40 und runter auf 0 um 15:45

mir ist klar warum das passiert und das ich das durch entfernung der event-on-change einträge beheben kann.
aber der nachteil wäre dann das ich alle 5 minuten einen wert erfasse auch wenn nichts passiert, und das wollte ich vermeiden.

meine frage ist nun ob ich dem graph irgendwie beibringen kann das er das wie gewünscht darstellt :-)
sprich: der graph müsste den letzen im log vorhandenen wert beibehalten bis 5 minuten vor einer wertänderung.

vielen dank falls jemand eine idee hat oder mich in die richtige richtung stupsen kann.