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

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

  1. alp69

    alp69 Форумчанин

    Если скачивать непосредственно из репозитория, то при запуске под WinXP (SP3) вываливается ошибка: Ошибка.JPG
    Но если скачать весь раздел кнопкой Download ZIP, то все работает.
     
    ИгорьК нравится это.
  2. alp69

    alp69 Форумчанин

    Вниманию тех, кому требуется контролировать питание модуля ESP с прошивкой NodeMCU!
    Во время экспериментов с контролем питания, ввод команды node.readvdd33() вызывал ошибку. После непродолжительных поисков на оффсайте выяснил, что команды node.readvdd33() больше нет. Она "переехала" в модуль adc.
    Теперь она звучит так:
    adc.readvdd33()
    Не забывайте включать модуль adc в прошивку, если захотите использовать эту команду.

    Сразу поделить на 1000 не получилось. Поэтому подставил костыль:
    Код (C++):
    v = adc.readvdd33()
    vv = v / 1000
    И через mqtt публиковал уже "vv".
     
    Последнее редактирование: 1 фев 2016
    ИгорьК нравится это.
  3. DimNsk

    DimNsk Нерд

    Теперь и в Arduino IDE for ESP8266

     
  4. ИгорьК

    ИгорьК Оракул Модератор

    Опс... Уж не помню где, меня убеждали что даже RC-switch в Ардуино IDE работает, а тут всего analogRead(A0).
    Вообще, я ужасно рад что заставил себя заняться NodeMCU и этим безумным скриптовым языком Lua. Обратно в Ардуино IDE ничуть не хочется.
     
    Последнее редактирование: 1 фев 2016
  5. DimNsk

    DimNsk Нерд

    А что с ним не так? Работал и работает. Сам проверял еще в сентябре октябре когда еще не было 2 версии Arduino IDE for ESP8266
     
  6. ИгорьК

    ИгорьК Оракул Модератор

    Странно, RC-Switch работает, а analogRead - только что. Да это просто мысль в слух.
     
  7. DimNsk

    DimNsk Нерд

    AnalogRead работал, но не было обработки VCC
     
  8. Securbond

    Securbond Гуру

    Всем добра...
    Не получается запустить OpenHab на малине как сервис. Вроде все по инструкции сделал но
    service openhab start
    service openhab stop
    service openhab restart
    это не работает....
    OpenHab запускается только вручную (sudo ./start.sh) и работает только пока открыт putty.
    Стоит закрыть соединение и страница сервера больше не грузится.
    Подскажите в чем может быть косяк? .
     
  9. DimNsk

    DimNsk Нерд

    ИгорьК нравится это.
  10. ИгорьК

    ИгорьК Оракул Модератор

    Слон здесь: "Чтобы запускать Openhab демоном, нужно..."
     
  11. Securbond

    Securbond Гуру

    Так и делал вот мой файл openhab который лежит в папке /etc/init.d/
    Код (C++):
    #! /bin/sh
    ### BEGIN INIT INFO
    #Provides:          openhab
    #Required-Start:    $remote_fs $syslog
    #Required-Stop:     $remote_fs $syslog
    #Default-Start:     2 3 4 5
    #Default-Stop:      0 1 6
    #Short-Description: OpenHAB Daemon
    ### END INIT INFO

    # Author: Thomas Brettinger

    # Do NOT "set -e"

    # PATH should only include /usr/* if it runs after the mountnfs.sh script
    PATH=/sbin:/usr/sbin:/bin:/usr/bin

    DESC="Open Home Automation Bus Daemon"
    NAME=openhab
    DAEMON=/usr/bin/java
    PIDFILE=/var/run/$NAME.pid
    SCRIPTNAME=/etc/init.d/$NAME
    ECLIPSEHOME="/opt/openhab";
    HTTPPORT=8080
    HTTPSPORT=8443
    TELNETPORT=5555
    # be sure you are adopting the user to your local OH user
    RUN_AS=pi

    # get path to equinox jar inside $eclipsehome folder
    cp=$(find $ECLIPSEHOME/server -name "org.eclipse.equinox.launcher_*.jar" | sort | tail -1);

    DAEMON_ARGS="-Dosgi.clean=true -Declipse.ignoreApp=true -Dosgi.noShutdown=true -Djetty.port=$HTTPPORT -Djetty.port.ssl=$HTTPSPORT -Djetty.home=$ECLIPSEHOME -Dlogback.configurationFile=$ECLIPSEHOME/configurations/logback.xml -Dfelix.fileinstall.dir=$ECLIPSEHOME/addons -Djava.library.path=$ECLIPSEHOME/lib -Djava.security.auth.login.config=$ECLIPSEHOME/etc/login.conf -Dorg.quartz.properties=$ECLIPSEHOME/etc/quartz.properties -Djava.awt.headless=true -jar $cp -console ${TELNETPORT}"

    # Exit if the package is not installed
    [ -x "$DAEMON" ] || exit 0

    # Read configuration variable file if it is present
    [ -r /etc/default/$NAME ] && . /etc/default/$NAME

    # Load the VERBOSE setting and other rcS variables
    . /lib/init/vars.sh

    # Define LSB log_* functions.
    # Depend on lsb-base (>= 3.2-14) to ensure that this file is present
    # and status_of_proc is working.
    . /lib/lsb/init-functions

    #
    # Function that starts the daemon/service
    #
    do_start()
    {
        # Return
        #   0 if daemon has been started
        #   1 if daemon was already running
        #   2 if daemon could not be started
        start-stop-daemon --start --quiet --make-pidfile --pidfile $PIDFILE --chuid $RUN_AS --chdir $ECLIPSEHOME --exec $DAEMON --test > /dev/null \
            || return 1
        start-stop-daemon --start --quiet --background --make-pidfile --pidfile $PIDFILE --chuid $RUN_AS --chdir $ECLIPSEHOME --exec $DAEMON -- $DAEMON_ARGS \
            || return 2
        # Add code here, if necessary, that waits for the process to be ready
        # to handle requests from services started subsequently which depend
        # on this one.  As a last resort, sleep for some time.
        return 0
    }

    #
    # Function that stops the daemon/service
    #
    do_stop()
    {
        # Return
        #   0 if daemon has been stopped
        #   1 if daemon was already stopped
        #   2 if daemon could not be stopped
        #   other if a failure occurred
        start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
        RETVAL="$?"
        [ "$RETVAL" = 2 ] && return 2
        # Wait for children to finish too if this is a daemon that forks
        # and if the daemon is only ever run from this initscript.
        # If the above conditions are not satisfied then add some other code
        # that waits for the process to drop all resources that could be
        # needed by services started subsequently.  A last resort is to
        # sleep for some time.
        start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
        [ "$?" = 2 ] && return 2
        # Many daemons don't delete their pidfiles when they exit.
        rm -f $PIDFILE
        return "$RETVAL"
    }

    #
    # Function that sends a SIGHUP to the daemon/service
    #
    do_reload() {
        #
        # If the daemon can reload its configuration without
        # restarting (for example, when it is sent a SIGHUP),
        # then implement that here.
        #
        do_stop
        sleep 1
        do_start
        return 0
    }

    case "$1" in
      start)
        log_daemon_msg "Starting $DESC"
        do_start
        case "$?" in
            0|1) log_end_msg 0 ;;
            2) log_end_msg 1 ;;
        esac
        ;;
      stop)
        log_daemon_msg "Stopping $DESC"
        do_stop
        case "$?" in
            0|1) log_end_msg 0 ;;
            2) log_end_msg 1 ;;
        esac
        ;;
      status)
           status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
           ;;
      #reload|force-reload)
        #
        # If do_reload() is not implemented then leave this commented out
        # and leave 'force-reload' as an alias for 'restart'.
        #
        #log_daemon_msg "Reloading $DESC" "$NAME"
        #do_reload
        #log_end_msg $?
        #;;
      restart|force-reload)
        #
        # If the "reload" option is implemented then remove the
        # 'force-reload' alias
        #
        log_daemon_msg "Restarting $DESC"
        do_stop
        case "$?" in
          0|1)
            do_start
            case "$?" in
                0) log_end_msg 0 ;;
                1) log_end_msg 1 ;; # Old process is still running
                *) log_end_msg 1 ;; # Failed to start
            esac
            ;;
          *)
              # Failed to stop
            log_end_msg 1
            ;;
        esac
        ;;
      *)
        #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
        echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
        exit 3
        ;;
    esac
    :
    но не запускается.
     
  12. Securbond

    Securbond Гуру

  13. Securbond

    Securbond Гуру

    И еще вопрос Мой ESP передает данные в таком виде mqtt.JPG mqttSpy.JPG

    Я подписался на все топики mosquitto_sub -d -t /ESP00035E2A/#
    и теперь не совсем понимаю как прописать привязку ?
    Вот так не работает: <[mosquitto:/ESP00035E2A/sensors/dsw1/state:state:default]
     
  14. ИгорьК

    ИгорьК Оракул Модератор

    Неееетттт.... :) Тест на внимательность! Там все пробелы надо во всех строках убрать. Внимательнее.
     
    Последнее редактирование: 3 фев 2016
  15. DimNsk

    DimNsk Нерд

    вот так попробуйте
    Код (Java):
    <[mosquitto:/ESP00035E2A/sensors/dsw1:state:default]
     
    ИгорьК нравится это.
  16. Securbond

    Securbond Гуру

    esp111.JPG
    Так то же пробовал ... не работает
     
  17. Securbond

    Securbond Гуру

    вот файл уже и не знаю какие там могут быть пробелы
     

    Вложения:

    • openhab.txt
      Размер файла:
      4,4 КБ
      Просмотров:
      595
  18. ИгорьК

    ИгорьК Оракул Модератор

    20. DS18b20 + ESP8266 на батарейках.
    0. Вооружаемся паяльником
    , исправляем недостатки ESP8266, касающиеся функции node.deepsleep():
    connect.jpg
    Номер ноль - потому что не выполнив этого пункта, цена всей остальной работе и будет ноль.
    1. Собираем пакет в такой конструкции:

    screen1.jpg
    2. Заливаем вот такой скрипт:
    Код (Lua):
    pin = 4 -- сюда вешаем датчик
    Broker="www.ВАШ_САЙТ.com"
    port=1883
    myClient="tempMuvSleep01"
    iogin=myClient
    pass="passWord"
    m = mqtt.Client( myClient, 120, login, pass)

    sleepdelay = 600 -- в секундах, сколько спать датчику между умываниями (10 минут.)
    killdelay = 20 -- в секундах, сколько времени устройство будет неуспешно
    -- пытаться передать информацию, пока его не отправят спать принудительно
    -- например, сети нет

    function publish_data(t)
       if t ~= 85 then
            m:publish("/myhome/"..myClient.."/state",t,0,0, function(conn)
               print("Temp "..t.." published!")
               tmr.alarm(1, 1000, 0, function()
                    local bat = (adc.readvdd33()/1000)
                    m:publish("/myhome/"..myClient.."/bat",bat,0,0, function(conn)
                    print("Bat "..bat.." published!")
                    disconnect()
                    end)
                end)
            end)
        else
            m:publish("/lwt/",""..myClient.." bad DS18b20",0,0,function(conn)
                print("Bad published!")
                disconnect()
            end)
        end
    end

    function run_main_prog()
        print("Main  program starts!")
        local t = 85
        t = getTemp()
        print("Get t: "..t)
        publish_data(t)
    end

    function getTemp()
        local t = 85
        local ds18b20 = require('ds18b20')
        ds18b20.setup(pin)
        local addres={}
        addres=ds18b20.addrs()
        if addres[1] ~= nil then
            t = ds18b20.read(addres[1])
        end
        print('t= '..t)
        ds18b20 = nil
        collectgarbage()
        return t
    end

    function disconnect()
        tmr.alarm(3, 3000, 0, function()
            print("Sleep now!")
            node.dsleep(1000000*sleepdelay,0)
        end)
    end

    tmr.alarm(5, 1000*killdelay, 0, function() disconnect() end)
    getTemp() -- первый раз меряем температуру. Помним зачем? Отправлять будем второе измерение температуры
    tmr.alarm(0, 1000, 1, function()
         print("wifi.sta.status = "..wifi.sta.status())
         if wifi.sta.status() == 5 and wifi.sta.getip() ~= nil then
             tmr.stop(0)
             m:connect(Broker, port, 0, function(conn)
                 print("Mqtt Connected to: " .. Broker)
                  run_main_prog()
             end)
         end
    end)
     
    Готовое устройство. Батарейный блок находится внутри. Положил чтобы был виден размер.
    20160207_195914-1.jpg

    Второй вариант. Без пояснений.

    Код (Lua):
    pin = 4
    Broker="ВАШСАЙТ"
    port=ВАШПОРТ
    myClient="tempMuvSleep01"
    iogin=myClient
    pass="pass"
    m = mqtt.Client( myClient, 120, login, pass)
    sleepdelay = 1800
    killdelay = 20
    function publish_data()
    local t = 85
    t = getTemp()
    if t ~= 85 then
    m:publish("/myhome/"..myClient.."/state",t,0,0, function(conn)
    tmr.alarm(1, 500, 0, function()
    local bat = (adc.readvdd33()/1000)
    m:publish("/myhome/"..myClient.."/bat",bat,0,0, function(conn)
    disconnect()
    end)
    end)
    end)
    else
    m:publish("/lwt/",""..myClient.." bad DS18b20",0,0,function(conn)
    disconnect()
    end)
    end
    end
    function getTemp()
    local t = 85
    local ds18b20 = require('ds18b20')
    ds18b20.setup(pin)
    local addres={}
    addres=ds18b20.addrs()
    if addres[1] ~= nil then
    t = ds18b20.read(addres[1])
    end
    return t
    end
    function disconnect()
    tmr.alarm(3, 500, 0, function()
    node.dsleep(1000000*sleepdelay,0)
    end)
    end
    rtctime.set(1)
    tmr.alarm(5, 1000*killdelay, 0, function() disconnect() end)
    getTemp()
    tmr.alarm(0, 1000, 1, function()
    if wifi.sta.status() == 5 and wifi.sta.getip() ~= nil then
    tmr.stop(0)
    m:connect(Broker, port, 0, function(conn)
    publish_data()
    end)
    end
    end)
     
    Библиотека DS18b20 - здесь.


    Следующая заметка.
     
    Последнее редактирование: 25 фев 2018
  19. ИгорьК

    ИгорьК Оракул Модератор

    В первой и второй строке после первого знака.
     
  20. DimNsk

    DimNsk Нерд

    имя сервера MQTT = mosquitto ?