Информация
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
Контакты
Новинка
Распродажа
Новости
Доставка
Оплата
Загрузки
  • Прошивки
    • WinBox
    • RouterOS
    • Мобильные приложения MikroTik
    • Архив
  • Changelogs
  • 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
    TG-BT5-IN - Скрипт Move

    TG-BT5-IN - Скрипт Move

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    TG-BT5-IN - Скрипт Move, RouterOS
     
    dima1002
    Guest
    #1
    0
    12.11.2022 19:02:00
    Привет! Я ищу скрипт, который бы присылал мне уведомление на почту, когда перемещается TG-BT5-IN по оси X или Y. Это реально сделать? Например, если кто-то откроет дверь серверной, мы хотим сразу об этом узнать.
     
     
     
    dima1002
    Guest
    #2
    0
    12.01.2023 14:38:00
    Извините. Но кто-нибудь реально может помочь мне с этой темой? Или кто-то знает службу поддержки?
     
     
     
    rextended
    Guest
    #3
    0
    12.01.2023 14:53:00
    Даже если кто-то искренне захочет помочь вам с написанием сценария, без устройства у них ничего не получится… Свяжитесь напрямую с support@mikrotik.com и сообщите нам, что вам ответят.
     
     
     
    dima1002
    Guest
    #4
    0
    12.01.2023 19:54:00
    Я куплю тебе устройство, если ты поможешь мне.
     
     
     
    martc
    Guest
    #5
    0
    03.12.2022 21:43:00
    Возьми TG-BT5-in и посмотри, какие данные он получает на knot. У меня этого маячка пока нет. Заказал две штуки, думаю, получу через пару дней… Mikrotik имеет пару примеров для Bluetooth, думаю, этого вполне достаточно, чтобы начать.
     
     
     
    martc
    Guest
    #6
    0
    06.12.2022 19:30:00
    Кстати, у меня с tg5-in небольшие заморочки, иногда просто нужно почитать мануал. Вот пример скрипта от Mikrotik работает. Я его немного переделал под mqtt-domoticz — теперь отлично работает, реагирует на наклон и переключатель. https://help.mikrotik.com/docs/display/UM/Email+notification+on+the+MikroTik+BLE+t­ag's+accelerometer+triggers А второй скрипт, мне кажется, полезнее, но у меня не работает... пытаюсь найти причину. Просто в терминале ничего не возвращает.

    # POSIX regex для фильтрации Bluetooth-адресов в рекламе. Например, "^BC:33:AC"  
    # будет включать только адреса, которые начинаются на эти три октета.  
    # Чтобы отключить фильтр, установите значение ""  
    :local addressRegex "00:CC:66:88:11:BB"

    # POSIX regex для фильтрации Bluetooth-рекламы по её данным. Аналогично 'addressRegex'.  
    :local advertisingDataRegex ""

    # Фильтр по мощности сигнала. Например, -40 включит только рекламу с уровнем сигнала выше -40dBm.  
    # Чтобы отключить — установите ""  
    :local rssiThreshold ""

    ################################## Bluetooth ##################################

    :global invertU16 do={
       :local inverted 0
       :for idx from=0 to=15 step=1 do={
           :local mask (1 << $idx)
           :if ($1 & $mask = 0) do={
               :set $inverted ($inverted | $mask)
           }
       }
       return $inverted
    }

    :global le16ToHost do={
       :local lsb [:pick $1 0 2]
       :local msb [:pick $1 2 4]

       :return [:tonum "0x$msb$lsb"]
    }

    :local le32ToHost do={
       :local lsb [:pick $1 0 2]
       :local midL [:pick $1 2 4]
       :local midH [:pick $1 4 6]
       :local msb [:pick $1 6 8]

       :return [:tonum "0x$msb$midH$midL$lsb"]
    }

    :local from88 do={
       :global invertU16
       :global le16ToHost
       :local num [$le16ToHost $1]

       # Обработка отрицательных чисел  
       :if ($num & 0x8000) do={
           :set num (-1 * ([$invertU16 $num] + 1))
       }

       # Конвертация из формата 8.8. Масштабирование на 1000, так как плавающая точка не поддерживается  
       :return (($num * 125) / 32)
    }

    :local flagStr do={
       :local str ""

       :if ($1 & 0x01) do={ :set $str " переключатель" }
       :if ($1 & 0x02) do={ :set $str "$str наклон" }
       :if ($1 & 0x04) do={ :set $str "$str падение" }
       :if ($1 & 0x08) do={ :set $str "$str удар_x" }
       :if ($1 & 0x10) do={ :set $str "$str удар_y" }
       :if ($1 & 0x20) do={ :set $str "$str удар_z" }

       :if ([:len $str] = 0) do={ :return "" }

       :return [:pick $str 1 [:len $str]]
    }

    # Поиск новых Bluetooth-объявлений  
    :global btOldestAdvertisementTimestamp  
    :if ([:typeof $btOldestAdvertisementTimestamp] = "nothing") do={
       # Первый запуск скрипта после перезагрузки, нужно инициализировать переменные  
       :set $btOldestAdvertisementTimestamp 0  
    }  
    :local advertisements [/iot bluetooth scanners advertisements print detail as-value where epoch > $btOldestAdvertisementTimestamp and address ~ $addressRegex and data ~ $advertisingDataRegex and rssi > $rssiThreshold]
    :local advCount 0  
    :local lastAdvTimestamp 0  
    :local advJson ""  
    :local advSeparator ""

    # Убираем двоеточия из MAC/Bluetooth-адресов  
    :local minimizeMac do={  
       :local minimized  
       :local lastIdx ([:len $address] - 1)
       :for idx from=0 to=$lastIdx step=1 do={  
           :local char [:pick $address $idx]
           :if ($char != ":") do={  
               :set $minimized "$minimized$char"  
           }  
       }  
       :return $minimized  
    }

    :foreach adv in=$advertisements do={  
       :local address ($adv->"address")  
       :local rssi ($adv->"rssi")  
       :local epoch ($adv->"epoch")  
       :local ad ($adv->"data")  
       :local version [:tonum "0x$[:pick $ad 8 10]"]
       :local encrypted [:tonum "0x$[:pick $ad 10 12]"]
       :local salt [$le16ToHost [:pick $ad 12 16]]
       :local accelX [$from88 [:pick $ad 16 20]]
       :local accelY [$from88 [:pick $ad 20 24]]
       :local accelZ [$from88 [:pick $ad 24 28]]
       :local temp [$from88 [:pick $ad 28 32]]
       :local uptime [$le32ToHost [:pick $ad 32 40]]
       :local flags [:tonum "0x$[:pick $ad 40 42]"]
       :local bat [:tonum "0x$[:pick $ad 42 44]"]

       :put ("$advCount: address=$address ts=$epoch rssi=$rssi version=$version encrypted=$encrypted salt=$salt accelX=$accelX accelY=$accelY accelZ=$accelZ temp=$temp uptime=$uptime flags=\"$[$flagStr $flags]\" bat=$bat")
       :set $advCount ($advCount + 1)  
       :set $lastAdvTimestamp $epoch  
    }  
    :if ($advCount > 0) do={  
       :set $btOldestAdvertisementTimestamp $lastAdvTimestamp  
       :log info $advCount  
    }
     
     
     
    dima1002
    Guest
    #7
    0
    12.12.2022 05:06:00
    Это работает у меня, когда происходит наклон или удар, но, к сожалению, пока не работает, если просто двигаешь его.

    [admin@Knot] > /system/script/export
    # 12 дек 2022 06:01:20, RouterOS 7.4  
    # software id = LMW4-2MB9  
    #  
    # модель = RB924i-2nD-BT5&BG77  
    # серийный номер = F5750ECE0D59  

    /system script  
    add dont-require-permissions=no name=script4 owner=admin policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="# Введите MAC-адрес метки в кавычках \"\"\r\n:local addressRegex \"DC:2C:6E:13:15:7E\"\r\n\r\n# POSIX-выражение для фильтрации Bluetooth-рекламных сообщений на основе их данных. Используется так же, как 'addressRegex'.\r\n:local advertisingDataRegex \"\"\r\n\r\n# Фильтр по силе сигнала. Например, -40 означает, что будут включены Bluetooth-сообщения с силой сигнала сильнее -40 дБм.\r\n# Чтобы отключить фильтр, установите значение \"\"\r\n:local rssiThreshold \"\"\r\n\r\n# Введите тему письма в кавычках \"\"\r\n:local emailsubject \"RouterOS report!\"\r\n\r\n# Введите email-адрес в кавычках \"\"\r\n:local emailaddress \"mail@domain.com\"\r\n\r\n# Скрипт:\r\n################################## Bluetooth ##################################\r\n:local flagStr do={\r\n    :local str \"\"\r\n\r\n    :if (\$1 & 0x01) do={ :set \$str \" switch\" }\r\n    :if (\$1 & 0x02) do={ :set \$str \"\$str tilt\" }\r\n    :if (\$1 & 0x04) do={ :set \$str \"\$str free_fall\" }\r\n    :if (\$1 & 0x08) do={ :set \$str \"\$str impact_x\" }\r\n    :if (\$1 & 0x10) do={ :set \$str \"\$str impact_y\" }\r\n    :if (\$1 & 0x20) do={ :set \$str \"\$str impact_z\" }\r\n\r\n    :if ([:len \$str] = 0) do={ :return \"\" }\r\n\r\n :return [:pick \$str 1 [:len \$str]]\r\n}\r\n\r\n:local triggernameF \"free_fall\"\r\n:local triggernameT \"tilt\"\r\n:local triggernameX \"impact_x\"\r\n:local triggernameY \"impact_y\"\r\n:local triggernameZ \"impact_z\"\r\n:local triggernameS \"switch\"\r\n\r\n# Поиск новых Bluetooth-реклам\r\n:global btOldestAdvertisementTimestamp\r\n:if ([:typeof \$btOldestAdvertisementTimestamp] = \"nothing\") do={\r\n # Первый запуск скрипта после перезагрузки — нужно инициализировать\r\n # постоянные переменные\r\n :set \$btOldestAdvertisementTimestamp 0\r\n}\r\n:local advertisements [/iot bluetooth scanners advertisements print detail \\\r\n as-value where \\\r\n epoch > \$btOldestAdvertisementTimestamp and \\\r\n address ~ \$addressRegex and \\\r\n data ~ \$advertisingDataRegex and \\\r\n rssi > \$rssiThreshold\r\n]\r\n:local advCount 0\r\n:local lastAdvTimestamp 0\r\n:local triggerlist \"\"\r\n\r\n:local triggerF\r\n:local triggerT\r\n:local triggerX\r\n:local triggerY\r\n:local triggerZ\r\n:local triggerS\r\n\r\n:local messageF \"\"\r\n:local messageT \"\"\r\n:local messageX \"\"\r\n:local messageY \"\"\r\n:local messageZ \"\"\r\n:local messageS \"\"\r\n\r\n:local 21st \"\"\r\n\r\n:foreach adv in=\$advertisements do={\r\n :local address (\$adv->\"address\")\r\n :local rssi (\$adv->\"rssi\")\r\n :local epoch (\$adv->\"epoch\")\r\n :local rtime (\$adv->\"time\")\r\n :local ad (\$adv->\"data\")\r\n :local flags [:tonum \"0x\$[:pick \$ad 40 42]\"]\r\n :local fflags \"\$[\$flagStr \$flags]\"\r\n :if (\$fflags=\"\") do={:set \$fflags \"none - periodically broadcasted payload\"}\r\n\r\n :local obj \"# \$advCount:\r\n time: \$rtime\r\n trigger: \$fflags\r\n\r\n\"\r\n\r\n :set \$advCount (\$advCount + 1)\r\n :set \$lastAdvTimestamp \$epoch\r\n :set \$triggerlist \"\$triggerlist\$obj\"\r\n\r\n:set triggerF [:pick \$triggerlist ([find \$triggerlist \"free_fall\"]-0) ([find \$triggerlist \"free_fall\"]+9)]\r\n:if (\$triggerF=\$triggernameF) do={:set messageF \"\$triggernameF\";:set 21st \"not00\";}\r\n:set triggerT [:pick \$triggerlist ([find \$triggerlist \"tilt\"]-0) ([find \$triggerlist \"tilt\"]+4)]\r\n:if (\$triggerT=\$triggernameT) do={:set messageT \"\$triggernameT\";:set 21st \"not00\";}\r\n:set triggerX [:pick \$triggerlist ([find \$triggerlist \"impact_x\"]-0) ([find \$triggerlist \"impact_x\"]+8)]\r\n:if (\$triggerX=\$triggernameX) do={:set messageX \"\$triggernameX\";:set 21st \"not00\";}\r\n:set triggerY [:pick \$triggerlist ([find \$triggerlist \"impact_y\"]-0) ([find \$triggerlist \"impact_y\"]+8)]\r\n:if (\$triggerY=\$triggernameY) do={:set messageY \"\$triggernameY\";:set 21st \"not00\";}\r\n:set triggerZ [:pick \$triggerlist ([find \$triggerlist \"impact_z\"]-0) ([find \$triggerlist \"impact_z\"]+8)]\r\n:if (\$triggerZ=\$triggernameZ) do={:set messageZ \"\$triggernameZ\";:set 21st \"not00\";}\r\n:set triggerS [:pick \$triggerlist ([find \$triggerlist \"switch\"]-0) ([find \$triggerlist \"switch\"]+6)]\r\n:if (\$triggerS=\$triggernameS) do={:set messageS \"\$triggernameS\";:set 21st \"not00\";}\r\n\r\n}\r\n:if (\$advCount > 0) do={\r\n :set \$btOldestAdvertisementTimestamp \$lastAdvTimestamp\r\n}\r\n\r\n:if (\$21st=\"not00\") do={/tool e-mail send to=\$emailaddress subject=\"\$emailsubject\" body=\"\$triggerlist\"} else={:put \"21-й октет не содержит обнаруженных триггеров!\"}"


    [admin@Knot] > /system/scheduler/export
    # 12 дек 2022 06:01:25, RouterOS 7.4  
    # software id = LMW4-2MB9  
    #  
    # модель = RB924i-2nD-BT5&BG77  
    # серийный номер = F5750ECE0D59  

    /system scheduler  
    add interval=10s name=schedule1 on-event="/system script run script4\r\n/system script run test" policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon start-date=ноя/12/2022 start-time=19:33:27  
    [admin@Knot] >
     
     
     
    normis
    Guest
    #8
    0
    12.12.2022 06:52:00
    У нас есть несколько видео про использование тегов TG-BT, может, это поможет: https://youtube.com/playlist?list=PLXr-HoBo2VtWSXU2pMH7vd5D2Cgi5pOez
     
     
     
    dima1002
    Guest
    #9
    0
    13.12.2022 13:51:00
    Спасибо, я уже кое-что посмотрел. А есть ли, случайно, поддержка по деньгам? Или можно где-то это узнать?
     
     
     
    dima1002
    Guest
    #10
    0
    06.03.2023 19:52:00
    Огромное спасибо Mikrotik Support, они очень помогли. Вот как это работает:  
    # Введите MAC-адрес тега в кавычках ""  
    :local addressRegex "AC:2C:6E:13:05:9E"  

    # POSIX-выражение для фильтрации Bluetooth-объявлений по их данным. Использование такое же, как и с 'addressRegex'.  
    :local advertisingDataRegex ""  

    # Фильтр по силе сигнала. Например, -40 будет включать только Bluetooth-объявления,  
    # у которых сила сигнала больше -40dBm.  
    # Чтобы отключить фильтр, установите ""  
    :local rssiThreshold ""  

    # Введите тему письма в кавычках ""  
    :local emailsubject "Move"  

    # Введите email-адрес в кавычках ""  
    :local emailaddress "mail@domain.com"  

    # Скрипт:  
    ################################## Bluetooth ##################################  
    :local flagStr do={  
       :local str ""  

       :if ($1 & 0x01) do={ :set $str " switch" }  
       :if ($1 & 0x02) do={ :set $str "$str tilt" }  
       :if ($1 & 0x04) do={ :set $str "$str free_fall" }  
       :if ($1 & 0x08) do={ :set $str "$str impact_x" }  
       :if ($1 & 0x10) do={ :set $str "$str impact_y" }  
       :if ($1 & 0x20) do={ :set $str "$str impact_z" }  

       :if ([:len $str] = 0) do={ :return "" }

       :return [:pick $str 1 [:len $str]]
    }  

    :local triggernameF "free_fall"  
    :local triggernameT "tilt"  
    :local triggernameX "impact_x"  
    :local triggernameY "impact_y"  
    :local triggernameZ "impact_z"  
    :local triggernameS "switch"  

    # Поиск свежих Bluetooth-объявлений  
    :global btOldestAdvertisementTimestamp  
    :if ([:typeof $btOldestAdvertisementTimestamp] = "nothing") do={
       # Впервые скрипт запущен после перезагрузки, надо инициализировать  
       # постоянные переменные  
       :set $btOldestAdvertisementTimestamp 0  
    }  
    :local advertisements [/iot bluetooth scanners advertisements print detail \
       as-value where \  
           epoch > $btOldestAdvertisementTimestamp and \  
           address ~ $addressRegex and \  
           data ~ $advertisingDataRegex and \  
           rssi > $rssiThreshold  
    ]  
    :local advCount 0  
    :local lastAdvTimestamp 0  
    :local triggerlist ""  

    :local triggerF  
    :local triggerT  
    :local triggerX  
    :local triggerY  
    :local triggerZ  
    :local triggerS  

    :local messageF ""  
    :local messageT ""  
    :local messageX ""  
    :local messageY ""  
    :local messageZ ""  
    :local messageS ""  

    :local 21st ""  

    :foreach adv in=$advertisements do={  
       :local address ($adv->"address")  
       :local rssi ($adv->"rssi")  
       :local epoch ($adv->"epoch")  
       :local rtime ($adv->"time")  
       :local ad ($adv->"data")  
       :local flags [:tonum "0x$[:pick $ad 40 42]"]
       :local fflags "$[$flagStr $flags]"
       :if ($fflags="") do={:set $fflags "нет — периодически передаваемые данные"}  

       :local obj "# $advCount:  
                                time: $rtime  
                                trigger: $fflags  

    "  
       :set $advCount ($advCount + 1)  
       :set $lastAdvTimestamp $epoch  
       :set $triggerlist "$triggerlist$obj"  

    :set triggerF [:pick $triggerlist ([find $triggerlist "free_fall"]-0) ([find $triggerlist "free_fall"]+9)]
    :if ($triggerF=$triggernameF) do={:set messageF "$triggernameF";:set 21st "not00";}  
    :set triggerT [:pick $triggerlist ([find $triggerlist "tilt"]-0) ([find $triggerlist "tilt"]+1)]
    :if ($triggerT=$triggernameT) do={:set messageT "$triggernameT";:set 21st "not00";}  
    :set triggerX [:pick $triggerlist ([find $triggerlist "impact_x"]-0) ([find $triggerlist "impact_x"]+1)]
    :if ($triggerX=$triggernameX) do={:set messageX "$triggernameX";:set 21st "not00";}  
    :set triggerY [:pick $triggerlist ([find $triggerlist "impact_y"]-0) ([find $triggerlist "impact_y"]+1)]
    :if ($triggerY=$triggernameY) do={:set messageY "$triggernameY";:set 21st "not00";}  
    :set triggerZ [:pick $triggerlist ([find $triggerlist "impact_z"]-0) ([find $triggerlist "impact_z"]+8)]
    :if ($triggerZ=$triggernameZ) do={:set messageZ "$triggernameZ";:set 21st "not00";}  
    :set triggerS [:pick $triggerlist ([find $triggerlist "switch"]-0) ([find $triggerlist "switch"]+6)]
    :if ($triggerS=$triggernameS) do={:set messageS "$triggernameS";:set 21st "not00";}  

    }  
    :if ($advCount > 0) do={  
       :set $btOldestAdvertisementTimestamp $lastAdvTimestamp  
    }  

    :if ($21st="not00") do={/tool e-mail send to=$emailaddress subject="$emailsubject" body="TAG MOVED!"} else={:put "В 21-м октете не обнаружено триггеров!"}
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2026 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры