Encja speedtest z routera pomiar prędkości internetu

Witam, mam HA postawiony na RaspberryPi i zrobiłem na nim encję speedtest, ale w związku, że RPi ma ograniczenie po LANie do 300 Mbps to chciałbym przenieść pomiar na router. Tak trafiłem na packages/net/speedtest-netperf/files/speedtest-netperf.sh at master · openwrt/packages · GitHub
Skrypt na routerze działa. Dograłem do tego mosquitto_pub i puściłem wyniki na HA

speedtest-netperf.sh | mosquitto_pub -h 192.168.1.1 -u homeassistant -P password -t speed/router -l 

W HA nasłuchuję wyników w postaci tekstowej jako jeden wiersz to jedna linia:

Download: 450 Mbps
Upload: 45 Mbps

Jak to dalej wykorzystać, żeby zrobić z tego encję i jakiś wskaźnik?

Najprościej chyba można to zrobić to integracją Command line Sensor. Nie ma potrzeby instalowania obsługi mqtt na routerze.

Też patrzyłem już na Command line Sensor - Home Assistant
ale nie wiem jak zrobić zdalną komendę na router. Może tak by miała wyglądać:

command: "ssh <username>@<IP ROUTERA> speedtest-netperf.sh | grep "Download:\|Upload:"

Ale nadal nie otrzymam wartości liczbowej wymaganej do encji.

Konfigurujesz połączenie ssh między HA a routerem wg instrukcji SSH z HA do innego hosta - #6 przez macek. Później korzystasz, tak jak pisze @Marek, z Command Line - Home Assistant.

Nastepnie musisz wynik Twojej komendy:
Download: 450 Mbps
Upload: 45 Mbps
uprościć tylko do jednego wyniku i tylko liczby, np. sprawdzajac download dostajesz wynik 450, Takie zabawy na stringach robisz bezpośrednio na routerze albo na HA w polu value_template. Pozostała konfiguracja juz w HA, np dodanie jednostki w unit_of_measurement.

A jaką maline masz? Ja mam RPi4 4GB I po zainstalowaniu tylko integracji pokazuje mi spokojnie powyżej 400Mbps. A łącze mam up to 500Mbps

Mam RPi3B+ , które osiągnie maksimum około 300 Mb/s, ponieważ LAN podłączony jest do portu USB 2.0.
Podpowiecie jeszcze jaki podać parametr w value_template oraz żeby skrypt wykonywał się po kliknięciu lub po określonym czsie?

sensor:
  - platform: command_line
    name: speed_router
    command: "ssh root@192.168.1.1 speedtest-netperf.sh "
    unit_of_measurement: "Mbs"
    value_template: '{{ value ................() }}'
-* ~ ssh root@192.168.1.1 speedtest-netperf.sh 
2021-01-18 18:48:52 Starting speedtest for 15 seconds per transfer session.
Measure speed to netperf-eu.bufferbloat.net (IPv4) while pinging gstatic.com. Download and upload sessions are sequential, each with 5 simultaneous streams.
Download: 279.44 Mbps
Latency: [in msec, 16 pings, 0.00% packet loss] Min:	16.464
10pct:	16.464
Median:	17.087
Avg:	17.067
90pct:	17.454
Max:	18.228
CPU Load:	[in %	busy	(avg	+/-	std	dev),	13	samples]
cpu0:	78.1	+/-	7.0
cpul:	73.9	+/-	7.2
cpu2:	77.0	+/-	9.2
cpu3:	82.1	+/-	4.3
Overhead:	[in %	used	of total	CPU	available]
netperf:	60.9
.recv_response: partial response received: 0 bytes
WARNING: netperf returned errors. Results may be inaccurate!
Upload:	52.97 Mbps
Latency:	[in msec, 16 pings, 0.00% packet loss]
Min:	16.308
10pct:	16.308
Median:	16.439
Avg:	16.524
90pct:	16.709
Max:	17.191
CPU Load:	[in % busy (avg +/- std dev), 14 samples]
cpu0:	10.2 +/- 2.7
cpul:	28.5 +/- 4.8
cpu2:	10.8 +/- 4.0
cpu3:	2.6 +/- 2.4
Overhead:	[in % used of total CPU available]
netperf:	2.0

Może muszę użyć coś takiego

  trigger:
  - platform: command_line
     command: "ssh root@192.168.1.1 speedtest-netperf.sh "
    value_template: "{{ states.sensor.speedrouter.state |float }}"

Ale kombinujesz i tracisz czas a wystarczyło zajrzeć do dokumentacji, tak wszystko jest dokładnie opisane, patrz:

scan_interval integer (optional, default: 60)
Defines number of seconds for polling interval.

czyli domyślnie co 60 sekund nastąpi odświeżenie stanu sensora - nastąpi wywołanie command.

HA to jeden z bardzo dobrze udokumentowanych projektów.

Czy jest jakiś parametr w wywołaniu tego polecenia aby uzyskać skrócony wynik (output)?

Moge dodać do command:


 | grep "Download/Upload" 

Wtedy wypisze tylko te dwie linie bo reszta jest zbędna.
Ewentualnie wywalę wpisy ze skryptu.

Zostaw tylko | grep "Download i wynikiem powinno być:
Download: 450 Mbps
Teraz z tego outputu za pomocą polecenia sed tak zrob aby zostalo Ci samo 450 - “za pomocą sed wyświetl tekst znajdujący się po spacji ale do kolejnej spacji”, mam nadzieje ze mnie rozumiesz :grin: - w Google wpisz: linux sed text between two space, wierzę, że sobie poradzisz.

Witam, dostaję wynik po komendzie:

ssh root@192.168.1.11 speedtest-netperf.sh -t 5 -H netperf-eu.bufferbloat.net | grep 'Download:' | sed -e 's/Download://' | sed 's/^[[:space:]]*//g'
450.35

Dodałem w sensors.yaml

  - platform: command_line
    name: SpeedRouter
    command: "ssh root@192.168.1.11 speedtest-netperf.sh -t 5 -H netperf-eu.bufferbloat.net | grep 'Download:' | sed -e 's/Download://' | sed 's/^[[:space:]]*//g'"
    scan_interval: 60

Co źle jeszcze robię bo sensor jest ale nic nie podaję?

Spróbuj jeszcze testowo zrobić tak:

  - platform: command_line
    name: SpeedRoute Download
    command: "ssh root@192.168.1.11 speedtest-netperf.sh -t 5 -H netperf-eu.bufferbloat.net | grep 'Download:' | sed -e 's/Download://' | sed 's/^[[:space:]]*//g'"
    value_template: '{{ (value | int ) | round(1) }}'
    unit_of_measurement: 'Mbps'

ma to na celu ten string 450.35 “potraktować” jako liczbę typu integer, testowo jest też zaokrąglenie liczby.

Wyświetla:
0.0 Mbps

Tak jakby komendy nie wykonywał. Gdzie w logach znajdę czy to się wyknuję co 60 sekund?
Może trzeba podać, żeby czekał na wynik, bo pewnie od razu wypisuję, a przecież proces pomiaru zajmuję trochę czasu.

scan_interval: 120
command_timeout: 30

nic mi to nie daję, nadal: 0.0
Znalazłem coś takiego:

df -h . | tr -s ' ' ',' | jq -nR '[ ( input | split(",") ) as $keys | ( inputs | split(",") ) as $vals | [ [$keys, $vals] | transpose[] | {key:.[0],value:.[1]} ] | from_entries ]'

Może na wzór tego można wynik wypisać w json?

:thinking: to co zauważyłem:

  • speedtest-netperf.sh -t 5 gdzie -t | --time: Duration of each direction’s test - czyli nastepuje wywołanie polecenia, ktore przez 10s sprawdza przepustowość łącza i dopiero daje wynik
  • HA odpala skrypt, nie dostaje odpowiedzi dlatego wynikiem jest zero.

Może trochę trzeba do tego podejść inaczej:

  • na routerze odpalać cyklicznie test łącza a wynik (już po zastosowaniu sed) zapisywać do pliku, proste przekierowanie do pliku >
  • z command ączyc się do routera i pobierać wynik tego pliku poleceniem cat

Uważam, nie nie ma sensu robisz test łącza częściej niż co 30 minut.

Jeżeli chodzi o czas co ile to będzie co 120 min, teraz dla testów taki krótki.
Patrzyłem na uruchomione procesy na routerze ale skrypt poprzez HA się nie uruchamiał.
Zrobie zapis do pliku i zobacze co z tego wyjdzie.

To może z tego powodu to nie działa - nie działa połączenie z HA poprzez ssh do routera, sprawdzales to np. z konsoli ssh HA? Pokazywane wyniki połączenia ssh z jakiego urządzenia były nawiązywane do routera?

W terminalu HA działa połączenie SSH i daje wyniki poprawne.

Robiłeś wszystko w/g poradnika? SSH z HA do innego hosta - #6 przez macek

Do polecenia ssh trzeba dodać 2 parametry, lokalizację klucza id_rsa i wyłączyć ścisłe sprawdzanie klucza?
Czyli komenda powinna zaczynać się od
"ssh -i /config/.ssh/id_rsa -o StrictHostKeyChecking=no root@192.168.1.11

Podsumowując:

Router z OpenWRT z zainstalowanym “speedtest-netperf” ze strony:

W HA dodajemy inegrację Terminal.

Później w nim konfigurujęmy dostęp poprzez ssh do zdalnego hosta:

W configuration.yaml:

sensor: !include sensors.yaml

W sensors.yaml:

  - platform: command_line
    name: SpeedRoute Download
    command: "ssh -i /config/.ssh/id_rsa -o StrictHostKeyChecking=no root@IP_rouer speedtest-netperf.sh -t 5 -H netperf-eu.bufferbloat.net | grep 'Download:' | sed -e 's/Download://' | sed 's/^[[:space:]]*//g'"
    value_template: '{{ (value | int ) | round(1) }}'
    unit_of_measurement: 'Mbit/s'
    scan_interval: 3600

Dziękuję za pomoc @macek.

@typer08 pomogam chętnie ale na zasadzie “wędka zamiast ryby”, podobnie było w Twoim przypadku, efekt końcowy osiągnąłeś samodzielnie :slight_smile:.
Na koniec, skoro masz już sensor SpeedRoute Download, analogicznie zrób SpeedRoute Upload odpowiednio modyfikując command, zamiast:

| grep 'Download:' | sed -e 's/Download://' |

użyj Upload.