Arduino, ESP8266, Raspberry Pi 2 && OpenHab. Умный дом: азы управления.

Тема в разделе "Глядите, что я сделал", создана пользователем ИгорьК, 12 май 2015.

  1. ИгорьК

    ИгорьК Давно здесь

  2. МиШ

    МиШ Нуб

    Проблем в связке нету так как я с этого же модуля вывожу параметры температуры в openhab.
    Openhab2.jpg
    Openhab3.jpg
     
    Последнее редактирование: 21 сен 2018
  3. SergeiL

    SergeiL Гуру

    Вот если бы Вы проверили как я Вам написал:
    наверное увидели бы в чем проблема.

    Ваша ESP посылает 1 или 0.
    А OH ждет "ON" или "OFF"
     
  4. МиШ

    МиШ Нуб

    Mosquitto с паролем еще все это стоит на debian поэтому есть проблемки.
     
  5. МиШ

    МиШ Нуб

    ESPшка шлет логический уровень на порту.
     
  6. ИгорьК

    ИгорьК Давно здесь

    А нужно ON и OFF.
    Помнится, в ОН есть решение с названием transform и применением файлов с расширением map.

    Покурите сайт ОН по этим ключевым словам.
    А если хватит отваги - и в этой теме поищите решение, помнится оно здесь есть.
     
    Последнее редактирование: 21 сен 2018
  7. SergeiL

    SergeiL Гуру

    Код (Text):
    Switch office_panel "Panel" <heating> (grpOffice) {mqtt=">[mosquitto:office/switch1/command:command:ON:1],>[mosquitto:office/switch1/command:command:OFF:0],<[mosquitto:office/switch1/state:state:MAP(onoff.map)]"
    transform/onoff.map:

    0=OFF
    1=ON
     
  8. SergeiL

    SergeiL Гуру

    В связи с сегодняшним вопросом, на сайте community.openhab.org случайно наткнулся на очень интересный момент, который раньше не знал.
    Всегда удивляло, что при переключении выключателя в OH автоматически изменялся статус выключателя.

    Как выясняется это можно отключить.
    проверил разницу между этими двумя item ( autoupdate="false")
    Код (Text):
    Switch    Light_FF_Corridor2_Full            "Коридор 2 Полный"        (FF_Corridor1,Lights_R9)     { mqtt=">[mosquitto:/mh/r9/ESP_0C0503/P2:command:*:default],<[mosquitto:/mh/r9/ESP_0C0503/P21:state:default]"}
    Switch    Light_FF_Corridor2_Half            "Коридор 2 Ночной"        (FF_Corridor1,Lights_R9)     { mqtt=">[mosquitto:/mh/r9/ESP_0C0503/P1:command:*:default],<[mosquitto:/mh/r9/ESP_0C0503/P11:state:default]", autoupdate="false"}
     
    switch.png

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

    Но в ОН и в устройстве нужно делать два разных топика на управление устройством и получении его статуса.
    { mqtt=">[mosquitto:/mh/r9/ESP_0C0503/P1:command:*:default],<[mosquitto:/mh/r9/ESP_0C0503/P11:state:default]
    В принципе - это правильно!
     
    Egony нравится это.
  9. МиШ

    МиШ Нуб

    Благодарю. Все заработало после не которых правок и установки аддона Map Transformation. Иконки пока не удалось оптимальные подобрать. Openhab4.jpg
     
  10. SergeiL

    SergeiL Гуру

    Подправил прошивки на ESP-шках, теперь нормально работает отображение прохождения команды на устройство.

    В OH выключатель шлет команду по MQTT, статус в OH не меняется.
    ESP получает команду, переключает реле, отсылается новый статус по MQTT.
    ОН получает статус и сразу меняет его в выключателе, а если выключатель в другом состоянии, то и выключатель.

    В общем теперь видно, что сработало устройство, а не в OH переключился выключатель.

    С 2015-го использую OH и не знал про эту фишку, делал дополнительный айтемы с лампочкой, для ответственных выключателей. Полезно читать комьюнити!!! :)
     
    Egony и ИгорьК нравится это.
  11. svetozar161

    svetozar161 Нуб

    Здравствуйте. Подскажите пожалуйста такой момент по работе с mqtt, нигде про это не нашел. Дано: брокер москито на дом.сервере, датчик температуры, ардуина. Датчик публикует топик на брокере
    ардуина подписывается на датчик и получает в порту температуру.
    Я ее вижу и она динамически меняется. Задача создать простой термостат. Что нужно делать с данными в сериале ардуина? Я так понимаю это просто тупо строка? Ее нужно парсить, создавать float и дальше писать в цикл термостата? Если это верно, можно ли привести пример парсинга. Спасибо.
     
  12. SergeiL

    SergeiL Гуру

    Вчера в этой теме обсуждали как сделать оповещалку о подборе пароля, вопрос больше относится к OpenHAB и nginx, поэтому перейду сюда.

    В двух словах: доступ из интернета проброшен на WEB страницу OH через аутентификацию nginx.
    Все работает прекрасно, но хочется быть уверенным, что "кто-то" не нашел Вашу ВЕБ страницу (пускай она и на нестандартных портах) и не пытается подбирать пароли.
    Можно конечно периодически смотреть логи nginx, но как всегда про это забывается.

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

    Задача: Проверять периодически файл ошибок /var/log/nginx/error.log, если в нем появляется новая строка включающая "/etc/nginx/.htpasswd" то считать эти строки.
    По завершению записывать в файл (определено в начале скрипта, у меня /opt/not/counter) номер строки, на которой остановился. В дальнейшем начинать проверять файл начиная с этой строки.
    Файл /var/log/nginx/error.log периодически закрывается, если количество строк в файле стало меньше последней запомненной строки - начинать сначала.
    Если количество новых, с последней проверки, строк с ошибкой пароля превышает установленное значение - посылаем уведомление через командную строку.

    У меня это Growl, каждый сможет поставить свое (хоть e-mail )

    Вызов скрипта запихиваем в cron, я поставил период проверки 1 час, порог более 3-х ошибок.
    Код (Bash):

    #!/bin/bash

    souce_file=/var/log/nginx/error.log
    counter_folder=/opt/not
    counter_file=/opt/not/counter
    dest_file=/opt/not/errors.log
    err_msg=/etc/nginx/.htpasswd

    let err_threshold=3

    if [[ -e  $souce_file ]] # если есть лог файл
    then
     
       if [[ !(-d  $counter_folder) ]]  # если не существует каталог
       then
         mkdir $counter_folder  # создадим каталог
       fi

       if [[ -e  $counter_file ]]  # проверим есть ли файл счетчика обработанных строк
       then
         let cnt_old="`cat $counter_file`"  
       else
         let cnt_old=0     # обнулим переменную
       fi

       let cnt_cur="`wc -l "$souce_file" | sed 's/[^0-9]//g'`"  # проверим сколько строк в лог файле

       echo "Numb prev = $cnt_old"          # выведем на экран загруженное значение строк
       echo "Numb cur  = $cnt_cur"          # выведем на текущее значение строк лог файла


       if [[ $cnt_cur -lt  $cnt_old ]]  # если сейчас строк меньше
       then
         echo "New log"            # считаем, что новый лог файл - работаем с 0
         let cnt_old=0
       else
         echo "Check log"          # файл старый, проверим его.
       fi

       let cnt_old+=1              # начем с новой непроверенной строки.

       sed -n $cnt_old',$p' "$souce_file" | grep "$err_msg" > "$dest_file"  # найдем все вхождения нужной фразы, начиная со следующей необработанной строки и эти строки отправим в файл назначения
       echo $cnt_cur > $counter_file            # запишем текущее количество в файле назначения

       let cnt_err="`wc -l "$dest_file" | sed 's/[^0-9]//g'`"      # проверим сколько строк в файле назначения

       echo "Numb New Error = $cnt_err"          #  выведем значение на экран для отладки

       if [[ $err_threshold  -lt  $cnt_err ]]          # Если значение больлше порогового
       then
         echo "More threshold ($cnt_err)"  # Выведем уведомление
         /usr/bin/python /opt/growl.py 192.168.1.93 "NGINX" "The maximum number of wrong password attempts ($cnt_err) exceeded"
       else
         echo "Less threshold"
       fi
    else
       echo "Error.log is absent"             # ошибка - нет лог файла.
    fi

     
    Вроде все корректно работает, лишние "echo" можно убрать, оставил для отладки.
    Блин, просидел с ним пол вечера, ничего уже не вспомнить, да и тогда когда, я с этим последний раз сталкивался, Bash-а еще не было.
     
    alp69, Egony и ИгорьК нравится это.
  13. Здравствуйте, господа.
    Для начала хотелось бы выразить благодарность всем, кто активно участвует в данной теме. Именно благодаря данной теме, многое получилось. Заныривал сюда, как в путеводитель.

    Однако, не все гладко. Появилась проблема, надеюсь, удастся найти решение:
    Были и есть работающие датчики температуры, влажности и давления. Вывод данных оформлен на OpenHab2. Сразу взялся за него, как за наиболее свежую версию. Передача данных идет по MQTT. Все работает больше полугода без сбоев. OH2 крутится на Малинке 3. Датчики висят на ESP8266. Попытался добавить новый датчик для одной из комнат. Скопировал Items от другого датчика, т.к. суть та же. Все файлы для OH2 подправил. Но, данные от датчика не приходят. Вернее так, данные идут, их я могу видеть в приложении для Chrome - MQTTLens, но отображения данных на странице OH2 нет. Однако, есть интересный момент. Если отправить малинку в Reboot, то после загрузки несколько первых данных успевают проскакивать. И потом обновление данных прекращается. Все это происходит только для вновь добавленного датчика. С остальными проблем нет-данные как шли, так и идут.
    Я уже MQTT сносил и ставил заново. Уже была проблема, что данные со всех датчиков не обновляются. Снес MQTT еще раз и снова установил. В итоге, со всех датчиков на странице OH2 данные есть, с нового данных нет. Но в вещаемом топике значения также обновляются.

    Куда копать?
     
  14. SergeiL

    SergeiL Гуру

    Проверить имя нового устройства в MQTT, оно должно быть уникальным, проверить, имя топиков.
    У меня много датчиков по mqtt сливают данные, проблем с количеством не было,
    Где то ошибка со скопированными данными.
    Как когда-то говорил мой начальник, хороший редактор, позволяющий копировать блоками - зло!
     
    Алексей В. нравится это.
  15. Подскажите с какой целью посылать уведомления? Чем не устраивает конфигурация error_log с syslog-ом? Отправляли бы в syslog на тот 192.168.1.93 что в скрипте, а там и анализировали.
     
  16. SergeiL

    SergeiL Гуру

    Мне кажется Вы не правильно понимаете о чем речь.
    Уведомления о появлении в файле строк о неправильном вводе пароля.
    Если появляется более 5 строк в час - есть повод задуматься :).
    Кто то вводит неправильный пароль.
     
    Последнее редактирование: 31 окт 2018
  17. Я точно не понимаю, зачем парсить лог nginx-а на малине, а не парсить его-же там куда должно отправляться уведомление.
    Поясню немножко, я использую различного рода оборудование, wifi-роутеры, модули esp8266, одноплатные компьютеры, объеденное в несколько сетей (по количеству wifi-роутеров). Есть в этом зоопарке один ПК с несколькими сетевыми интерфейсами, он работает в основном медиа сервером, чтоб не скучал логи со всех сетей на него заворачиваю.
    Если Вы используете wifi-роутер и в логах роутера видите, как кто-то пытается подобрать пароль к точке доступа.
    Логи отправлять на удаленный сервер по непонятным причинам не будете, а станете анализировать логи на роутере и отправлять уведомления?
     
    Последнее редактирование: 1 ноя 2018
  18. SergeiL

    SergeiL Гуру

    А что малина перегружена? Или это не ПК? Пускай парсит и уведомляет! :)
    Предложенный мной вариант прекрасно работает и меня полностью устраивает.
    Причем мне он кажется проще и надежней Вашей идеи, так как малина выполняет парсинг сама.
    Предложите свой варант, не на словах, как это может быть, а в коде - обсудим ;)
     
  19. Я понял, иными словами, просто это Вам так удобно.
    Несмотря на то, что логирование критических ошибок различными устройствами может выполняться на удаленном сервере, нет доверия к использованию системного лога, надежнее отправлять уведомления.
     
  20. SergeiL

    SergeiL Гуру

    А что такое удаленный сервер? Он обязательно должен быть?
    С адресом 192.168.1.93 - машинка на Атоме без вентиляторов с Win10 c Growl в том числе.
    А уведомление мгновенно приходит на телефон.
     
    Последнее редактирование: 1 ноя 2018