Информация
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
Контакты
Новинка
Распродажа
Новости
Доставка
Оплата
Загрузки
  • Прошивки
    • WinBox
    • RouterOS
    • Мобильные приложения MikroTik
    • Архив
  • RouterOS
  • Мобильные приложения MikroTik
  • Архив
Форум
Настройка
    info@mikrotik.moscow
    +7 495 320-55-52
    Заказать звонок
    Mikrotik.moscow
    Каталог
    • Акции
      Акции
    • Маршрутизаторы
      Маршрутизаторы
    • Коммутаторы
      Коммутаторы
    • Радиомосты и уличные точки доступа
      Радиомосты и уличные точки доступа
    • Wi-Fi для дома и офиса
      Wi-Fi для дома и офиса
    • LTE/5G
      LTE/5G
    • Powerline адаптеры
      Powerline адаптеры
    • IoT устройства
      IoT устройства
    • Оборудование 60 ГГц
      Оборудование 60 ГГц
    • Материнские платы RouterBOARD
      Материнские платы RouterBOARD
    • Корпуса
      Корпуса
    • Интерфейсы
      Интерфейсы
    • SFP/QSFP трансиверы
      SFP/QSFP трансиверы
    • Аксессуары
      Аксессуары
    • Антенны
      Антенны
    • Архив
      Архив
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Скачать WinBox Скачать Прошивки Форум > RouterOS Форум > SwOS Форум > Железо
    Mikrotik.moscow
    Каталог
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Mikrotik.moscow
    Телефоны
    +7 495 320-55-52
    Заказать звонок
    0
    0
    0
    Mikrotik.moscow
    • +7 495 320-55-52
      • Назад
      • Телефоны
      • +7 495 320-55-52
      • Заказать звонок
    • info@mikrotik.moscow
    • г. Москва, ул. Бакунинская, 84
    • Пн-Пт: 09-00 до 18-00
      Сб-Вс: выходной


    • Кабинет
    • 0 Сравнение
    • 0 Избранное
    • 0 Корзина
    Главная
    Форум
    Форум
    RouterOS
    Script to get RSRP and then do...

    Script to get RSRP and then do...

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    Script to get RSRP and then do..., RouterOS
     
    krafg
    Guest
    #1
    0
    11.08.2019 05:32:00
    Привет. Я пытался получить значение RSRP с интерфейса LTE, а затем сделать что-то с помощью условий "если". Я хочу персонализировать количество светодиодов (включено/выключено) в зависимости от уровней сигнала. Я знаю, что можно включить эту функцию с помощью: /system leds add interface=lte1 leds=led1,led2,led3,led4,led5 modem-signal-treshold=-91 type=modem-signal. Но я хочу получить что-то более персонализированное. С уважением.
     
     
     
    krafg
    Guest
    #2
    0
    28.08.2019 15:45:00
    Хорошо, у меня есть новости. Наконец-то я нашел способ захватить значение RSRP и установить его в переменную: /interface lte info lte1 once do={:global rsrp1 $"rsrp"}; У LtAP есть 5 светодиодов для отображения силы сигнала: led1, led2, led3, led4 и led5 соответственно. Теперь с переменной rsrp1, которая отвечает за силу сигнала, мне нужно следующее: От -120 до -111 только включен led1. От -110 до -101 включены led1 и led2. От -100 до -91 включены led1, led2 и led3. От -90 до -81 включены led1, led2, led3 и led4. Если значение больше или равно -80, включены все 5 светодиодов. Если ни одно из этих условий не выполнено, выключить 5 светодиодов. Я новичок в написании скриптов в целом и буду благодарен за вашу помощь. С уважением.
     
     
     
    krafg
    Guest
    #3
    0
    28.08.2019 16:58:00
    На данный момент у меня есть следующий код:
    #Создать переменную "runLoop"
    :глобальная runLoop true
    #Выполнить следующее:
    :do {
    #Посмотреть информацию о LTE интерфейсе
    /interface lte info lte1 once do={
    #Записать значение RSRP и сохранить в переменной "RSRP1"
    :глобальная rsrp1 $"rsrp"
    #Предотвращает высокую загрузку ЦП
    :delay 100ms
    #Завершить задачи
    }
    #Запускать это, пока переменная runLoop истинна
    } while=($runLoop)
     
     
     
    krafg
    Guest
    #4
    0
    28.08.2019 18:43:00
    Теперь я создал код, но лог просто сумасшедший! {
    :global runloop true
    :do {
    /interface lte info lte1 once do={
    :global rsrp1 $"rsrp"
    :delay 100ms
    :if ($rsrp1 >= -80) do={
    /system leds set 1 leds=led1,led2,led3,led4,led5 type=on
    } else={
    :if (($rsrp1 >= -90) && ($rsrp1 <= -81)) do={
    /system leds set 1 leds=led1,led2,led3,led4 type=on
    } else={
    :if (($rsrp1 >= -100) && ($rsrp1 <= -91)) do={
    /system leds set 1 leds=led1,led2,led3 type=on
    } else={
    :if (($rsrp1 >= -110) && ($rsrp1 <= -101)) do={
    /system leds set 1 leds=led1,led2 type=on
    } else={
    :if (($rsrp1 >= -120) && ($rsrp1 <= -111)) do={
    /system leds set 1 leds=led1 type=on
    } else={
    /system leds set 1 leds=led1,led2,led3,led4,led5 type=off
    }
    }
    }
    }
    }
    }
    } while=($runloop)
    } С уважением.
     
     
     
    SiB
    Guest
    #5
    0
    28.08.2019 18:57:00
    Проблема не в синтаксисе в маркплейсе, а до этого. "New Terminal" не подходит для работы с многострочными скриптами. У вас много циклов :do внутри других циклов. Это не лучший подход. Помните одну основополагающую истину в скриптинге/программировании: работа выглядит так: {

    # Установить глобальную $rsrp
    #/interface lte info lte1 once do={:global RsrpLte1 $"RsrpLte1"}; # получить "-87dBm"
    global RsrpLte1 "-79dBm";
    set $RsrpLte1 [/pick $RsrpLte1 0 [/find $RsrpLte1 dBm]];
    put $RsrpLte1; # Теперь это "-87" без слова dBm

    # Тестовая строка
    /if ($RsrpLte1 > "-80") do={put "$RsrpLte1 больше чем -80"} else={put "другое: $RsrpLte1"};

    :if ($RsrpLte1 >= -80) do={
     #/system leds set 1 leds=led1,led2,led3,led4,led5 type=on
     put "5led *****";
     } else={
     :if (($RsrpLte1 <= -81) && ($RsrpLte1 >= -90)) do={
       #/system leds set 1 leds=led1,led2,led3,led4 type=on
       put "4led ****";
       } else={
       :if (($RsrpLte1 <= -91) && ($RsrpLte1 >= -100)) do={
         #/system leds set 1 leds=led1,led2,led3 type=on
         put "3led ***";
         } else={
         :if (($RsrpLte1 <= -101) && ($RsrpLte1 >= -110)) do={
           #/system leds set 1 leds=led1,led2 type=on
           put "2led **";
           } else={
           :if (($RsrpLte1 <= -111) && ($RsrpLte1 >= -120)) do={
             #/system leds set 1 leds=led1 type=on
             put "1led *"
             } else={
             #/system leds set 1 leds=led1,led2,led3,led4,led5 type=off;
             put "выключено";
           }
         }
       }
     }
    }

    } Измените много чего. Теперь работает один раз. Планировщик должен запускать этот скрипт каждые 1 минуту. Может быть, создать глобальные RsrpLte1History1 … RsrpLte1History5, и если мы будем использовать RsrpLte1AVG, это будет более стабильно, а в конечном итоге мы сможем использовать это для других задач, например, чтобы сменить SIM-порт на другой. Лучшие настройки для отладки и создания ROS-скрипта: И, возможно, лучше добавить условие в начале, чтобы начинать моргать светодиодом только когда время работы больше 3 минут. Это не вызовет конфликт, когда вы включаете RB, и он не будет странно мигать.
     
     
     
    krafg
    Guest
    #6
    0
    28.08.2019 21:32:00
    Ваш скрипт не работает на моем роутере. В любом случае сейчас все работает отлично, кроме того, что мой лог забит, пока скрипт выполняется. Нет способа "сказать", чтобы при изменении значений светодиодов ничего не фиксировать в логе? С уважением.
     
     
     
    SiB
    Guest
    #7
    0
    28.08.2019 21:55:00
    Ваш скрипт не работает на моем роутере. Почему? Есть какая-то ошибка, скриншот? Все уникальные для аппаратного обеспечения вещи закомментированы и должны работать на любом RouterOS. Значит, вам нужно изменить это: Из этого: #/interface lte info lte1 once do={:global RsrpLte1 $"RsrpLte1"}; # receive "-87dBm"
    global RsrpLte1 "-79dBm"; На это: /interface lte info lte1 once do={:global RsrpLte1 $"RsrpLte1"}; # receive "-87dBm"
    #global RsrpLte1 "-79dBm"; Пожалуйста, добавьте это в WinBox > System > Script и запустите из CLI (WinBox > New Terminal > /system script run NameOfScript ;). В любом случае сейчас работает отлично, за исключением того, что мой лог переполнен, пока скрипт выполняется. Невозможно «сказать», чтобы не записывать логи, когда я изменяю значения светодиодов? Если это возможно, то только из WinBox > System > Logging, но я не вижу темы LED. Поиск на форуме или напишите письмо в техподдержку. @Jotne в посте есть несколько интересных моментов о новой опции управления светодиодами. Действие не включить/выключить, а МИГАЮЩИЕ светодиоды, тогда они генерируют много таких логов, я думаю. Может быть, (с)he сможет вам ответить.
     
     
     
    krafg
    Guest
    #8
    0
    28.08.2019 22:10:00
    Извините, я запутался. Скрипт работает, но эффекта нет (по крайней мере, я его не вижу). Прилагаю скриншот. Я изучал вопрос логирования, но думаю, что это невозможно, поскольку такие действия могут способствовать вредоносной активности на роутерах. С уважением.
     
     
     
    SiB
    Guest
    #9
    0
    28.08.2019 22:18:00
    У меня нет этого оборудования, и я не могу проверить массив RSRP. Скрипт работает нормально. Просто раскомментируй #/led… Я закомментировал это, потому что оно ломается на моем оборудовании. Вместо этого я создал дисплей "3 Led ***". И, пожалуйста, вставь и отредактируй скрипт в WinBox > System > Script, а не в терминале… Ты не написал мой пост — просто посмотри на мой предыдущий скриншот, если не знаешь, где искать, следуй указаниям: Твоя часть скриншота — внизу выполняемого скрипта ты увидишь результаты. Я просто вывел текст "5 Led *****". Код, который не работает в моем сценарии, но должен работать у тебя. Проверь это: {

    # Установить глобальный $rsrp
    /interface lte info lte1 once do={:global RsrpLte1 $"RsrpLte1"}; # получить "-87dBm"
    #global RsrpLte1 "-79dBm";
    set $RsrpLte1 [/pick $RsrpLte1 0 [/find $RsrpLte1 dBm]];
    put $RsrpLte1; # Теперь это "-87" без слова dBm

    #Тестовая строка
    #/if ($RsrpLte1 > "-80") do={put "$RsrpLte1 больше чем -80"} else={put "другое: $RsrpLte1"};

    :if ($RsrpLte1 >= -80) do={
     /system leds set 1 leds=led1,led2,led3,led4,led5 type=on
     put "5 Led *****";
     } else={
     :if (($RsrpLte1 <= -81) && ($RsrpLte1 >= -90)) do={
       /system leds set 1 leds=led1,led2,led3,led4 type=on
       put "4 Led ****";
       } else={
       :if (($RsrpLte1 <= -91) && ($RsrpLte1 >= -100)) do={
         /system leds set 1 leds=led1,led2,led3 type=on
         put "3 Led ***";
         } else={
         :if (($RsrpLte1 <= -101) && ($RsrpLte1 >= -110)) do={
           /system leds set 1 leds=led1,led2 type=on
           put "2 Led **";
           } else={
           :if (($RsrpLte1 <= -111) && ($RsrpLte1 >= -120)) do={
             /system leds set 1 leds=led1 type=on
             put "1 Led *"
             } else={
             /system leds set 1 leds=led1,led2,led3,led4,led5 type=off;
             put "- Led";
           }
         }
       }
     }
    }

    }
     
     
     
    SiB
    Guest
    #10
    0
    29.08.2019 06:14:00
    Ваша команда “/system leds…” не работает. Откуда вы её получили? Вы её тестировали?
     
     
     
    krafg
    Guest
    #11
    0
    29.08.2019 11:20:00
    Если я отключу предыдущие задания, которые сделал, я смогу использовать скрипты в своем LtAP. В моем случае у меня с этим нет проблем. Позже я снова протестирую код, убрав символ комментария в коде, используя секцию скриптов. Большое спасибо и всего хорошего.
     
     
     
    SiB
    Guest
    #12
    0
    29.08.2019 12:22:00
    Я смотрю на брошюру вашего комплекта RB LtAP LTE и в стандартном состоянии, что делать с его светодиодами? Можете показать скриншот из WinBox > System > LEDs или команду /system leds print detail?
     
     
     
    krafg
    Guest
    #13
    0
    29.08.2019 22:34:00
    Состояние по умолчанию — все светодиоды выключены, кроме светодиода питания. По умолчанию раздел светодиодов в Winbox пуст. С уважением.
     
     
     
    krafg
    Guest
    #14
    0
    30.08.2019 00:27:00
    Ок. Наконец-то я запустил твой скрипт и результаты на скриншоте_6. Если я изменю скрипт, убрав символ комментария, и запущу его, результаты будут на скриншоте_7. С уважением.
     
     
     
    krafg
    Guest
    #15
    0
    30.08.2019 02:00:00
    Я модифицировал свой код, и теперь изменяю свойства LED только при необходимости: { :global ledsafter 10 :global ledsbefore 20 :global runloop true :do { /interface lte info lte1 once do={ :global rsrp1 $"rsrp" :delay 100ms :if ($rsrp1 >= -80) do={ :global ledsbefore 5 :if ($ledsafter = $ledsbefore) do={ :put "ничего не нужно делать" } else={ /system leds set 1 leds=led1,led2,led3,led4,led5 type=on :global ledsafter 5 } } else={ :delay 100ms :if (($rsrp1 >= -90) && ($rsrp1 <= -81)) do={ :global ledsbefore 4 :if ($ledsafter = $ledsbefore) do={ :put "ничего не нужно делать" } else={ /system leds set 1 leds=led1,led2,led3,led4 type=on :global ledsafter 4 } } else={ :delay 100ms :if (($rsrp1 >= -100) && ($rsrp1 <= -91)) do={ :global ledsbefore 3 :if ($ledsafter = $ledsbefore) do={ :put "ничего не нужно делать" } else={ /system leds set 1 leds=led1,led2,led3 type=on :global ledsafter 3 } } else={ :delay 100ms :if (($rsrp1 >= -110) && ($rsrp1 <= -101)) do={ :global ledsbefore 2 :if ($ledsafter = $ledsbefore) do={ :put "ничего не нужно делать" } else={ /system leds set 1 leds=led1,led2 type=on :global ledsafter 2 } } else={ :delay 100ms :if (($rsrp1 >= -120) && ($rsrp1 <= -111)) do={ :global ledsbefore 1 :if ($ledsafter = $ledsbefore) do={ :put "ничего не нужно делать" } else={ /system leds set 1 leds=led1 type=on :global ledsafter 1 } } else={ :global ledsbefore 0 :if ($ledsafter = $ledsbefore) do={ :put "ничего не нужно делать" } else={ /system leds set 1 leds=led1,led2,led3,led4,led5 type=off :global ledsafter 0 } } } } } } } } while=($runloop) } Темой является то, когда модифицируются свойства LED, я использую “ledbefore”, чтобы задать количество включенных светодиодов, а с помощью “ledafter” проверяю, изменилось ли это количество. Таким образом, логи не заполняются, когда сигнал меняется многократно между двумя уровнями сигнала. Как видно на screenshot_8, мой скрипт, который я запускаю в терминале, не загружает CPU сильно, количество включенных светодиодов правильное, логи не переполняются, и уровень сигнала в переменной соответствует тому, что показано в статусном интерфейсе. С этим я могу сказать, что всё работает хорошо, но всё равно принимаю предложения по этому поводу. С уважением.
     
     
     
    Jotne
    Guest
    #16
    0
    30.08.2019 06:14:00
    @krafg Я пытался прочитать твой скрипт, но было очень сложно понять из-за форматирования. Пожалуйста, используй табуляцию для каждого цикла, когда создаешь скрипт. Я немного изменил его для тебя. Попробуй скопировать и вставить его в Notepad++ и ты поймешь, о чем я. {
    :global ledsafter 10
    :global ledsbefore 20
    :global runloop true
    :do {
    /interface lte info lte1 once do={
    :global rsrp1 $"rsrp"
    :delay 100ms
    :if ($rsrp1 >= -80) do={
    :global ledsbefore 5
    :if ($ledsafter = $ledsbefore) do={
    :put "ничего не нужно делать"
    } else={
    /system leds set 1 leds=led1,led2,led3,led4,led5 type=on
    :global ledsafter 5
    }
    } else={
    :delay 100ms
    :if (($rsrp1 >= -90) && ($rsrp1 <= -81)) do={
    :global ledsbefore 4
    :if ($ledsafter = $ledsbefore) do={
    :put "ничего не нужно делать"
    } else={
    /system leds set 1 leds=led1,led2,led3,led4 type=on
    :global ledsafter 4
    }
    } else={
    :delay 100ms
    :if (($rsrp1 >= -100) && ($rsrp1 <= -91)) do={
    :global ledsbefore 3
    :if ($ledsafter = $ledsbefore) do={
    :put "ничего не нужно делать"
    } else={
    /system leds set 1 leds=led1,led2,led3 type=on
    :global ledsafter 3
    }
    } else={
    :delay 100ms
    :if (($rsrp1 >= -110) && ($rsrp1 <= -101)) do={
    :global ledsbefore 2
    :if ($ledsafter = $ledsbefore) do={
    :put "ничего не нужно делать"
    } else={
    /system leds set 1 leds=led1,led2 type=on
    :global ledsafter 2
    }
    } else={
    :delay 100ms
    :if (($rsrp1 >= -120) && ($rsrp1 <= -111)) do={
    :global ledsbefore 1
    :if ($ledsafter = $ledsbefore) do={
    :put "ничего не нужно делать"
    } else={
    /system leds set 1 leds=led1 type=on
    :global ledsafter 1
    }
    } else={
    :global ledsbefore 0
    :if ($ledsafter = $ledsbefore) do={
    :put "ничего не нужно делать"
    } else={
    /system leds set 1 leds=led1,led2,led3,led4,led5 type=off
    :global ledsafter 0
    }
    }
    }
    }
    }
    }
    }
    } while=($runloop)
    } Также выглядит, что многие циклы одинаковы, лишь с разными значениями. Тебе стоит попробовать сделать из этого функцию. :delay 100ms
    :if (($rsrp1 >= -120) && ($rsrp1 <= -111)) do={
    :global ledsbefore 1
    :if ($ledsafter = $ledsbefore) do={
    :put "ничего не нужно делать"
    } else={
    /system leds set 1 leds=led1 type=on
    :global ledsafter 1
    }
    } PS Первую { и последнюю } можно убрать. Они нужны только при копировании/вставке в терминал. В скрипте без них все работает нормально.
     
     
     
    SiB
    Guest
    #17
    0
    31.08.2019 00:12:00
    Сначала большое спасибо за сотрудничество и скриншоты. Просто создайте другой, отдельный LogAction для тем System+Info, вы все равно сможете увидеть их в отдельном списке журналов. Чтобы не дублировать это в стандартной информации, просто добавьте !system. Пример: протестировано на редактировании скрипта, который выполняет изменения System+Info. . журналы не перегружаются. Сделано. Больше нет дублирования одинаковых настроек активации LED, только если изменится количество LED, тогда изменится и оно. Смотрите ниже. . Как видно на скриншоте_8, мой скрипт, который я запускаю в терминале, потребление ЦП не слишком высокое. В разы лучше, если вы запустите этот скрипт в /system scheduler с интервалом 1с, или вы должны увидеть скорость обновления 120 Гц :). Скрипт можно разместить внутри планировщика или запустить внешний /system script с нашим исходным кодом. . С этим могу сказать, что работает хорошо, но, тем не менее, я получаю предложения по этому поводу. Первая оптимизация ... Вы преобразовали простые 34 строки кода в 74-строчный монстр do-if-else-loop :) Теперь эта переменная $rsrp1 живет только внутри do-loop, а после выхода из скрипта сохраняется как переменная окружения. Патч: -interface lte info lte1 once do={:global rsrp1 $"rsrp"; ... +local Rsrp ([/interface lte info lte1 once as-value]->"rsrp") Теперь мы можем использовать $Rsrp во всей области скрипта, и нам не нужно удалять суффикс "dBm". Используйте функции, образовательные примеры в viewtopic.php?f=9&t=151539#p746898, простой пример: local ChangeLeds do={put "Display $1 leds"}; # $1 - первый аргумент $ChangeLeds 4; # Запускаем функцию и говорим, что нужно включить LED 4. Вместо того, чтобы создавать новую и новую одну и ту же глобальную, просто измените ее значение, патч: -global a "новое значение 1" -global a "новое значение 2" ... +set $a "новое значение 3" +set $a "новое значение 4" # Эта проверка существует глобально, верно только когда глобальная переменная существует с любым значением: put ([system script environment find name=a]!="") # Вместо: -:global runloop true; do {...} while={$runloop} +do while=(1=1) {delay 1s;...} # На самом деле, планировщик с интервалом 1с... Финальный релиз... работает без дублирования, основываясь на обратной связи от $LedsCurrent = LastState, это должна быть только глобальная переменная. Вставьте в CLI и проверьте. global LedsCurrent 0 local LteRsrp -121 local ControlLed do={ if ($1 != $4) do={ system leds set 1 leds=$2 type=$3 } return $1 } do while=(1=1) { delay 1s set $LteRsrp ([/interface lte info lte1 once as-value]->"rsrp"); if ($LteRsrp >= -80) do={set $LedsCurrent [$ControlLed 5 led1,led2,led3,led4,led5 on $LedsCurrent ] }; if (($LteRsrp >= -90) && ($LteRsrp <= -81)) do={set $LedsCurrent [$ControlLed 4 led1,led2,led3,led4 on $LedsCurrent ] }; if (($LteRsrp >= -100) && ($LteRsrp <= -91)) do={set $LedsCurrent [$ControlLed 3 led1,led2,led3 on $LedsCurrent ] }; if (($LteRsrp >= -110) && ($LteRsrp <= -101)) do={set $LedsCurrent [$ControlLed 2 led1,led2 on $LedsCurrent ] }; if (($LteRsrp >= -120) && ($LteRsrp <= -111)) do={set $LedsCurrent [$ControlLed 1 led1 on $LedsCurrent ] }; if ($LteRsrp <= -121) do={set $LedsCurrent [$ControlLed 0 led1,led2,led3,led4,led5 off $LedsCurrent ] }; } . Дополнительные вопросы: Пожалуйста, покажите результат: put [/interface lte get lte1 band], или может быть, эта информация находится в WinBox > Interfaces > LTE > lte1 > вкладка General или Status (вы ранее показали вкладку Cellular). Cell-Monitor существует для поиска band/cell@BTS, но может быть, вы знаете, как проверить текущую используемую частоту. Если вы считаете, что это решение для поста, тогда отметьте этот ответ. P.S. Я в Telegram, если вы не понимаете финальный скрипт.
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2026 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры