• Система автоматизации с открытым исходным кодом на базе 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) {}
}
И вот он-то и не срабатывает. Я пробовал менять очередность инициализации часов и датчика давления - без результата. Пробовал ставить другой модуль часов, на тот вариант, что глюк в самом модуле. Не могу понять, что вызывает ошибку и где ее искать.
 
Последнее редактирование:
Сверху Снизу