• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Умный дом для чайника

pvvx

Активный участник сообщества
Вопрос -какая цель логгирования?
Набор статистики, учет расхода и т.д. Эти данные терять нельзя - чем чаше сохраняются, тем надежнее, если нет супервизера питания.
Вообще проблема логгирования очень актуальна и для всяких 'юбинту' и прочих кривых ОС или модулей типа 'малин' часто требует создание специального устройства с простой flash микросхемой умеющей писать побайтно (+ микруха NVRAM типа FM25L256B для заголовков и промежуточных значений).
 
Последнее редактирование:

kvark

New member
ТС, я бы при создании "умного дома" к вафле не лез вообще (да простят меня форумчане :)), "копайте" лучше в сторону проводов (например can). Пусть не весь дом, но критически важные узлы инфраструктуры дома точно. Проблемы выше указанные с малиной и т.п. присутствуют, но выбрасывать из системы жалко, хочется и голосового управления, и машинное зрение прикрутить и т. д.
 

nikolz

Well-known member
На тему логгирования.
Для предметного обсуждения этой темы предлагаю мою рабочую модель сбора данных в системе умного дома.
1) Каждый модуль должен быть максимально дешевым, компактным и надежным.
Модуль сохраняет измеряемую им информацию в оперативной памяти.
--------------------------------
2) Центральный узел - это компьютер либо смартфон периодически забирает информацию с модулей.
----------------------------------
3) Возможно создание сети в которой часть информации соберет модуль более высокого ранга.
--------------------------------
4) Организация накопления данных во внутренней оперативной памяти модуля(RAM).
На один отсчет изменения необходимо от 2 до 4 байт. Это 12-16 бит данные и 8-16 бит время.
В худшем случае это 4 байта. В eSP для этой цели без проблем выделить от 4 до 32 Кбайт.
Пусть будет 4 Кбайт. Это 1000 отсчетов.
история накапливается в циклическом буфере.
Таким образом, модуль хранит измерения с момента последнего общения с центром.
Во всех модулях используется сжатие исходных данных.
Например, сохранение данных не производится, если новое значение отличается от предыдущего менее, чем на заданную дельту.
Подобные методы обработки обеспечивают сжатие данных примерно в 10 -100 раз.
Пусть будет в 10.
Таким образом, накопление информации в RAM обеспечит длительность истории примерно в 10 тысяч отсчетов.
Для данных с периодом сбора 10 секунд длительность истории составит 1.15 суток.
Для данных с периодом 1 час длительность истории 1.14 года.
Таким образом, объема RAM достаточно для сохранения истории и нет надобности ни писать во флеш ни ставить внешнюю память.
--------------------------------------
4) Для обеспечении сохранности истории на время отключения сети ставится резервное питание на аккумуляторе.
-----------------------------
 

pvvx

Активный участник сообщества
На тему логгирования.
Для предметного обсуждения этой темы предлагаю мою рабочую модель сбора данных в системе умного дома.
1) Каждый модуль должен быть максимально дешевым, компактным и надежным.
Модуль сохраняет измеряемую им информацию в оперативной памяти.
Модуль должен спать до своего события.
2) Центральный узел - это компьютер либо смартфон периодически забирает информацию с модулей.
Дорого и накладно - такие вещи надо мониторить пылесосом и т.д. :)
3) Возможно создание сети в которой часть информации соберет модуль более высокого ранга.
В принципе собрать информацию может и ESP8266 с увеличенной Flash. Уже пробовал, но пока не выкладывал (и не буду - злой я :) ) , циклически годовой накопитель данных на ESP8266 с выводом 16 графиков с минимальным шагом точек по 5 минут и нескольких 64-х битных счетчиков. Web выдает графики (xml) за сутки, за неделю, за месяц и за год на запрошенное время. Точки графиков усредняются для больших периодов, чем 5 минут...
Сам модуль опрашивает другие по modbus TCP, но это изменить не долго.
А не дам, т.к. писать там нечего:
Суммируете данные и пишите блоками в flash, события тоже. Каждый блок с id меткой времени, когда наступает период точек усреднения для графиков к примеру на месяц, то создается и такой блок со своим id путем расчета предыдущих за период. Это надо для быстрого вывода данных запрошенных графиков.
16 мег flash хватает запросто на записи в годовой цикл. Сектора Flash трутся и пишутся всего 1 раз в год. В итоге протирание flash будет через 100000 лет. :D

PS: Это неимоверно дорогой проект, т.к. W25Q128FV вместе с паяльником стоит рублей 100! :p :)
PS2: О - да, забыл. Там желательно иметь внешнюю микруху часиков. Она тоже очень дорогая - рублей 10..20 !
 
Последнее редактирование:

nikolz

Well-known member
Модуль должен спать до своего события.

Дорого и накладно - такие вещи надо мониторить пылесосом и т.д. :)

В принципе собрать информацию может и ESP8266 с увеличенной Flash. Уже пробовал, но пока не выкладывал (и не буду - злой я :) ) , циклически годовой накопитель данных на ESP8266 с выводом 16 графиков с минимальным шагом точек по 5 минут и нескольких 64-х битных счетчиков. Web выдает графики (xml) за сутки, за неделю, за месяц и за год на запрошенное время. Точки графиков усредняются для больших периодов, чем 5 минут...
Сам модуль опрашивает другие по modbus TCP, но это изменить не долго.
А не дам, т.к. писать там нечего:
Суммируете данные и пишите блоками в flash, события тоже. Каждый блок с id меткой времени, когда наступает период точек усреднения для графиков к примеру на месяц, то создается и такой блок со своим id путем расчета предыдущих за период. Это надо для быстрого вывода данных запрошенных графиков.
16 мег flash хватает запросто на записи в годовой цикл. Сектора Flash трутся и пишутся всего 1 раз в год. В итоге протирание flash будет через 100000 лет. :D
Я не против того, чтобы писать во флеш.
Тем более есть на рынке ESP с 8Mбайтами за копейки(140 руб).
Но мне и RAM хватает.
--------------------------------------------
Если комп это дорого, то можно хранить в облаке.
-------------------
Я не вижу практического смысла выводить графики ( за исключением случаев, чтобы выпендриваться в интернете)
-------------------
Перефразируя классика, скажу - если данные сохраняются, то это для чего-то нужно.
и обратно - если не знаешь зачем,
то не надо хранить всякий хлам( Хлам - это то, что не нужно, но храниться).
-------------------------
Сжатие данных ввиде суммирования -это простейший ФНЧ, но это не лучший способ, он искажает скачки.
 

pvvx

Активный участник сообщества
Сжатие данных ввиде суммирования -это простейший ФНЧ, но это не лучший способ, он искажает скачки.
Скачки чего? Температуры? :)
Логи показывают когда менялась лампочка :) и набрав статистику вы сможете покупать правильные лампочки :)
PS: не существует не искажающих фильтров. У них у всех есть импульсная характеристика, которую вы и увидите при входной разрывной функции...
 
Последнее редактирование:

pvvx

Активный участник сообщества
Я не против того, чтобы писать во флеш.
Тем более есть на рынке ESP с 8Mбайтами за копейки(140 руб).
Но мне и RAM хватает.
8-мь мало. В 16-ти первый мег идет на софт, несколько мег на web-диск чтобы красиво показывал, с help-ом, остаток на записи. Чем меньше шаг точек, тем лучше, тем больше надо flash.
Но у вас нет паяльника... :( Тогда - ой.
Если комп это дорого, то можно хранить в облаке.
Тогда это не "умный дом", а "умный чужой офис" ;)
Ключи надо тоже повесить перед дверью и ждать изменений в социале, что это никому не пригодиться :)
Я не вижу практического смысла выводить графики ( за исключением случаев, чтобы выпендриваться в интернете)
Ничего подобного - по данным графика я могу вспомнить что было и кто был в какой комнате, включая кошку. :)
Просто так и скажите, что на вашем любимом Lua это не написать в ESP8266. :)
 

nikolz

Well-known member
8-мь мало. В 16-ти первый мег идет на софт, несколько мег на web-диск чтобы красиво показывал, с help-ом, остаток на записи. Чем меньше шаг точек, тем лучше, тем больше надо flash.
Это в случае WEB-сервера на каждом модуле?
Но зачем градуснику веб-сервер?
Но у вас нет паяльника... :( Тогда - ой.
Это не понял.
Тогда это не "умный дом", а "умный чужой офис" ;)
Нет , это просто сервер на хосте. С резервным питанием и Гбайтом для истории.
Ничего подобного - по данным графика я могу вспомнить что было и кто был в какой комнате, включая кошку. :)
Ну да, отображаете миллион точек на сотне графиках. И что потом? Ну вспомнили, про кошку и что дальше? Типа воспоминания прошлых лет?
Просто так и скажите, что на вашем любимом Lua это не написать в ESP8266. :)
Просто говорю, модули написаны на CИ и ASM. Если надо, то и на LUA.
А Вы лишь на СИ ? Сочувствую.
 

jia

New member
Флешки или SD карты использовать без аппаратного дополнения в виде супервайзера питания с допитыванием их на время "парковки" при выключении общего питания невозможно. Такова их аппаратно-программная структура - при любой записи они переписывают общую разметку всей памяти и если во время этого дела сбой - больше нет этой флашки и требуется низкоуровневый формат программой от производителя контроллера...
А т.к. структура такая дикая (писалась и разрабатывалась какимими-то школьниками), что при записи одного байта надо переписывать все глобальные таблицы, то любая база данных за пару дней убивает их. Если даже как-то решено с резервированием этих таблиц, то аппаратная часть позволяет записывать минимум один блок. А это при записи одного бита требует стирание и перезапись от 64 килобайтного блока. На современных больших - от 128 килобайтного... :)
В связи с этим, все ваши разговоры о ПО на неработающей (не подходящей) аппаратной базе ни к чему. В роутерах стоит обычная Flash и там при вк./откл питания предел потерь составляет последний записанный сектор и ПО для этого приспособлено.
Спасибо за ликбез, побежал вытаскивать с загашников 2 упса и смотреть, что там с батареями

Ну вот - стоимость уже переваливает за комплекс с SSD или Скази винч.
Комическая у вас устойчивость - видно, что данный конфиг использовался один вечер, в целях проверки общей работоспособности, а не в режиме 24 часа 365 дней в году... :)
iscsi - это бесплатно
Это выделить файл/раздел сервака под виртуальный жесткий диск и подключить его через сеть... даже винды думаю, что у вас реальный физический винт... беда только одна, сервак у меня в данный момент с умирающей матерью
За валяющийся SSD и USB-sata возможно подумаю, спасибо

ЗЫ. Логи это нужно, без них никак отлаживать систему. Только на один контур теплого пола в сутки 600 кбайт логов
 

=AK=

New member
На один отсчет изменения необходимо от 2 до 4 байт. Это 12-16 бит данные и 8-16 бит время.
На один отсчет надо 2 байта. "Время" каждого измерения запоминать бессмысленно, поскольку они берутся с равными интервалами, и зная время первого измерения, легко вычислить время любого другого. Измерения надо запоминать блоками и ставить метку времени (4 байта) в начале блока.

Например, сохранение данных не производится, если новое значение отличается от предыдущего менее, чем на заданную дельту.
Подобные методы обработки обеспечивают сжатие данных примерно в 10 -100 раз.
Пусть будет в 10.
Для реальных измерений сжатие даст выигрыш примерно 4 раза. И не простое RLE, а достаточно сложное. Так что сжатие можно не рассматривать, для ТС это будет непосильно.
 

pvvx

Активный участник сообщества
Для реальных измерений сжатие даст выигрыш примерно 4 раза. И не простое RLE, а достаточно сложное. Так что сжатие можно не рассматривать, для ТС это будет непосильно.
Какова цель сжатия?
В году 365*24*60 минут, если писать блок каждую минуту, что не требуется для бытового применения, то для 16-ти мег Flash с учетом ПО и резервов под Web диск это блоки по (14*1024*1024)/(365*24*60) = 27 байт. Выбираем писать каждые 5-ть минут -> блок до 135 байт для годового буфера. Выбираете кратное - 128 байт и вперед...
Смысла писать в лог информацию с графика как у jia нет никакого. "Без пива" там ничего не разобрать, а главного так и нет - счетчика затрат и усредненной температуры за периоды не менее 5 минут с расчетом КПД :). Кому нужен частокол на графике - включит внешний логер или осциллограф на ШИМ управление обогревателем :)
 
Последнее редактирование:

nikolz

Well-known member
Какова цель сжатия?
В году 365*24*60 минут, если писать блок каждую минуту, что не требуется для бытового применения, то для 16-ти мег Flash с учетом ПО и резервов под Web диск это блоки по (14*1024*1024)/(365*24*60) = 27 байт. Выбираем писать каждые 5-ть минут -> блок до 135 байт для годового буфера. Выбираете кратное - 128 байт и вперед...
Смысла писать в лог информацию с графика как у jia нет никакого. "Без пива" там ничего не разобрать, а главного так и нет - счетчика затрат и усредненной температуры за периоды не менее 5 минут с расчетом КПД :). Кому нужен частокол на графике - включит внешний логер или осциллограф на ШИМ управление обогревателем :)
Можно конечно и так. Это Ваша модель.
Беседуем далее.
Сравним мою модель (M1) и Вашу (M2).
1) М1 можно использовать с модулями ESP любого объема флеш в т ч и с ESP01.
M2 - либо с самопальной, либо с появившейся на али, которая в 3 раза дороже ESP12.
2) M1 использует не более 4 байт на отсчет,M2 -27.
3) M1 не ограничена архитектурой софта, M2 ограничена WEB серверной структурой.
Резюме: М2 более сложная, чем M1.
 

=AK=

New member
Храните данные в ОЗУ. Заведите себе массивчик или структуру нужного размера, и храните там, безо всякого геморроя.
...
надо задать: какой максимально возможный интервал времени между передачами данных на компьютер. Исходя из этого можно расчитать, сколько памяти нужно, чтобы хранить измерения.
примерный (он же максимальный) срок хранения данных в самом модуле я определяю как один месяц.
Измерения, скажем, раз 5 минут, макс. срок хранения 1 месяц. Требуется хранить 9 тыс измерений. по 2 байта на измерение - значит, потребуется всего 18 кбайт ОЗУ.
 

Юрий Ботов

Moderator
Команда форума
Существуют ли какие-то способы работать с SPIFFS типа как в обычном проводнике?
Кстати вот тут есть ссылка на плагин для Arduino IDE - правда в одну сторону, загружает при прошивке все файлы из каталога <имя скетча>/data в spiffs: File System · ESP8266 Arduino Core
 

Alexey N

Member
Кстати вот тут есть ссылка на плагин для Arduino IDE - правда в одну сторону, загружает при прошивке все файлы из каталога <имя скетча>/data в spiffs: File System · ESP8266 Arduino Core
Да, спасибо. Я про этот плагин знаю. Он даже в каком-то стандартном примере используется. Но это просто для загрузки. А для "посмотреть что там есть" такого не нашел.

Ей Богу... пора переименовывать " Умный дом для чайника" в "Чайный домик для умников" :)
Не, не надо. Я все еще тут, и все еще чайник. Как перевалит за сотню страниц, попрошу модераторские права и потру нафиг всех, кто флудит;)
 

Alexey N

Member
Давно ничего не писал, но вроде все получалось и вмешательства старших товарищей не требовалось. Сейчас столкнулся с совершенно нелепой проблемой. К ЕСП подключены датчик давления BMP180 и часы реального времени DS3231. Подключены, соответственно, параллельно к I2c выходам ЕСП. И теперь оказывается, что одновременно они не могут работать. Точнее при старте не может запустится BMP180, не выполняется bmp.begin(). Если на "горячую" вытащить DS3231, то датчик давления тут же запускается и после вставления DS3231 обратно все работает как надо. Как я понимаю, это какие-то конфликты между I2c устройствами? Что это может быть и самое главное, как это исправить?
Если это может как-то прояснить ситуацию, то сообщаю что для датчика давления использую библиотеку Adafruit-BMP085-Library-master, но пробовал и SFE_BMP180 Library с тем же отрицательным результатом. Для часов - RTClib-master.
 

=AK=

New member
Вряд ли устройства конфликтуют. У них должны быть разные функциональные адреса, поэтому одно не слышит когда обращаются к другому.

Это скорей или библиотеки конфликтуют, или вы сами обращаетесь к устройствам некорректно, вперемешку: начали общаться с одним, не закончили, стали общаться с другим.

Общение с I2C устройствами должно быть полным, "неразрывным": от I2C старта до I2C стопа можно общаться только с одним устройством.
 

Alexey N

Member
Полночи просидел, ковыряясь то в проводках, то в коде. В итоге вроде нашел причину. Вот такой код у меня был сначала.
Код:
Wire.begin();
bmp.begin()
rtc.begin()
Первая строка лишняя, так как в каждой библиотечной функции begin уже вызывается Wire.begin(). И действительно получалось, что я вызывал Wire.begin(), не останавливал ее, и начинал общаться с новым устройством.
 

Alexey N

Member
Эх, рано я порадовался. Запускается датчик через раз и самое неприятное, что я не могу понять где искать ошибку. В библиотеке и в коде? Если я убираю модуль часов, то датчик давления прекрасно запускается и работает. Подключаю часы на горячую - все работает. Вряд ли в коде ошибка? В проводах? Тогда вообще бы ничего не запускалось. Получается так, что я вгружаю скетч и он вполне может заработать, а после ресета nodemcu снова будет ошибка.
Вот собственно ошибка:

ь18…Љэ1¤15Problem with sensor bmp180!

Soft WDT reset

ctx: cont
sp: 3fff0220 end: 3fff0430 offset: 01b0

>>>stack>>>
3fff03d0: 3fffdad0 3fff0470 3fff0470 40206c80
3fff03e0: feefeffe feefeffe feefeffe feefeffe
3fff03f0: feefeffe feefeffe feefeffe feefeffe
3fff0400: feefeffe feefeffe feefeffe feefeffe
3fff0410: 3fffdad0 00000000 3ffef3fc 402090a0
3fff0420: feefeffe feefeffe 3ffef410 40100718
<<<stack<<<


А вот код, который должен запускать датчик давления:

if (!bmp.begin()) {
Serial.println("Problem with sensor bmp180!");
while (1) {}
}
И вот он-то и не срабатывает. Я пробовал менять очередность инициализации часов и датчика давления - без результата. Пробовал ставить другой модуль часов, на тот вариант, что глюк в самом модуле. Не могу понять, что вызывает ошибку и где ее искать.
 
Последнее редактирование:
Сверху Снизу