Jump to content

exared

Forum Members
  • Posts

    4
  • Joined

  • Last visited

Posts posted by exared

  1. Цитата

    Мне с помощью телеграм бота хочется реализовать такого помощника, который всегда под рукой, который помогает решать если не повседневные, то наиболее частые задачи.

    Возможно, одной из интересных возможностей, которую можно добавить в функционал такого помощника, будет система домашней охранной сигнализации.
    Реализация данной функции предполагает подключение (пайку) трех контактов простейшего датчика движения к монтажной плате роутера.
    Соответственно, два контакта датчика должны быть подключены к питающему напряжению роутера, сигнальный контакт - к распаянной на плате функциональной кнопке.

    Скрытый текст

    IMG_20180130_100715.thumb.jpg.d706565d1018f4347800ab86c96b1630.jpgIMG_20180130_102914.thumb.jpg.db30ec8ee14ddf34d81aca52b40db5bf.jpgIMG_20180130_102952.thumb.jpg.57024e0d33964e3cfd3e28d9c03e8e3d.jpgIMG_20180130_103443.thumb.jpg.cd16340c6dbe8a11fbd4d030c63a01ab.jpgIMG_20180710_200533.thumb.jpg.54c5b86570fd0a505bbf0aaf3a5bb978.jpg

    Внимание! При осуществлении указанных здесь действий по аппаратной модернизации роутера вы лишаетесь гарантии на ваше устройство и рискуете вывести его из строя.
    Если у вас нет необходимого навыка, паяльной станции и тестера, то лучше не рисковать работоспособностью устройства.

    При грамотной доработке вашего роутера вы получаете вполне рабочую систему домашней охранной сигнализации, функционал которой включает в себя:

    1. Отправку сообщения о наличии движения в ваше отсутствие в чат/чаты Telegram
    2. Отправку в чат/чаты фотоснимка/серии снимков/видеозаписи интересующего вас участка квартиры после срабатывания датчика (требуется IP камера)
    3. Автоматическое отключение/включение рассылки тревожных сообщений во время присутствия/отсутствия дома вас и ваших близких
    4. Простейший лог тревожных событий

    Установите недостающий пакет:

    opkg install curl

    Обеспечьте жизнеспособность вашего бота в изменчивом мире, следуя рекомендациям из этой темы:

    Создайте на роутере файл /opt/etc/ndm/button.d/buttons.sh
    со следующим содержимым:

    #!/opt/bin/bash
    
    TOKEN='token'
    URL='https://api.telegram.org/bot'$TOKEN
    MSG_URL=$URL'/sendMessage'
    CHATIDA='CHAT_ID_1'; CHATIDB='CHAT_ID_2'
    MACA='00:00:00:00:00:00'; MACB='11:11:11:11:11:11'
    
    grp() {
    res=$(ndmq -x -p "show associations"|grep $1)
    }
    
    smg() {
    res=$(curl --socks5 admin:password@127.0.0.1:63128 -s "$MSG_URL" -d "chat_id=$2" -d "text=$1" -d "parse_mode=markdown" -d "disable_web_page_preview=true") &> /dev/null
    }
    
    if grp $MACA; then exit 0; fi
    if grp $MACB; then exit 0; fi
    
    smg "_Обнаружено движение!_" "$CHATIDA"
    smg "_Обнаружено движение!_" "$CHATIDB"
    
    echo "$(date +"%c") MODET!" >> /opt/var/log/bashbot.log

    Здесь CHAT_ID_1, CHAT_ID_2 - ID чатов, в которые отправляется тревожное сообщение
    MACA, MACB - MAC адреса телефонов, при регистрации которых в домашней беспроводной сети, тревожные сообщения о движении не отправляются.

    Сделайте скрипт исполняемым:

    chmod +x /opt/etc/ndm/button.d/buttons.sh

    Измените в интерфейсе роутера назначение задействованной в проекте кнопки на "OPKG - Запуск скриптов button.d"

    Теперь при нажатии на клавишу роутера или при срабатывании датчика вам и вашим близким придет сообщение в чат Telegram.

    При наличии свободной IP камеры, поддерживающей отправку фотоснимка через SFTP по команде, вы можете реализовать отправку в чат/чаты
    фотоснимка/серии снимков/видеозаписи интересующего вас участка квартиры после срабатывания датчика. Я, например, реализовал эту функцию с помощью программы IP Webcam,
    установленной на старый смартфон с Android на борту. Телефон, расположенный рядом с датчиком, в данном случае играет роль указанной выше IP камеры.
    Конечно, большинство IP камер имеют собственный датчик движения, но приведенное здесь решение все же имеет ряд преимуществ.
    В этом случае в скрипт могут быть добавлены несколько строк. В моем случае, к примеру:

    #!/opt/bin/bash
    
    TOKEN='token'
    URL='https://api.telegram.org/bot'$TOKEN
    MSG_URL=$URL'/sendMessage'
    CHATIDA='CHAT_ID_1'; CHATIDB='CHAT_ID_2'
    MACA='00:00:00:00:00:00'; MACB='11:11:11:11:11:11'; MACD='22:22:22:22:22:22'
    COM_URL='http://user:password@192.168.0.2:8088/photo_save_only.jpg'
    
    grp() {
    res=$(ndmq -x -p "show associations"|grep $1)
    }
    
    smg() {
    res=$(curl --socks5 admin:password@127.0.0.1:63128 -s "$MSG_URL" -d "chat_id=$2" -d "text=$1" -d "parse_mode=markdown" -d "disable_web_page_preview=true") &> /dev/null
    }
    
    if grp $MACA; then exit 0; fi
    if grp $MACB; then exit 0; fi
    
    if grp $MACD; then smg "_Обнаружено движение!_" "$CHATIDA"
    smg "_Обнаружено движение!_" "$CHATIDB"
    /opt/bin/curl -s $COM_URL
    else smg "_Обнаружено движение! Камера оффлайн_" "$CHATIDA"
    smg "_Обнаружено движение! Камера оффлайн_" "$CHATIDB"; fi
    
    echo "$(date +"%c") MODET!" >> /opt/var/log/bashbot.log

    Здесь MACD - MAC адрес телефона с установленной IP Webcam.
    COM_URL - отправляемый для создания снимка HTTP запрос, в котором присутствуют данные для авторизации и IP адрес устройства.
    Отправлять в чат различные графические файлы, полученные по SFTP, можно, к примеру, используя следующую конструкцию в основном скрипте bashbot.sh:

    TOKEN='token''
    URL='https://api.telegram.org/bot'$TOKEN
    PHO_URL=$URL'/sendPhoto'
    CHATIDA='CHAT_ID_1'
    SDIR="/opt/alarm/*"
    
    sph() {
    res=$(curl --socks5 admin:password@127.0.0.1:63128 -s -X POST $PHO_URL -F chat_id=$2 -F photo="@$1") &> /dev/null
    }
    
    slg() {
    res=$(echo "$(date +"%c") $1" >> /opt/var/log/bashbot.log)
    }
    
    for FILE in $SDIR; do filename=$(basename "$FILE"); ext="${filename##*.}"
    case $ext in
    jpg) sph "$FILE" "$CHATIDA"; slg "$ext";;
    png) sph "$FILE" "$CHATIDA"; slg "$ext";;
    gif) sph "$FILE" "$CHATIDA"; slg "$ext";;
    *)
    esac; rm -f $FILE; done
    fi

    Здесь SDIR - папка, в которую складываются полученные по SFTP графические файлы.

    Еще немного дополнив скрипт, можно добавить более точные и сложные условия отключения/включения рассылки тревожных сообщений или управлять этими условиями из чата,
    включать бытовую технику с поддержкой WoL в момент вашего прихода домой, реализовать возможность использования нормально закрытых датчиков на герконах (электропитание им не требуется)
    в дополнение к датчику движения (соответственно, может быть организовано до трех раздельных независимых зон охраны), и многое другое.

    Удачи в ваших проектах!

    • Upvote 3
  2. В 27.06.2016 в 08:30, emlen сказал:

    Доброго дня! А в этом боте можно свои кнопки сделать? Если да, то как?

    Добавьте в скрипт приведенную ниже функцию, предварительно задав новую переменную KMSG_URL:

    KMSG_URL=$URL'/sendMessage'

     

    function send_keyboard {
        local text="$1"; shift 1; local keyboard=init
        OLDIFS=$IFS; IFS=$(echo -en "\"")
        for f in $*;do [ "$f" != " " ] && local keyboard="$keyboard, [\"$f\"]";done
        IFS=$OLDIFS; local keyboard=${keyboard/init, /}
        res=$(curl -s "$KMSG_URL" --header "content-type: multipart/form-data" -F "chat_id=$TARGET" -F "text=$text" -F "reply_markup={\"keyboard\": [$keyboard],\"one_time_keyboard\": false}")
    }
    Скрытый текст

    c87484e3e4258cd7b4bfe58d0f93b829.png


    Аргументы функции: первый - сообщение в чате, последующие - надписи на кнопках. При нажатии на кнопку соответствующая надпись может быть использована как команда. Поэтому кириллица в аргументах функции (кроме первого) нежелательна.
    Поле one_time_keyboard указывает клиенту скрыть или нет клавиатуру после использования (после нажатия на кнопку). Её по-прежнему можно будет открыть через иконку в поле ввода сообщения. По умолчаниюFalse
    Пример использования:

    send_keyboard "I can help you find and share classical music" "Get random music" "Send music to friends"



     

    • Upvote 3
  3. Цитата

    Подскажите как правильно прикрутить - чтоб бот общалься с одни юзером, а остольным, кто пишет ему, отправлял определенное сообщение


    Поздно заметил Ваш вопрос. Все-таки поделюсь.
    В своем проекте использовал следующую простую конструкцию, помещенную в самом конце скрипта:

    [ $USER = $NAMEA ] || send_message "$TARGET" "Sorry. Private bot"
    [ $USER = $NAMEA ] && send_message "$TARGET" "$msg"

    Заменив строку

    send_message "$TARGET" "$msg"
      Переменная NAMEA задается в начале скрипта и хранит значение Вашего username, взятого из Telegram
    • Upvote 1
×
×
  • Create New...