Вопрос по алгоритму

Делаю устройство для мониторинга параметров с возможностью предупреждения, если значения параметров выйдут за установленные границы. Для этого выбрал ThingSpeak.
Проблема в том, что мне нужно собирать в один канал данные с двух- четырех устройств. Канал содержит 8 полей. Писать в канал можно не чаще чем раз в 15 сек. Это ограничение при бесплатной лицензии.
При записи в отдельное поле, в остальных данные обнуляются. Эту проблему решил так: каждый контроллер читает время последнего обновления канала, если оно больше 15 сек, то он читает 8 полей этого канала, модифицирует нужные поля (одно-три), и пишет 8 полей в канал.
Для двух контроллеров этот алгоритм вполне сойдет. Но если контроллеров 3 или 4, то может произойти коллизия. Могут одновременно начать запись в канал 2-3 устройства.
Вопрос: как можно синхронизировать эти 3-4 устройства, чтоб они писали в канал поочередно с интервалом 20-30 сек? Причем устройства могут отключаться и подключаться по мере надобности.

Опять. Ни схемы, ни кода… :)))))))))))))))))

Без центрального контроллера рано или поздно начнутся неприятности. Коллизии, постоянное занятие канала и пр.

А так, к примеру:

  1. Локальная нода, до начала записи в каналы (или как там) сообщает остальным через общую сеть “Передачу начал”, а после записи даёт сообщение “I’m done”.
  2. Начиная от этого момента, все остальные ноды выжидают rand(10)+15 сек и переходят к пункту 1.

UPD: естественно, что первые 30 сек после включения, нода просто слушает, что происходит в “чатике”.

А можно и по-другому. Есть только один “канальный” контроллер, который пишет в канал. Любой другой обращается к этому (в любой момент) и отдаёт ему своё сообщение (тут синхронизацию устроить несложно). А канальный накапливает сообщения в очереди (или свежее затирает старое - как нужно-то?) и раз в 15 сек отплёвывает (если есть что) в канал.

2 лайка

Home Assistant .
и надо разбираться как на него пересаживаться, а не плодить всякие костыли.

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

Хотел приложить схему из Интернета, но за такое могут и побить)
Девайсы на ESP8266 в границе участка, и связи между ними нет или не всегда есть. WIFI роутер поставил примерно посреди участка. С ним у ЕСП связь хорошая. Наверное ЕСПешки могут через роутер связываться между собой. Я в этой теме нуб. Хотелось бы попроще.

Проще всего @sadman41 предложил.
Один «узел» объявляется главным, все остальные шлют данные ему. А уж он (например, как от всех получил) - отправляет дальше.

@sadman41 , @ЕвгенийП , один контроллер я могу сделать главным или мастером, который бы назначал время передачи каждому из трех остальных. Только не знаю где хранить эти данные, чтоб они были доступны всем.
Сейчас такая мысля пришла - хранить эти данные в другом канале Thingspeak. Всего мне доступны 4 канала. Но мысля эта как-то не очень.

Зачем хранить данные? Задача неполна?

Центральный контроллер не должен время назначать, он должен принимать все и держать до передачи в систему хранения. Т.е. глубина истории - один-два интервал передачи, если данные оперативные, а не архивируемые.

Но это все касается умозрительных алгоритмов. Не сомневаюсь, что интеграций DYI IoT-а с ThingSpeak уже понаписано.

Да, я понимаю это. Главный собирает данные и отсылает в канал, независимо есть они или нет, как написал Евгений.
А второй вариант это когда главный назначает время передачи остальным. Такой вариант имеет право на жизнь в моем случае?

Обычно одно устройство пишет в один канал 1-8 полей. На этом строятся все примеры.
В библиотеке таких примеров тоже нет.

В самодельничестве ВСЁ имеет право на жизнь, но этот вариант противоречит основам системной инженерии.

Один “канальный” закрывает всю работу с каналом и не занимается ничем иным. В случае проблем, понятно где искать. В случае смены протокола канала - только его перешивать. Остальные узлы сильно упрощаются, т.к. у них нет работы с каналом и им плевать на время - они отдают свои данные в любой момент.

Вы же предлагаете и “узел-диспетчер” добавить и остальные не упростить - им по прежнему надо работать со временем и каналом в ущерб своим основным функциям. Да ещё, Вы вешаете на себя большую головную боль по синхронизации часов в разных модулях (если один другим время назначает, то часы должны быть синхронизированы, а то получится как у “Патриотов” в 1991)

3 лайка

согласен, один опрашивает, остальные слушают и отвечают

Как бы все написанное верно, только сейчас надо стараться не опускаться до такого аппаратного уровня.
Т.е. надо решать не частную задачу озвученную Pyotr, а перерабатывать концепт в корне, чтобы потом не было мучительно больно за бесцельно потраченное время и средства.

это да, если ориентироваться на Home Assistant сторонних ресурсов не надо, SQL там есть в аддонах

@_ВН , про Home Assistant я почитаю, а на данный момент мне нужно просто мониторить температуру (несколько значений), состояния отопительных котлов, наличие сети. Это чтоб в мороз минус 25 спать спокойно. Телефон лежит на тумбочке. Установлено приложение https://play.google.com/store/apps/details?id=com.hengjun.thingspeak&hl=ru&gl=US
Можно глянуть на телефон и понять что там делается в моем хозяйстве или если что-то пойдет не так, то он разбудит среди ночи. Также удобно графики сделаны. Мне больше и ненужно.
Только мониторить можно один канал. Аларм на других каналах не сработает. Для этого нужно переключаться на другой канал. Вот поэтому всю важную инфу мне нужно разместить на одном канале.
Возможно есть другие бесплатные сервисы и получше. Не знаю.

мониторить домашнюю сетку через забугорный ресурс к которому за 30 хопов не пробиться не очень разумное решение:

IP 	3.222.199.138
Хост: 	ec2-3-222-199-138.compute-1.amazonaws.com
Город: 	Не определен
Страна: 	United States

и, как обычно, это нужно еще вчера -)

хорошо, так почему в этот канал не писать только алармы?
Вероятность перекрытия разных алармов сама по себе мала.

“Никакой русский человек не готовит сани летом” Л.Д.Троцкий, собрание сочинений, том 5.

Так я и собираюсь писать те данные, на которые надо обязательно реагировать.


Так выглядит экран с данными. Картинка с гуглплей старая еще.


А это настройка алармов. Для каждого поля можно установить пределы.

Пока мне надо с двух контроллеров писать данные. Это я сегодня допилил, работает нормально. Это по моему алгоритму, что в начале темы.
Также попробовал соединил две ЕСПешки по UDP. Данные идут, но после передергивания питания связь прерывается. Потом позанимаюсь. Может другой протокол здесь нужен?

Частично согласен) Но дровами я все ж осенью запасся. На случай холодной зимы. В сильные морозы газ не тянет. Да и дровами почти вдвойне дешевле.
А вообще уже где-то полгода ничего не программировал. Сейчас ремонтом занимаюсь. Шпаклевка, гипсокартон, теплые полы… фигней занимаюсь вместо того, чтоб ардуинку помучить)