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

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

  1. AlexU

    AlexU Гуру

    Полной уверенности нет, но подозреваю, что скрипт перезапуска openhab запускается как дочерний процесс самого openhab. И когда он (openhab) останавливается, то останавливаются все дочерние процессы, включая скрипт перезапуска. Поэтому и не происходит запуск сервиса. Попробуйте отделить (detach) процесс, отвечающий за перезапуск от родительского процесса.
    Если память не изменяет, то делается так:
    Код (Bash):
    nohup service openhab restart &
    UPD: можно ещё и вывод перенаправить "в пустоту":
    Код (Bash):
    nohup service openhab restart >/dev/null 2>&1 &
     
    Smerlin и ИгорьК нравится это.
  2. Smerlin

    Smerlin Нерд

    И это сработало. благодарю!
     
  3. dimm71

    dimm71 Нерд

    Никак не могу победить управление двумя ногами. Программист из меня тот ещё :)
    Добавил код управления второй ногой - первая вываливается с ошибкой. Удаляю вторую - первая начинает нормально работать.
    Весь код пока не буду вставлять. Вот кусочек.
    Здесь подписка на топик
    Код (C++):
    m:subscribe({["/demo/lamp01/command"]=0,["/demo/lamp02/command"]=0}, function(conn)
    Вот код двух кнопок
    Код (C++):
    m:on("message", function(conn, topic, data)
      print("Recieved:" .. topic .. ":" .. data)
    if (data=="ON1") then
      print("Enabling LED")
      gpio.write(4,gpio.LOW)
      m:publish("/demo/lamp01/state","ON1",0,0)
      elseif (data=="OFF1") then
      print("Disabling LED")
      gpio.write(4,gpio.HIGH)
      m:publish("/demo/lamp01/state","OFF1",0,0)
      else
      print("Invalid - Ignoring")
      end
    collectgarbage()
    end)

    m:on("message", function(conn, topic, data)
      print("Recieved:" .. topic .. ":" .. data)
    if (data=="ON2") then
      print("Enabling LED")
      gpio.write(3,gpio.LOW)
      m:publish("/demo/lamp02/state","ON2",0,0)
      elseif (data=="OFF2") then
      print("Disabling LED")
      gpio.write(3,gpio.HIGH)
      m:publish("/demo/lamp02/state","OFF2",0,0)
      else
      print("Invalid - Ignoring")
      end
    collectgarbage()
    end)
    Вот так в item
    Код (C++):
    Switch<>lamp1<->"Моя лампа"<--->(ESPSwitch)<--->{ mqtt=">[mosquitto:/demo/lamp01/command:command:on:ON1],>[mosquitto:/demo/lamp01/command:command:off:OFF1],<[mosquitto:/demo/lamp01/state:state:default]" }

    Switch<>lamp2<->"Моя лампа 2"<->(ESPSwitch)<--->{ mqtt=">[mosquitto:/demo/lamp02/command:command:on:ON2],>[mosquitto:/demo/lamp02/command:command:off:OFF2],<[mosquitto:/demo/lamp02/state:state:default]" }
    А вот, что выдает ESPlorer при нажатии на кнопочки
    Код (C++):
    Recieved:/demo/lamp01/command:ON1
    Invalid - Ignoring
    Recieved:/demo/lamp02/command:ON2
    Enabling LED
    Recieved:/demo/lamp01/command:OFF1
    Invalid - Ignoring
    Recieved:/demo/lamp02/command:OFF2
    Disabling LED
     
     
  4. ИгорьК

    ИгорьК Гуру

    1. Уберите collectgarbage в первую очередь.
    Там где есть асинхронные функции он часто действует не так как ожидается.
    2. В коде может быть только один on:message.
    3. Следовательно, код должен разбирать не одну data, а пару topic/data.
    Поищите, здесь это есть. В частности, сообщение темы о вентиляции погреба 39.2. Там пример выделения. Наверняка еще есть.
     
    Последнее редактирование: 12 дек 2016
  5. dimm71

    dimm71 Нерд

    Спасибо за наводку. Пример вентиляции погреба не смотрел, но удалось код переделать и вроде бы заработало. Так правильно?
    Код (C++):
    m:on("message", function(conn, topic, data)
      print("Recieved:" .. topic .. ":" .. data)
    if (data=="ON1") then
      print("Enabling LED")
      gpio.write(4,gpio.LOW)
      m:publish("/demo/lamp01/state","ON1",0,0)
      elseif (data=="OFF1") then
      print("Disabling LED")
      gpio.write(4,gpio.HIGH)
      m:publish("/demo/lamp01/state","OFF1",0,0)
      elseif (data=="ON2") then
      print("Enabling LED")
      gpio.write(3,gpio.LOW)
      m:publish("/demo/lamp02/state","ON2",0,0)
      elseif (data=="OFF2") then
      print("Disabling LED")
      gpio.write(3,gpio.HIGH)
      m:publish("/demo/lamp02/state","OFF2",0,0)
      else
      print("Invalid - Ignoring")
    end
    end)
     
  6. ИгорьК

    ИгорьК Гуру

    Можно и так.
    Вынесите m: рublish в отдльную функцию, а то много одинакового кода.
     
  7. dimm71

    dimm71 Нерд

    Можно маленький примерчик как?
     
  8. dimm71

    dimm71 Нерд

    И ещё... хочется сделать нечто вроде розетки-таймера. Для этого нужно вытянуть время из Интернета (по SNTP) - вытянул. Но время вытягивается в UNIX формате в секундах от 01/01/1970 г. Как пересчитать в удобочитаемый вид?
    Далее нужно задать временные точки (вкл/выкл) - с этим сложнее, примеров не нашел в Интернете.
    Может кто встречал? Киньте примерчик, пожалуйста.
     
  9. ИгорьК

    ИгорьК Гуру

    Код (Lua):

    function publ(topic, data)
      m: publish("/demo/"..topic.."/state",data,0,0)
    end
     
    Последнее редактирование: 12 дек 2016
  10. ИгорьК

    ИгорьК Гуру

    Есть у меня наработки, но когда до компа доберусь не знаю.
     
  11. dimm71

    dimm71 Нерд

    Подожду.
    Нашел как вывести время через rtctime.epoch2cal () , хотя модуль RTС time и включен в прошивку, но не получается вывести - ошибка
     
  12. ИгорьК

    ИгорьК Гуру

    Сайты, если послать им POST или GET запрос, обычно отвечают который сейчас сейчас час (среди прочего). Достаточно распарсить штатными средствами и у вас есть время.

    А ошибка потому что ещё sntp надо задействовать и время синхронизировать.
     
    Последнее редактирование: 13 дек 2016
  13. dimm71

    dimm71 Нерд

    Ошибка потому, что прошивка у меня от 21 июня, а rtctime.epoch2cal () был добавлен в конце июля.
    Скачал сегодняшнюю прошивку - в ней не работает точка доступа. Появляется и тут же отваливается. Если успеть зайти в выбор сетей, то даже интерфейс изменен.
    Нет ли у кого прошивки в модулями
    adc,bit,cjson,coap,crypto,dht,enduser_setup,file,gpio,http,i2c,mdns,mqtt,net,node,ow,perf,pwm,rtcfifo,rtcmem,rtctime,sntp,spi,struct,tmr,uart,wifi начиная с августа до ноября?
     
  14. dimm71

    dimm71 Нерд

    Голову сломал, как это собрать воедино с этим :)
    Код (C++):
    m:on("message", function(conn, topic, data)
      print("Recieved:" .. topic .. ":" .. data)
    if (data=="ON1") then
      print("Enabling LED")
      gpio.write(4,gpio.LOW)
      m:publish("/demo/lamp01/state","ON1",0,0)
      elseif (data=="OFF1") then
      print("Disabling LED")
      gpio.write(4,gpio.HIGH)
      m:publish("/demo/lamp01/state","OFF1",0,0)
      elseif (data=="ON2") then
      print("Enabling LED")
      gpio.write(3,gpio.LOW)
      m:publish("/demo/lamp02/state","ON2",0,0)
      elseif (data=="OFF2") then
      print("Disabling LED")
      gpio.write(3,gpio.HIGH)
      m:publish("/demo/lamp02/state","OFF2",0,0)
      else
      print("Invalid - Ignoring")
    end
    end)
     
  15. Securbond

    Securbond Гуру

    При вызове функции publ в скобках Вы должны передать ей топик и данные.....
     
  16. dimm71

    dimm71 Нерд

    Для меня это пока сложно. В программировании не силен. Могу из рабочих примеров переделать под себя пока.
     
  17. ИгорьК

    ИгорьК Гуру

    Вот очень хороший сборник примеров. Я, в основном, все из него беру.
     
  18. zloy-glide

    zloy-glide Нерд

    В общем как индикатор это работает, а как триггер в правилах, нет. Остался при своем.
     
  19. zloy-glide

    zloy-glide Нерд

    Если ваш телевизор имеет USB разъем, то скорее всего он обесточивается при выключении. Можете прилепить еспешку с простейшим кодом и пинговать ее посредством OpenHab. Пингуется значит ТВ включен.
     
    ИгорьК нравится это.
  20. ИгорьК

    ИгорьК Гуру

    45.ESP-8266. Шаблон. Как узнать время.
    Грузим модуль dat.lua.
    Добываем время так:
    Код (Lua):
    time = {} -- здесь будет время
    GMT = 3 -- часовой пояс
    function call(t) -- callback функция, что заполняет таблицу времени
        time = t -- таблица стала со временем, или не стала
        for d, s in pairs(time) do -- просто чтобы знать
           print(d.." = "..s)
        end
        datm = nil -- выгружаем модуль
        package.loaded["datm"]=nil
        collectgarbage()
    end
    datm = require('dat') -- загружаем модуль
    datm.getTime(call, GMT) -- узнаем время

    --[[ просто так
    tmr.alarm(1,3000,0, function()
       if time.itog then
           print("Time: "..time.itog)
        else
            print("Time false")
        end
    [ATTACH=full]7126[/ATTACH]

    end)--]]
    002.jpg
     

    Вложения:

    Последнее редактирование: 15 дек 2016
    petr0vsk и Securbond нравится это.