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

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

  1. Egony

    Egony Нерд

    Эти две штуки позволяют старт опенхаба сделать предсказуемым и диагностируемым:

    default.rules (в логе видим, все ли строки отработали, и получаем сообщение в телегу, если не все):
    Код (Javascript):

    //
    var Number  Init_Done = 0

    rule "System started"
    when
        System started
    then
        Init_Done = 0

        logInfo("-----System", "================ OpenHAB: restart begin ==============")

        createTimer(now.plusSeconds(90),
        [|
          if (Init_Done!=1) // если косяк в какой-то строке правила и оно не отработало до конца
          {
            sendTelegram("Bot_Egony", "Warning!!!\nOpenHAB: System init FAILED!!!")
            logInfo("-----System", "==== OpenHAB: Warning!!! Initialisation FAILED !!! ===")
          }

          sendTelegram("Bot_Egony", "OpenHAB: startup complete.\n" + TimeStamp)
          SystemStarted.postUpdate(ON)
          logInfo("-----System", "=============== OpenHAB: startup complete ============")
        ])

        sendTelegram("Bot_Egony", "OpenHAB: System started.\n" + TimeStamp)

        SystemStarted.postUpdate(OFF)

        logInfo("-----System", "--- stage 10 ---")
        ...
        logInfo("-----System", "--- stage 20 ---")
        ...
        logInfo("-----System", "--- stage 30 ---")
        ...
        logInfo("-----System", "--- stage 40 ---")
        ...
        logInfo("-----System", "--- stage 50 ---")
        ...
        logInfo("-----System", "--- stage 60 ---")
        ...
        logInfo("-----System", "---------------- OpenHAB: variables initialised -------")
        Init_Done = 1
    end
     
    /usr/lib/systemd/system/openhab2.service (при старте переименовывает *.rules в *.x и через некоторое время - обратно. Не моя находка. Но избавляет от многих глюков):
    Код (Bash):
    #/usr/lib/systemd/system/openhab2.service
    [Unit]
    Description=openHAB 2 - empowering the smart home
    Documentation=http://docs.openhab.org
    Documentation=https://community.openhab.org
    Wants=network-online.target
    After=network-online.target

    [Service]
    Environment=OPENHAB_HOME=/usr/share/openhab2
    Environment=OPENHAB_CONF=/etc/openhab2
    Environment=OPENHAB_RUNTIME=/usr/share/openhab2/runtime
    Environment=OPENHAB_USERDATA=/var/lib/openhab2
    Environment=OPENHAB_LOGDIR=/var/log/openhab2
    Environment=OPENHAB_STARTMODE=daemon
    EnvironmentFile=-/etc/default/openhab2

    User=openhab
    Group=openhab

    WorkingDirectory=/usr/share/openhab2
    ExecStart=/usr/share/openhab2/runtime/bin/karaf $OPENHAB_STARTMODE
    ExecStop=/usr/share/openhab2/runtime/bin/karaf stop

    ExecStartPre=-/bin/bash -c '/usr/bin/find ${OPENHAB_CONF} -name "*.rules" -exec /usr/bin/rename.ul .rules .x {} \\;'
    ExecStartPost=-/bin/sleep 90
    ExecStartPost=-/bin/bash -c '/usr/bin/find ${OPENHAB_CONF} -name "*.x" -exec /usr/bin/rename.ul .x .rules {} \\;'
    TimeoutStartSec=180
    #was 180

    SuccessExitStatus=0 143
    RestartSec=5
    Restart=on-failure
    TimeoutStopSec=120

    LimitNOFILE=102642

    [Install]
    WantedBy=multi-user.target
     
    И да, лог - наше все. Можно еще так, чтобы лишнее убрать:

    org.ops4j.pax.logging.cfg:
    Код (Javascript):
    # Common pattern layout for appenders
    #log4j2.pattern = %d{ISO8601} | %-5p | %-16t | %-32c{1} | %X{bundle.id} - %X{bundle.name} - %X{bundle.version} | %m%n

    # Root logger
    log4j2.rootLogger.level = WARN
    log4j2.rootLogger.appenderRefs = out, osgi
    log4j2.rootLogger.appenderRef.out.ref = LOGFILE
    log4j2.rootLogger.appenderRef.osgi.ref = OSGI

    # Karaf Shell logger
    log4j2.logger.shell.name = org.apache.karaf.shell.support
    log4j2.logger.shell.level = OFF
    log4j2.logger.shell.appenderRefs = stdout
    log4j2.logger.shell.appenderRef.stdout.ref = STDOUT

    # Security audit logger
    log4j2.logger.audit.name = org.apache.karaf.jaas.modules.audit
    log4j2.logger.audit.level = INFO
    log4j2.logger.audit.additivity = false
    log4j2.logger.audit.appenderRefs = audit
    log4j2.logger.audit.appenderRef.audit.ref = AUDIT

    # openHAB specific logger configuration

    log4j2.logger.openhab.name = org.openhab
    log4j2.logger.openhab.level = INFO

    log4j2.logger.smarthome.name = org.eclipse.smarthome
    log4j2.logger.smarthome.level = INFO

    log4j2.logger.smarthomeItemStateEvent.name = smarthome.event.ItemStateEvent
    log4j2.logger.smarthomeItemStateEvent.level = ERROR
    log4j2.logger.smarthomeItemAddedEvent.name = smarthome.event.ItemAddedEvent
    log4j2.logger.smarthomeItemAddedEvent.level = ERROR
    log4j2.logger.smarthomeItemRemovedEvent.name = smarthome.event.ItemRemovedEvent
    log4j2.logger.smarthomeItemRemovedEvent.level = ERROR
    log4j2.logger.smarthomeThingStatusInfoEvent.name = smarthome.event.ThingStatusInfoEvent
    log4j2.logger.smarthomeThingStatusInfoEvent.level = ERROR
    log4j2.logger.smarthomeThingAddedEvent.name = smarthome.event.ThingAddedEvent
    log4j2.logger.smarthomeThingAddedEvent.level = ERROR
    log4j2.logger.smarthomeThingRemovedEvent.name = smarthome.event.ThingRemovedEvent
    log4j2.logger.smarthomeThingRemovedEvent.level = ERROR
    log4j2.logger.smarthomeInboxUpdatedEvent.name = smarthome.event.InboxUpdatedEvent
    log4j2.logger.smarthomeInboxUpdatedEvent.level = ERROR

    log4j2.logger.events.name = smarthome.event
    log4j2.logger.events.level = INFO
    log4j2.logger.events.additivity = false
    log4j2.logger.events.appenderRefs = event
    log4j2.logger.events.appenderRef.event.ref = EVENT
    log4j2.logger.events.appenderRef.osgi.ref = OSGI

    log4j2.logger.jupnp.name = org.jupnp
    log4j2.logger.jupnp.level = ERROR

    log4j2.logger.jmdns.name = javax.jmdns
    log4j2.logger.jmdns.level = ERROR

    log4j2.logger.paperui.name = org.openhab.ui.paper
    log4j2.logger.paperui.level = WARN
    log4j2.logger.paperuiint.name = org.openhab.ui.paper.internal
    log4j2.logger.paperuiint.level = INFO

    # This suppresses all Maven download issues from the log when doing feature installations
    # as we are logging errors ourselves in a nicer way anyhow.
    log4j2.logger.paxurl.name = org.ops4j.pax.url.mvn.internal.AetherBasedResolver
    log4j2.logger.paxurl.level = ERROR

    # Filters known issues of pax-web (issue link to be added here).
    # Can be removed once the issues are resolved in an upcoming version.
    log4j2.logger.paxweb.name = org.ops4j.pax.web.pax-web-runtime
    log4j2.logger.paxweb.level = OFF

    # Filters known issues of lsp4j, see
    # https://github.com/eclipse/smarthome/issues/4639
    # https://github.com/eclipse/smarthome/issues/4629
    # https://github.com/eclipse/smarthome/issues/4643
    # Can be removed once the issues are resolved in an upcoming version.
    log4j2.logger.lsp4j.name = org.eclipse.lsp4j
    log4j2.logger.lsp4j.level = OFF

    # Filters known issues of KarServiceImpl, see
    # https://github.com/openhab/openhab-distro/issues/519#issuecomment-351944506
    # Can be removed once the issues are resolved in an upcoming version.
    log4j2.logger.karservice.name = org.apache.karaf.kar.internal.KarServiceImpl
    log4j2.logger.karservice.level = ERROR

    # Filters known issues of javax.mail, see
    # https://github.com/openhab/openhab2-addons/issues/5530
    log4j2.logger.javaxmail.name = javax.mail
    log4j2.logger.javaxmail.level = ERROR

    # Appenders configuration

    # Console appender not used by default (see log4j2.rootLogger.appenderRefs)
    log4j2.appender.console.type = Console
    log4j2.appender.console.name = STDOUT
    log4j2.appender.console.layout.type = PatternLayout
    log4j2.appender.console.layout.pattern = %d{HH:mm:ss.SSS} [%-5.5p] [%-36.36c] - %m%n

    # Rolling file appender
    log4j2.appender.out.type = RollingRandomAccessFile
    log4j2.appender.out.name = LOGFILE
    log4j2.appender.out.fileName = ${openhab.logdir}/openhab.log
    log4j2.appender.out.filePattern = ${openhab.logdir}/openhab.log.%i
    log4j2.appender.out.immediateFlush = true
    log4j2.appender.out.append = true
    log4j2.appender.out.layout.type = PatternLayout
    #log4j2.appender.out.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} [%-5.5p] [%-36.36c] - %m%n
    log4j2.appender.out.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} [%-11.11c] - %m%n
    #log4j2.appender.out.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} - %m%n
    log4j2.appender.out.policies.type = Policies
    log4j2.appender.out.policies.size.type = SizeBasedTriggeringPolicy
    log4j2.appender.out.policies.size.size = 5MB

    # Event log appender
    log4j2.appender.event.type = RollingRandomAccessFile
    log4j2.appender.event.name = EVENT
    log4j2.appender.event.fileName = ${openhab.logdir}/events.log
    log4j2.appender.event.filePattern = ${openhab.logdir}/events.log.%i
    log4j2.appender.event.immediateFlush = true
    log4j2.appender.event.append = true
    log4j2.appender.event.layout.type = PatternLayout
    #log4j2.appender.event.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} [%-26.26c] - %m%n
    log4j2.appender.event.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} - %m%n
    log4j2.appender.event.policies.type = Policies
    log4j2.appender.event.policies.size.type = SizeBasedTriggeringPolicy
    log4j2.appender.event.policies.size.size = 5MB

    # Audit file appender
    log4j2.appender.audit.type = RollingRandomAccessFile
    log4j2.appender.audit.name = AUDIT
    log4j2.appender.audit.fileName = ${openhab.logdir}/audit.log
    log4j2.appender.audit.filePattern = ${openhab.logdir}/audit.log.%i
    log4j2.appender.audit.append = true
    log4j2.appender.audit.layout.type = PatternLayout
    log4j2.appender.audit.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} [%-5.5p] [%-36.36c] - %m%n
    log4j2.appender.audit.policies.type = Policies
    log4j2.appender.audit.policies.size.type = SizeBasedTriggeringPolicy
    log4j2.appender.audit.policies.size.size = 8MB

    # OSGi appender
    log4j2.appender.osgi.type = PaxOsgi
    log4j2.appender.osgi.name = OSGI
    log4j2.appender.osgi.filter = *
     
    Сижу на 2.5m3. Все вышеописанные извращения пришлось вводить после перехода на 2.0.
     
    Последнее редактирование: 15 окт 2019
    SergeiL нравится это.
  2. SergeiL

    SergeiL Оракул Модератор

    А телеграмм как работает?
     
  3. ИгорьК

    ИгорьК Гуру

  4. Egony

    Egony Нерд

    Отлично :) Через прокси в Италии, куда заруливается все, что банится ркн.
    В телеге сейчас много движняка - какой смысл ставить всякую мутную херь типа пушовера, если можно юзать мессенджер?

    Домотикс, за который Вы топите, мне не зашел. Ровно как и остальное, что пробовал. Или настройка чисто мышкованием, или без исходников, или платное. Посижу пока на OH - его костыли уже изучены.
     
    Последнее редактирование: 15 окт 2019
  5. ИгорьК

    ИгорьК Гуру

    Забавно.

    Это супер аргумент.
     
  6. SergeiL

    SergeiL Оракул Модератор

    А это зачем?
     
  7. Egony

    Egony Нерд

    Смысл в том, что OH2 иногда (я бы сказал - всегда, но не буду утверждать) за каким-то неизвестным хреном при старте грузит правила дважды, что отлично видно в логе, если использовать логирование в правиле "System Started". И это вызывает разные накладки, сценарий глюкодрома обширен - от ненужного изменения переменных до запуска двух таймеров.

    Вот первоисточник:
    https://community.openhab.org/t/cle...ocess-renaming-rules-windows-possible/38438/9

    Вкус фломастеров - дело каждого :) Пока весь выбор - это выбор какой кактус жрать.
     
    ИгорьК нравится это.
  8. alp69

    alp69 Форумчанин

    К вопросу хранения данных. Закидываю в есп через mqttDash начальные значения показаний счетчиков ГВС и ХВС. Они прописываются в txt файлы, хранящиеся на есп. Далее эти значения обновляется в файлах по мере поступления импульсов счетчика и передаются на брокер. Если есп по какой-то причине рестартует, то после рестарта она считывает значение из txt файла и так же отправляет брокеру.
    Относительно контактов счетчика, замкнутых в момент старта есп решил просто. Если при старте контакты замкнуты - минус 10 литров сразу (один раз).
    Итог. В mqtt сети циркулирует информация не об очередных 10 литрах, прошедших через счетчик, а актуальные показания счетчика, хранящиеся в есп. Всегда есть возможность через mqttDash скорректировать данные, хранящиеся в txt файлах на есп.
    На мой взгляд такое хранение данных более соответствует понятию "умный дом". Ведь если по какой либо причине "грохнется" брокер - будет утрачена вся информация.
     
    ИгорьК нравится это.
  9. alp69

    alp69 Форумчанин

    Давеча решил переустановить Малину. Соответственно, возникла необходимость переустановки OH. Пользуюсь версией 1.8.3, поэтому пошел стандартным путем установки через apt-get. Но не тут то было...
    Стандартные процедуры, лежащие на многих углах Интернета, не прокатывают в связи с тем, что репозиторий, из которого устанавливается ОН 1.8.3 несколько изменился. Соответственно, те команды, которые раньше работали, перестали работать и установка ОН не идет.
    Но проблемка решена:
    Код (Bash):
    ================================================
        Установка OpenHAB 1.8.3:
    ================================================

    wget -qO - 'https://bintray.com/user/downloadSubjectPublicKey?username=openhab' | sudo apt-key add -

    или
    curl 'https://bintray.com/user/downloadSubjectPublicKey?username=openhab' | sudo apt-key add -


    echo "deb [arch=all] https://dl.bintray.com/openhab/apt-repo stable main" | sudo tee /etc/apt/sources.list.d/openhab.list

    sudo apt-get update

    sudo apt-get install openhab-runtime

    ==== Для Debian 8/ Ubuntu 15.x и выше) ==================

    Разовый старт:
    sudo systemctl start openhab.service
    Состояние сервиса:
    sudo systemctl status openhab.service

    Старт при загрузке системы:
    sudo systemctl daemon-reload
    sudo systemctl enable openhab
    ===========================================================


    ==== Для Debian 7 / Ubuntu 14.x и более ранних версий) ====
    Разовый старт:
    sudo /etc/init.d/openhab start
    Состояние сервиса:
    sudo /etc/init.d/openhab status

    Старт при загрузке системы:
    sudo update-rc.d openhab defaults
    ===========================================================
     
    Все как всегда, но принципиальное отличие от того, что ищется поиском в Интернетах, содержится в этой строке:
    Код (Bash):
    echo "deb [arch=all] https://dl.bintray.com/openhab/apt-repo stable main" | sudo tee /etc/apt/sources.list.d/openhab.list
    А именно [arch=all]
    В данной установке биндинги не ставятся. Их ставим отдельно

    Код (Bash):
    wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key
    sudo apt-key add mosquitto-repo.gpg.key

    cd /etc/apt/sources.list.d/

    Для wheezy:
    sudo wget http://repo.mosquitto.org/debian/mosquitto-wheezy.list

    Для jessie:
    sudo wget http://repo.mosquitto.org/debian/mosquitto-jessie.list


    apt-get update

    apt-cache search mosquitto

    или

    apt-get install mosquitto

    ================================================
    Если в ответ на вводимую команду:
    mosquitto_sub -d -t /myhome/#

    получаете:
    -bash: mosquitto_sub: команда не найдена

    выполните следующие команды:

    apt-get purge mosquitto mosquitto-clients

    apt-get autoremove

    apt-get install mosquitto mosquitto-clients
     
    Код (Bash):
    sudo apt-get install oracle-java8-jdk
    P.S. Игорь, если можно - закрепите в шапке. Чтобы потом легче искать было.
     
    Последнее редактирование: 24 ноя 2019
    SergeiL и ИгорьК нравится это.
  10. ИгорьК

    ИгорьК Гуру

    #62.
     
    alp69 нравится это.
  11. SergeiL

    SergeiL Оракул Модератор

    Какая версия Java установилась?
    Что показывает:
    Код (Bash):
    java -version
     
  12. alp69

    alp69 Форумчанин

    Код (Bash):
    java version "1.8.0_65"
    Java(TM) SE Runtime Environment (build 1.8.0_65-b17)
    Java HotSpot(TM) Client VM (build 25.65-b01, mixed mode)
    Сейчас вроде бы _201 в почете, но для 1.8.3 вроде бы этой достаточно.
     
  13. SergeiL

    SergeiL Оракул Модератор

    Ну да, тогда эта шла.
    На первом у меня 132 стоит.
    Код (Bash):
    pi@raspberrypi ~ $ java -version
    java version "1.8.0"
    Java(TM) SE Runtime Environment (build 1.8.0-b132)
    Java HotSpot(TM) Client VM (build 25.0-b70, mixed mode)
     
    А OH2 ставил через образ openhabian.
    Там
    Код (C++):
    [21:03:38] openhabian@openHABianPi:~$ java -version
    openjdk version "1.8.0_222"
    OpenJDK Runtime Environment (Zulu8.40.0.178-CA-linux_aarch32hf) (build 1.8.0_222-b178)
    OpenJDK Client VM (Zulu8.40.0.178-CA-linux_aarch32hf) (build 25.222-b178, mixed mode, Evaluation)
     
    На первом не помню почему искал обновление, на втором част биндингов не работает со старой Java.
     
  14. alp69

    alp69 Форумчанин

    Попробовал ОН2. Не понравилось. Почему то жутко тормозил (ОН). Да и настройки мудреные. Все эти channel, things... Не смог себя убедить в необходимости переезда. Хотя честно пытался.:D
     
  15. SergeiL

    SergeiL Оракул Модератор

    У меня первый (RPI2B) и второй(RPI3) параллельно работают. Москито на первом, второй через него работает.
    Основное все сидит на первом, на втором HomeKit и iCloud биндинг.
    Разницы почти нет никакой, это с первым. Все также настраивается через конфигурационные файлы.
    Давно думаю, что нужно на второй переехать, но все работает и работает на первом. Нет вроде причин трогать.
    Устройства все добавляются, нагрузка в норме, все отрабатывает на все 100%. Нет повода трогать. :)
     
    Egony и alp69 нравится это.
  16. SergeiL

    SergeiL Оракул Модератор

    Тогда почитал, задумался... Забыл.
    Но сейчас снова увидел, а ведь я же тоже перевел все на UniFi.
    И все нормально работает!
    Забыл про проблемы Wi-Fi!
     
  17. alp69

    alp69 Форумчанин

    Какова дальнобойность? Через сколько стен по горизонтали стреляет? По вертикали сколько этажей?
     
  18. SergeiL

    SergeiL Оракул Модератор

    Дело даже не в дальнобойности. Дома самые маленькие стоят (UniFi AC Lite AP), на работе Pro.
    Главное, что они поддерживают так называемый "бесшовный роуминг".
    Раньше как было: перешел из комнаты в комнату, уже ближе более мощная точка, а телефон не перескакивает.
    При этом сигнал слабый, даже страницы не открываются. Выключаешь WiFi, включаешь снова - полный сигнал и все летает.
    А с Unifi можно разговаривать по IP и переходить из комнаты в комнату, без разрывов.
    Видно как сигнал уменьшается, а потом резко увеличивается.
    И модули на ESP не переподключаются больше.
    Если нужно дальнобойные - есть UniFi AP AC LR (long range). Но дома я их не стал бы ставить.
    До Unifi, на ноуте, где можно, на проводе сидел. После установки Unifi, провод больше не подключал.
     
  19. ИгорьК

    ИгорьК Гуру

    Сейчас все более менее приличные железки это обеспечивают.
    Поэтому, поменяв какой-то старый роутер на практически любой новый вы эту фичу получаете.

    А вот фокус с заменой двух асусов на один Keenetic ultra - это круче. Теперь хватает одного роутера на всю квартиру.
     
  20. alp69

    alp69 Форумчанин

    На Хабре вычитал такое:
    Это относительно VoIP.
    Правда статья 2011 года. Не знаю, насколько эта инфа актуальна. Статья гуглится запросом по ключевому слову "Unifi" и вываливается в первой пятерке результатов поиска.
    А так, в целом заинтересовался я их линейкой. :)