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

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

  1. Sevic71

    Sevic71 Нерд

    Игорь, Вы подтвердили для себя, что именно удаление локальных переменных функций помогло избавиться от утечек памяти? Насколько я понял суть рекомендаций из unofficial FAQ, (я их сам частенько перечитывал), upvalues это как раз значения, возвращаемся функциями, обьявляемыми inline, т.е безымянными, которые возвращают функцию, т.е например, замыкания, не? Сам уже неделю наблюдаю, как на даче трудится ESP, в котором логика разделена на две части -типа фреймворк и модули.Что-то полезное, например измерения и термостатирование, делается в модулях, а фреймворк их обслуживает, т.е. загружает, выгружает, подсовывает и забирает данные, держит канал MQTT, и т.п. Вот что заметил -несмотря на отсутствие каких-то особых приёмов борьбы с утечкой памяти, ее (утечки) тоже нет. Загруженный фреймворк с хэшами данных модулей (но без кода самих модулей, они, как я уже написал подгружаются и выгружаются поочередно), работающим MQTT , и т.п. оставляет свободным всего-то около 8 килобайт heap, при этом 6 модулей загружаются на выполнение как минимум раз в течение минуты( т.е.каждому модулю дается около 6 сек на выполнение, асинхронно, ну или почти) , при этом обрабатываются входящие сообщения от Опенхаба и других модулей, обрабатывается одно(пока) прерывание и.... Это все проработало неделю (!) без единой перезагрузки! Я сам в шоке, но факт остается фактом... Кстати, постоянный мониторинг хипа подтверждает, что в промежутках между закусками модулей свободно те же 8кбайт плюс-минус, что и после запуска... Т.е. утечки нет?
     
    Последнее редактирование: 26 дек 2016
  2. ИгорьК

    ИгорьК Гуру

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

    upvalues - это переменные, объявленные в функции, которая "оборачивает" функцию внутри себя и они доступны внутри этой "обернутой" функции. А именованная эта функция или нет - роли не играет.

    Замыкание (closures) - это upvalues, рассматриваемые "снаружи", за пределами функции-обертки, то есть неглобальное окружение некоторого экземпляра.

    Вы пишете, что гоняете шесть(!!!) модулей и память не льется. Здорово! Кстати, поделились бы проектом.

    Но дело здесь в другом: вопрос касается реально асинхронных библиотечных функций, причем если выгрузка их идет через callback. В частности, к таким функциям относятся:

    leak7.jpg

    Вы загружаете/выгружаете что-то из этого?

    В моем первом посте работа идет с net / mqtt, а в предыдущем - сразу с двумя mqtt и ds18b20, задействующем tmr. И память полилась, ох как полилась...

    Повторюсь, два условия:
    • асинхронные библиотечные функции, перечисленные в таблице;
    • выгрузка модуля с ними идет через их собственный callback.
    leak8.jpg
    Вот в таком случае память и начинает "литься".

    Вернемся к мануалу. Там говорится о том, что collectgarbage() не справляется со ссылками на upvalues. Их рекомендация - не использовать upvalues, заменяя их глобальными переменными, которые потом удалять вручную.

    Но это всего лишь переменные. Значит, прежде чем вызывать callback(), который выгрузит модуль, надо удалить все "вышестоящие" неглобальные переменные, что я и делаю.
    Ну а до кучи - удаляю все что возможно. Полагаю, хуже от этого не будет.

    Вот и все мое рассуждение. Похоже, это работает.
     
    Последнее редактирование: 26 дек 2016
  3. ИгорьК

    ИгорьК Гуру

    Не обойтись без модуля
    47. Шаблон. Отправка данных на narodmon.ru
    Применять так:
    Код (Lua):
    --[[ Таблицы на выбор, можно и так, температура идет первой по
    -- количеству датчиков
    aa = { -- склад температуры и всего остального
        0, -- y меня три датчика
        0,
        0,
        Press = 765, -- это давление
        Wind = 3.74 -- это сила ветра
    }
    --]]

    aa = {}
    dataN = "#12-34-56-78-91-AB\n" -- ваши уникальные цифры для narodmon.ru
    -- этим мы выгружаем модуль
    function removenarod()
        narod = nil
        package.loaded["narodmonmod"]=nil
        collectgarbage()
        print("Narod Dismissed!")
    end

    -- измеряем температуру с выгрузкой модуля ds18b20mod
    function gettemp()
        ds=require"ds18b20mod"
        ds.setup(4) -- датчики на этой ноге
        function get()
            tmr.alarm(0, 750, 0, function()
                a = ds.readResult()
                -- ниже - подстановка в таблицу, что будет отправлять
                -- на народный мониторинг. Это если у вас коме температуры
                -- еще что-то. Пример таблицы - вверху
                for k in pairs(a) do
                    table.remove(aa,k)
                    table.insert(aa,k,a[k])
                    print(k..": "..a[k])
                end
                ds = nil
                package.loaded["ds18b20mod"]=nil
                collectgarbage()
                narod = require('narodmonmod')
                narod.sendNarod(dataN, aa, removenarod)
            end)
        end
        print("No:",ds.addrs(get))
    end
    gettemp() -- поехали
     
    Результат:
    narod2.jpg
     

    Вложения:

    • narodmonmod.zip
      Размер файла:
      566 байт
      Просмотров:
      307
    Последнее редактирование: 26 дек 2016
  4. sky keeper

    sky keeper Нерд

    Добрый день. Решил познать дзен умного дома. Москит и опэнхаб поднял на малине, на самой первой еще, валялась давно, думал не потянет, но вроде все на ура. Линуксообразное не мое, но с помощью этой ветки заборол всё, практически. Вообщем пока у меня только гирлянды на ёлке рулятся) Но не суть, вопрос следующий, как разделить права управления в опенхабе. Подразумевается, что доступ к устройствам должен быть у меня один, у детей другой. Пользователей я заводить понял как в опенхабе, а как попилить далее не нашел. Хотя бы намек дайте в какую сторону копать.

    Потом как нить эссе "начинающего" напишу, пока свежи воспоминания))
     
    Последнее редактирование: 28 дек 2016
  5. alp69

    alp69 Форумчанин

    Простое и примитивное решение - несколько сайтмэпов. Один (полный) - для себя, другой (усеченный) - для детей.
     
  6. sky keeper

    sky keeper Нерд

    Ну это я думал, но дети выбирают мой сайтмэп и они полноценные владельцы ситуации

    Пока вижу решение оранж пай зеро и второй опенхаб ))))
     
  7. sky keeper

    sky keeper Нерд

    Ну, собстна эссе, если никто не против )



    Все началось с банального. Как ограничить доступ детей к xbox. Таскать с собой блоки от батареек от пультов не вариант, не удобно. Подвернулось в али экспрессе на глаза устройство sonoff, которое, по сути, является элементом умного дома, с хостингом управления в Китае. Идея хороша, но понимаю зависимость от интернета, и уж тем более внешнего управления заставила погуглить, что с sonoff можно сотворить. Нашел кучу переделок на просторах, ну и понеслось, как говориться…

    Узнал про протокол mqtt, интерфейс от majordomo, esp8266. На ардуину смотрел я уже давно искоса, даже пару лет назад закупился нано, несколько датчиков воды, объема, лазерной указкой, по мелочи вообщем побаловаться. В свое время даже диодиком помигал и отложил в сторону до лучших времен, детей учить и тп. Вообщем погрузился в чтение и изучение вопроса. Сначала смотрел в сторону mosquito+majordomo, потом где то увидел опенхаб, и сейчас вот пишу и даже не знаю, почему на нем остановился. Еще кстати подумаю на эту тему))) Пока не поздно.

    Процесс начался с raspberrypi, оказалось, что за пару лет там сдохла микросд, закупил, поставил последний расбпиан пиксель, лайтовую версию, почему то не решился. Детям сразу понравилось что в расбпиане был ярлычок майнкрафта ))) но утерлись скоростью и версией и вообще на xboxeоно круче. Ну и пошли мучения с установкой москита и опенхаба. Ставил сначала по какой то инструкции на ютубе англоязычного пользователя, удобно кстати, и толково показано было, и опенхаб оттуда же ставил. Даже все завелось, и дальше уже начались непонятки с опенхабом, страничка не открывалась, и тп. Это я сейчас уже понимаю, что дефолтного сайтмэпа не было. Потом наткнулся на этот форум, дорогого стоило прочитать все)) На все это я уже потратил около 3-4 дней, параллельно изучая живьем работу на espwitty(не понравилась плата, но не суть, на тесты брал) . Переустановил все по инструкции с этой ветки, картина получилась та же самая, но уже продвинулось дальше, опенхаб завелся, страничку дефолтную сделал правильно. Потом дочитывая ветку форума я понял что уже глаз дергаться начинает ))) И тут мне пришла релюха с али, и началось )))

    В ЕСПэшку залил стандартную прошивку из библиотеки, повыкидывал не нужное, вставил свое и…

    Наступили сутки тупняка ))) В mqttspyвидел пакеты, ЕСПэшка видела пакеты от mqtt, но условия не отрабатывались и из 4реле моргал только первый канал. Это я еще без опенхаба эксперементировал, дальше хуже))) Но вернемся к тупняку, я по жизни на паскале писал, СИ в свое время пытался, но не было живых задач и стало скучно. И ведь я знал что в СЯх сравнение надо ставить два ==, но видимо уже реально глаз дергался и мерещилось два ==, а не одно как было на самом деле ))) Ну вы поняли, сутки потраченные в никуда )) Но скрупулёзность и 100500 строчек каментов в сериал порт сделали свое дело )) Все заработало и в ручном режиме я заморгал всеми 4мя каналами. Ура, думал победа, но …

    Настало время визуализации и эргономики. OPENHAB, мать его итить ) Описаний его тьма, но все в основном из официальной документации с сайта. На форумах везде пишут: добавим это в итемы(текст прикладывают) ну и вставим в сайтмэп(и ничего не прикладывают) и тут казус для новичка ))) я хз что вставить в сайтмэп, демо страничку излазил все вдоль и поперек, но там инфы избыточно много, мне надо было простое, переключатель релюхи без «фантиков». Я даже начал пить пока искал и разбирался )))) Причем, понимаю, что оно ж просто, переменная, лэйбл, но…. Вообщем, нашел где то кусочек того что мне нужно было, попробовал, подправил… и о боже, заработало.

    Вот так родилось первое мое устройство умного дома. Пробросил порты опенхаба в инет, теперь управляется из любого места на нашем шарике где есть интернет. Дальше пока некогда заниматься всем этим, но планов громадье. И до переучивания sonoffдело дойдет, а может, отдам родителям баловаться, а себе уже сделаю свое, скорее всего так и будет.
     
    Securbond, ИгорьК и alp69 нравится это.
  8. alp69

    alp69 Форумчанин

    Вот это напор! :cool:;)
    Вы уж берегите себя! :D
     
    ИгорьК нравится это.
  9. sky keeper

    sky keeper Нерд

    Придумал) права у всех одинаковые, но будут топики, которые будут изменяться вручную в mqtt, а пользователи будут видеть весь интерфейс. В правилах же можно прописать зависимость двух топиков?
     
  10. alp69

    alp69 Форумчанин

    Не совсем понятно. По крайней мере для меня:oops:
     
  11. zloy-glide

    zloy-glide Нерд

    Я извиняюсь, а в боксе нет разве родительского контроля и ограничения по времени игры?
    В конфигах опенхаба есть users.cfg Может в эту сторону поковырять? Хотя пишут что разграничение по ролям отсутствует в первом опенхабе. Будет во втором.
     
  12. sky keeper

    sky keeper Нерд

    Смысл такой закрался мне в голову. В опэнхабе есть переключатель xbox, но в mqtt есть топик, который опэнхаб скажем в интерфейсе не виден, нет его в сайтмэпе, и этот топик я руками ставлю в ON/OFF, а в правилах топик xbox отрабатывается если "скрытый топик ON". Мутная мысль, особенно когда еще сам не знаю как сделать, но функционал по идее должен выполним вроде должен быть

    Насчет ИксБокса, есть, но удаленно его не изменить, то есть, пример из жизни, осовремененный, кому то покажется смешным, но реалии таковы )))) Детка хочет поиграть в ХБокс, я на работе, он делает уроки, убирается на столе рабочем, отписывается мне что сделал уроки, я включаю ХБокс. Встроенный контроль в бокс не спасет... А тут все в динамике
     
  13. sky keeper

    sky keeper Нерд

    Опэнхаб второй пока в бете, хотя в моем случае может и стоит на него сразу садиться? Я честно говоря пока никак толком не въеду в первый то ))))

    о ESPшках еще, сугубо личное. Взял себе witty cloud и wemos d1 mini. Первая не понравилась, широкая, в макетку влазит но изврат с контактами перефирии нужно городить, Wemos удобен, плюс не перетыкать постоянно плату в кроватку как в случае с witty. Цена вопроса одинаковая, заказал горсть Wemos вроде как с сайта производителя на али. Witty кстати пришлось выгрызать светодиод который аж три ноги отжирает для полноценного использования, ну и аналог там занят датчиком освещенности, что тоже потребует лишних телодвижений. Думал когда освоюсь перейти на голые ЕСПшки+обвязку, но я не электрик, азы понимаю, и разбираться пока нет никакого желания. Пусть будут Wemosы вообщем. не реклама )
    Я это... придет время попристаю с правилами в опенхабе, и немного с итемами и сайтмапами, как то оно меня подбешивает )))))
     
  14. alp69

    alp69 Форумчанин

    Скорее не топики, а итемы. Которые условиями можно делать видимыми или нет. Можно прикрутить такую приблуду (первое, что навскидку):
    Вводите цифровой код и итем становится виден и Вам и ребенку.
    Непонятно одно. Х-бокс как управляется. Чем? Для него есть биндинги?
     
  15. alp69

    alp69 Форумчанин

    Но ввод кода может быть также отслежен ребенком. Сделайте проще. При включении Х-бокса опенхаб в telegram Вам скинет "стукограмму". А дальше включите "ремённую передачу мыслей на расстоянии" (c). :cool:
     
    mex79 нравится это.
  16. sky keeper

    sky keeper Нерд

    Еще вопросик ) Я потом обещаю выложу и скетч и настройки опенхаба, когда доделаю, единственный нюанс, буду писать на СЯх, да простят меня местные ЛуаЛюбители.
    Так о чем я. Что происходит когда система(например ЕСП+реле+AC-DC) рестартится по любым причинам? Надо самому обрабатывать последнее состояние системы по данным mqtt? Если да, то получается, система отправить пакет например "Я тут", а mqtt должен вернуть последнее состояние подписанных топиков от этой системы?
     
  17. sky keeper

    sky keeper Нерд

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

    Биндинг мне вообще пока не понятен) Но я думаю хбокс сделать просто питание на реле повесить, наверно даже лоулевельное(это не суть). А в опен хабе просто включатель/выключатель, который да, от итема второго зависит. А можно скрывать или открывать видимость в опенхабе? я что то не увидел нигде в примерах демо, хотя там такое и не выложат наверно
     
  18. alp69

    alp69 Форумчанин

    Для примера:
    Код (C++):
    Chart item=Mur_bedroom_climat period=d visibility=[Mur_climat_period==1]    
     
  19. alp69

    alp69 Форумчанин

    sky keeper нравится это.
  20. alp69

    alp69 Форумчанин

    Обрубить по маку:p