Мониторинг скорости интернета 24/7: создаем систему на базе Ookla Speedtest и VizIoT

Вы когда-нибудь задумывались, насколько стабилен ваш интернет в течение суток? Скорость может падать вечером или пропадать на несколько минут. В этой статье мы создадим простую систему автоматического мониторинга. Мы будем использовать профессиональный инструмент Ookla Speedtest CLI, а данные визуализируем в удобных графиках через облачный сервис VizIoT.


Шаг 1: Настройка устройства в VizIoT

Прежде чем писать код, подготовим «приёмник» для наших данных.

  1. Зайдите в свой аккаунт VizIoT.
  2. Создайте новое устройство с именем «SPEEDTEST».
  3. Добавьте в него следующие параметры (именно в них скрипт будет записывать данные):
    • download — Мегабит/с (Mbps)
    • upload — Мегабит/с (Mbps)
    • ping — Миллисекунды (ms)
    • packet_loss — Проценты (%)
    • jitter_download — Миллисекунды (ms)
    • jitter_upload — Миллисекунды (ms)
  4. Перейдите в «Основные настройки» устройства и обязательно сохраните Ключ доступа и Пароль доступа. Они понадобятся нам далее.

Шаг 2: Установка Node.js

Скрипт написан на языке JavaScript и работает в среде Node.js. Выберите инструкцию для вашей операционной системы:

Для Windows

  1. Перейдите на официальный сайт Node.js.
  2. Скачайте Prebuilt Node.js Windows Installer (.msi).
  3. Запустите файл и следуйте инструкциям установщика (просто жмите «Next»).
  4. После установки откройте терминал (CMD или PowerShell) и проверьте версию командами node -v и npm -v.

Для macOS и Ubuntu/Linux

Мы рекомендуем использовать менеджер версий NVM. Откройте терминал и выполните:

# 1. Скачивание и установка nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash

# 2. Активация nvm (для текущей сессии терминала)
. "$HOME/.nvm/nvm.sh"

# 3. Установка Node.js
nvm install 24

# 4. Проверка установки
node -v
npm -v

Шаг 3: Подготовка проекта и установка Speedtest CLI

Теперь подготовим рабочую папку и скачаем необходимые инструменты.

  1. Создайте папку для проекта:

    mkdir -p /var/viziot/speedtest
    cd /var/viziot/speedtest
  2. Инициализируйте проект и установите библиотеку VizIoT:

    npm init -y
    npm install viziot-mqtt-client-nodejs
  3. Скачайте клиент Speedtest CLI прямо в папку с проектом: Выберите команды для своей системы:

    Windows (PowerShell):

    Invoke-WebRequest -Uri "https://install.speedtest.net/app/cli/ookla-speedtest-1.2.0-win64.zip" -OutFile "speedtest.zip"
    Expand-Archive -Path "speedtest.zip" -DestinationPath "." -Force

    macOS (Терминал):

    curl -o speedtest.tgz https://install.speedtest.net/app/cli/ookla-speedtest-1.2.0-macosx-universal.tgz
    tar -xzf speedtest.tgz

    Linux (Терминал):

    wget https://install.speedtest.net/app/cli/ookla-speedtest-1.2.0-linux-x86_64.tgz
    tar -xzf ookla-speedtest-1.2.0-linux-x86_64.tgz
  4. Создайте файл main.js и вставьте в него код: (Если вы на Linux, используйте nano main.js, на Windows — любой текстовый редактор)

    const os = require('os')
    const { exec } = require('child_process')
    const viziotMQTT = require('viziot-mqtt-client-nodejs')
    
    // --- НАСТРОЙКИ ---
    //Вставьте сюда ключ и пароль вашего устройства VizIoT
    let keyDevice = 'ВАШ_КЛЮЧ_ДОСТУПА'
    let passDevice = 'ВАШ_ПАРОЛЬ_ДОСТУПА'
    const speedTestIntervalMinutes = 60 // Как часто делать замер (в минутах)
    // -----------------
    
    let viziotMQTTClient = new viziotMQTT(keyDevice, passDevice)
    let idIntervalSpeedTest = null
    
    function main() {
     console.log('Запуск... Подключение к VizIoT')
     viziotMQTTClient.connect(() => {
         console.log('Связь с сервером установлена!')
         runSpeedTest()
    
         // Запуск по расписанию
         clearInterval(idIntervalSpeedTest)
         idIntervalSpeedTest = setInterval(runSpeedTest, speedTestIntervalMinutes * 60 * 1000)
     })
    }
    
    function runSpeedTest() {
     let command = ''
     const flags = '--format=json --accept-license --accept-gdpr'
    
     switch (os.platform()) {
            case 'win32':
                command = `.\\speedtest.exe ${flags}`
                break
            case 'linux':
                command = `./speedtest ${flags}`
                break
            case 'darwin':
                command = `./speedtest ${flags}`
                break
        }
    
     console.log('Начинаю замер скорости...')
    
     exec(command, (error, stdout) => {
         if (error) {
             console.log('Ошибка запуска теста. Проверьте, установлен ли speedtest и отсутствует интернет соединение.')
             const packet = {
                 upload: -500,
                 download: -500,
                 ping: -500,
                 packet_loss: -500,
                 jitter_upload: -500,
                 jitter_download: -500,
             }
             viziotMQTTClient.sendDataToVizIoT(packet, (err) => {
                 if (err) console.log('Ошибка отправки:', err)
                 else console.log('Данные успешно отправлены:', packet)
             })
             return
         }
    
         try {
             const json = JSON.parse(stdout)
             const packet = {
                 upload: ((json.upload.bandwidth * 8) / 1000000).toFixed(2), // Преобразование из байт/с в мегабиты/с
                 download: ((json.download.bandwidth * 8) / 1000000).toFixed(2), // Преобразование из байт/с в мегабиты/с
                 ping: json.ping.latency.toFixed(2),
                 packet_loss: json.packetLoss ? json.packetLoss.toFixed(2) : 0,
                 jitter_upload: json.upload.latency.jitter.toFixed(2),
                 jitter_download: json.download.latency.jitter.toFixed(2),
             }
    
             viziotMQTTClient.sendDataToVizIoT(packet, (err) => {
                 if (err) console.log('Ошибка отправки в VizIoT:', err)
                 else console.log('Данные успешно отправлены:', packet)
             })
         } catch (err) {
             console.log('Ошибка обработки JSON:', err)
         }
     })
    }
    
    main()

Шаг 4: Ручной запуск и проверка

Перед тем как оставить скрипт работать в фоне, нужно убедиться, что он работает корректно.

В терминале (в папке проекта) выполните команду:

node main.js

Что должно произойти:

  1. В консоли появится надпись: Связь с сервером установлена!.
  2. Затем: Начинаю замер скорости... (это может занять 30-60 секунд).
  3. В конце вы увидите: Данные успешно отправлены: и объект с вашими показателями скорости.

Если всё так — поздравляем! Скрипт работает. Нажмите Ctrl + C, чтобы остановить его.


Шаг 5: Настройка автономной работы (PM2)

Чтобы мониторинг работал 24/7 даже после закрытия терминала или перезагрузки сервера, используем менеджер процессов PM2.

# 1. Установка PM2 глобально
npm install pm2 -g

# 2. Запуск вашего скрипта под управлением PM2
pm2 start main.js --name "viziot-speedtest"

# 3. Сохранение списка процессов (чтобы они запустились после перезагрузки)
pm2 save

# 4. Настройка автозапуска при старте системы
pm2 startup
# После этой команды PM2 выдаст строку, которую нужно скопировать и выполнить.

Теперь скрипт «живет» самостоятельно. Вы можете проверить его статус командой pm2 status.


Шаг 6: Визуализация (Красивые графики)

Возвращайтесь VizIoT:

  1. Создайте новую панель управления (Dashboard).
  2. Добавьте виджет типа «График».
  3. В параметрах виджета свяжите ваше устройство SPEEDTEST с виджетом и выберите нужный параметр (например, download).
  4. Настройте период отображения (например, последние 24 часа).

Повторите это для параметров upload и ping. Теперь вы наглядно увидите все просадки скорости в реальном времени!

Подробную инструкцию по настройке графиков вы можете найти в статье «Знакомство с VizIoT».


Итог

Мы создали надежную систему, которая автоматически проверяет качество интернета. С помощью официального клиента Ookla вы получаете точные данные, а VizIoT берет на себя хранение истории и отрисовку графиков. Больше никаких споров с провайдером «на словах» — у вас будут наглядные доказательства качества связи!