Эта история началась где-то в конце 2019 года после знакомства с экосистемой Arduino. Пересмотрел и перечитал много различных роликов и статей по тому как готовить прошивки и подключать железки. Так наткнулся на проект по измерению концентрации CO2 в помещении (у одного известного блогера-ардуинщика). Стал погружаться в контекст и искать с чего бы начать. И это начало было положено с датчика измерения диоксида углерода - MH-Z19B.

Показания CO2 PPM и их влияние на человека. ГОСТ и то, что обычно находится на просторах сети
Показания CO2 PPM и их влияние на человека. ГОСТ и то, что обычно находится на просторах сети

Конечно же на рынке были готовые коробочные продукты. Измерялись они размером кошелька. Мне же было интересно построить свой вариант и уже на личном опыте закрепить теорию. На основе скетчей из примеров, а также нескольких статей по MH-Z19B (были сложности с поиском правильно работающей библиотеки) получилось собрать прошивку используя следующие компоненты:

  • WEMOS mini d1 (контроллер esp8266, основа)

  • MH-Z19B (датчик CO2)

  • AHT21 (датчик температуры и влажности)

  • Oled SSD 1306 (экран)

  • пачка медных проводов с припоем

  • клеевые стержни

Железка получилась простой как валенок. Что такое макетная плата и как её изготовить - тогда еще не знал. Да и это не нужно на этапе "ого, прикольно, оно еще и работает!". Так появилась версия 0.1

Прототип железки с показаниями. Температура, влажность, уровень CO2 и текущее время
Прототип железки с показаниями. Температура, влажность, уровень CO2 и текущее время

Такой прибор пролежал на рабочем столе примерно года два. Питание - зарядник по USB напрямую к WEMOS. Краем глаза поглядывал на значение диоксида и если выходило за пределы - ручками и ножками открывал окно на проветривание.

Версия 1.0 и расширение набора датчиков

Решившись взять ипотеку в новостройке с черновой отделкой, пришел к мысли, что нужна минимальная база для автоматизации быта. Которая заключалась в том, чтобы проложить витую пару по плинтусам в каждую комнату + санузлы и лоджия. И утвердить место для слаботочной щитовой. Гнал прочь мысли о том, чтобы заводить кабель в каждый электрический потребитель. Но спустя время осознал, что проложить силовую и слаботочную линию в вентиляционные отверстия было бы хорошей идеей. Чтобы автоматизировать приток воздуха с улицы.

После взял сервер на базе Atom N3350 (6Gb, 64Gb EMMC, WIFI, BT) с пассивным охлаждением. Установил Ubuntu и в докере поднял Home Assistant(далее HA), MQTT Mosquitto, Node-Red. Четкого плана, что и как должно друг с другом дружить - не было. Было примерное представление, что "нууу, нааверное с этого можно начать".

В прошивке своей железки добавил поддержку MQTT и настроил HA для отображения данных.
В прошивке своей железки добавил поддержку MQTT и настроил HA для отображения данных.

Со временем Oled экран на железке стал выцветать. Как оказалось, это известная проблема. Возникла идея добавить датчик движения и датчик освещения, чтобы включать экран тогда, когда рядом кто-то есть. И если света мало, то включать экран только на 50% яркости.

На этом шаге миниатюрность закончилась и захотелось видеть более целостное устройство, а не просто пачку проводов перемазанных клеем. Так потихоньку стал изучать как рисовать электрические схемы и как организовать расположение элементов на печатной плате. Само собой первые версии были не идеалом и с ошибками.

Версия 1.0 пополнилась следующими компонентами:

  • BH1750 (датчик света)

  • Led strip WS2812D-F8 (полоска из 8-10 адресных светодиодов)

  • DS18B20 (герметичный датчик температуры)

  • Water-sens, MH-sensor-series (датчик воды)

  • PIRO AM312 (датчик движения)

  • MQ7 (датчик угарного газа)

  • servo (сервопривод)

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

Питание организовал через mini DC-DC преобразователь (12->5V, 3А в пике). Так, чтобы было с запасом и на микросхему и на периферию.

Часть датчиков (СО2, датчик воды) размещались на одних и тех же пинах. Проектируя схему, старался учитывать, что в комнатах нужен разный набор подключенной периферии. Например, в ванной нет смысла замерять уровень диоксида углерода, но есть необходимость в датчике протечки.

Первая версия платы. Первый блин комом
Первая версия платы. Первый блин комом

Месяц ожидания и на руках свежий, напечатанный набор из 5 плат. Пайка, сборка, тестирование и ничего не работает! Мультиметром стал проверять где и что приходит и где отваливается. Оказалось что перепутал полярность при развязке питания после DC-DC преобразователя. Ну с кем не бывает? Провода, пайка, правки в схеме.

Попытки систематизировать схему работы и организация всей системы.
Попытки систематизировать схему работы и организация всей системы.

Первая плата на рабочее место. Датчик движения работает, экран выключается, показания считываются. Ох, какой же это кайф видеть результаты своей работы! Вторая плата уже пошла в ванную. Там датчик протечки и на будущее Led лента на подсветку в виде ночника. Все встало без особых проблем.

Примерная схема питания и работы всей схемы.
Примерная схема питания и работы всей схемы.

В самом начале решил, что контроллеры не будут питаться от батареек. Нет желания менять в самый ответственный момент. Или без возможности сменить, если никого нет дома. Питание организовал через 4 жилы витой пары. В щитовой стоит ИБП, после блок питания 220->12V, 5А - дальше витая пара приходит на железки и через DC-DC питает Wemos и прочую периферию.

Прошивку писал сам и обновлял через USB кабель. Т.е. что-то поправил, беру ноут, иду на место к железке (в ванную комнату), через кабель заливаю новую прошивку и проверяю, что работает. Что такое OTA(обновление по воздуху) уже знал, но не разбирался как настроить. Не так часто приходилось ковыряться с кабелем. На тот момент было больше интереса самому возиться с кодом и коммуникациями. Так получил хороший (как мне кажется) опыт того, что в железках самое сложное это не написать код, а отлаживать в реальных условиях. Дебаг, проверки, логи, веселье, повторить.

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

Версия 1.1

Первую версию платы можно было бы оставить как есть. Только нужно делать пару правок в процессе пайки и не париться в дальнейшем. Одно но, использовать в комнатах было не удобно, потому что выглядело как очередной комок проводов, спаянных на куске текстолита. Хотелось сделать компактнее саму плату и собрать в конечном итоге в корпус и спрятать начинку. Так появилась версия 1.1

Попытка учесть опыт прошлых ошибок в минимальном размере
Попытка учесть опыт прошлых ошибок в минимальном размере

На схему был добавлен тумблер (питание на периферию), возможность замены на второй экран на базе SSD1309(чуть больше по размерам) и переделано расположение компонентов. А также уменьшил размер "коробки". Расчет был на то, что новая версия будет стоять на виду и не портить внешний вид. Всего получалось 6 таких "коробок" на квартиру. 3 датчика протечки, 3 датчика диоксида углерода. Две платы первой версии были собраны и работали последние полгода без особых проблем. Осталось собрать остальные. Сейчас больше думаю, что было бы любопытно найти какой экран на IPS с I2C интерфейсом, похожий на ST7789. Или вовсе отказаться от экрана за ненадобностью.

В ожидании и после сборки.
В ожидании и после сборки.

Погодная станция

Наверное каждый, кто так или иначе связывался с Arduino, приходил к подобному умозаключению: "И таааак. Я умею писать прошивки и моргать светодиодом. Настало время отслеживания показаний погоды! Пора собирать станцию!". Так в моем наборе появился экран на электронных чернилах LILYGO T5-4.7 на базе ESP32.

В большинстве прошивок, что находил для этой железки, внешние сервисы погоды прописаны в коде явно. И это всегда один сервис. Нет возможности ни переключиться, ни добавить какую-то дополнительную информацию без изменения самой прошивки и само собой - заливки изменений. Значит нужно сделать свою, которая будет заниматься только отображением данных. А сами данные будет подготавливать мой сервер.

Схема работы простая. Железка находится в deep sleep и просыпается согласно заданного таймаута. Подключается к wifi, и делает один запрос на мой сервер. Который асинхронно собирает данные из внешних сервисов, устанавливает через какое время проснуться снова, конвертирует все в JSON формат и отдает обратно в железку. Она парсит данные, рисует что умеет и засыпает. Т.е. основная работа и формирование данных происходит на сервере. Можно парсить несколько разных источников и агрегировать в одну схему все данные. Железка выступает только в роли представления этих данных.

// Weather station data format
export type DeviceResultRequest = {  
  sleepSeconds: number  
  blocks: {  
    total: number  
    items: DeviceItem[]  
  }  
  isDev?: boolean  
  devSleep?: number  
}
Схема работы погодной станции
Схема работы погодной станции

Питание организовано с помощью одной банки 18650 на 3400 мАч. Заряда хватает до 7 месяцев. При достижении порога напряжения, на экране пишется, что требуется зарядка и железка выключается. Иногда думаю накатить оптимизаций и увеличить время работы до года или больше. Но пока не сильно напрягает вечером разок зарядить одну банку.

Висит на полке у входной двери на уровне глаз.
Висит на полке у входной двери на уровне глаз.

Да, забыл самое важное. Зачем нужен такой огород? Ведь у каждого в кармане и так есть личная погодная станция и даже больше. Практика показала, что проще кинуть взгляд на такой экран в прихожей. И увидеть циферки с температурой, скоростью ветра и погодой на день или два, чтобы понять, что идти в одной футболке - может быть не самой лучшей затеей.

Все исходники тут: https://github.com/dudiq/weather-station-serv

Esphome

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

Часть витой пары идет из стены, часть с потолка. Ибп питает и сервер и слаботочный щиток.
Часть витой пары идет из стены, часть с потолка. Ибп питает и сервер и слаботочный щиток.

Когда писал первые версии прошивки, то конечно находил различные варианты уже готовых систем или подходов организации контроллеров. Также встречал Esphome/Tasmota. Но тогда мне было интересно самому разобраться как организовать работу девайса так, чтобы он был стабилен и не требовал к себе дополнительного внимания. Когда количество железок увеличилось до трех и набор датчиков увеличился в два раза, то стало понятно, что тут уже не обойтись прошивкой по воздуху. Гораздо удобнее сидеть на рабочем месте, нежели чем бегать по квартире с проводами и обновлять каждую железку. Так потихоньку моя прошивка ушла в архив и появилась реализация конфига на Esphome.

Смысл заключается в том, что за счет yaml файлов, можно собрать прошивку, которая уже будет готова работать с HA и MQTT. Учитывая что железная часть прошла обкатку и не выкинула проблем, то переход на Esphome прошел безболезненно. Все датчики подключились, сразу же появились в HA и оставалось только перенастроить автоматизации.

Все выглядит как-то очень красиво и достаточно просто настраивается. Но ложку дегтя подложил внезапно wifi. Дом многоквартирный и количество сетей достаточно большое на квадратный метр. Учитывая что канал связи 2.4Ghz забит, то реконнекты и отваливания железок - предсказуемое поведение. Все что можно сделать, это уехать за город затюнить максимально роутер и конфиг для железок. И учитывать время на переподключения при настройке автоматизации по мониторингу. Пока играюсь power_save_mode в конфигах и выставил ширину канала в 20Mhz у роутера. Если железка не доступна более чем 5 минут - сервер отправляет уведомление в телеграм.

Пример конфига https://gist.github.com/dudiq/07853d504a1bf6eae5e32ff938ace816

Сервер и автоматизации

Очередной этап модернизации пришелся на сервер и его окружение. В первую очередь в роутере настроил отдельную wifi сеть под IoT устройства. Выход в глобал есть только у сервера, всем остальным - доступ запрещен. После взял SSD на 500Гб стал уже настраивать сам сервер. Сервисы сразу поднимал через docker. Не хватало только нормального роутинга на тот или иной сервис. Все было в формате home.local:PORT_NUMBER. А хотелось что-то типа ha.home.local. В процессе поиска нашел разные варианты развертывания окружения. Кто-то ставит proxmox, кто-то через тот же docker и traefic/nginx-proxy-manager разруливает роутинг. Выбор пал на связку docker+traefic. А за ним подоспели и остальные: portainer, watchtower, jellyfin, glances. При переносе сервера на новое железо, развернуть снова будет легко Ubuntu + docker compose up. Супер просто и удобно.

docker-compose и тупой dashboard https://github.com/dudiq/ha-serv

Чтобы быть уверенным в том, что домашний сервер работает и с ним все хорошо, нужно организовать так называемый heartbeat. Суть достаточно простая. Мой сервер раз в 5 минут делает POST запрос на внешний сервис и если в течение 15 минут никаких запросов не было - прилетает письмо, мол что-то пошло не так. Таким образом если вдруг выключат электричество или отрубится интернет в квартире, я буду об этом знать. И нужно предпринимать какие-то действия. Если конечно не пропущу это письмо.

alias: heartbeat server
description: ""
trigger:
  - platform: time_pattern
    minutes: /5
condition: []
action:
  - service: rest_command.heartbeat_server_ping
    data: {}
mode: single
rest_command:
  heartbeat_server_ping:
    url: "https://cronitor.link/p/<ID>"

Дальше подошла очередь на доступ к состоянию системы извне своей локальной сети. Выставлять наружу веб интерфейс нет никакого желания. Поэтому пригляделся вариант настройки через телеграм бота. По умолчанию HA имеет под капотом возможность интеграции с телегой. Те же датчики протечки или уровень СО2 уже работали и сервер отправлял сообщения при достижении пороговых значений. Но не хватало двунаправленного канала связи. Особенно поймут те, кто уходит из дома и возвращается обратно спустя пару минут. Думая, что забыл закрыть. Так добавил автоматизации на получение статуса девайсов и значения по некоторым критичным датчикам (протечки, температура отопления). Плюс появился еще один датчик закрытия входной двери через концевик. Моя кукуха на этом абзаце передает привет.

Ответ от бота в телеге
Ответ от бота в телеге

Уведомления стоит отправлять только на те события, которые явно требуют действия. Остальное это шум, который не должен отвлекать. Согласно этой концепции, получается что система автоматики должна быть не видна, делать рутину и занимать минимальное время на обслуживание. В таком подходе даже нет необходимости настраивать HA dashboard и выводить датчики и показания. Все настраивается сценариями работы. А система только просит внимания при важных событиях.

alias: Alert Leak automation
description: ""
trigger:
  - platform: numeric_state
    entity_id:
      - sensor.bathroom_waterleak
      - sensor.waterleak
      - sensor.kitchen_waterleak
    below: 1
    for:
      hours: 0
      minutes: 0
      seconds: 5
condition: []
action:
  - service: notify.important_telegram_alerts
    data:
      message: ? Протечка в {{trigger.to_state.attributes.friendly_name}}! ?
  - wait_for_trigger:
      - platform: numeric_state
        entity_id:
          - sensor.bathroom_waterleak
          - sensor.waterleak
          - sensor.kitchen_waterleak
        above: 0.9
    continue_on_timeout: true
  - service: notify.important_telegram_alerts
    data:
      message: ? Протечка {{trigger.to_state.attributes.friendly_name}} локализована
mode: single

Пример HA автоматизации по протечкам и отправка сообщений в телеграм группу

Уведомления, что есть в системе:

  • Протечка где-либо

  • Высокий уровень СО2

  • Падение температуры в батареях по зиме (Отопление поквартирное)

  • Отправка письма на email при недоступности сервера

Еще один важный момент. Есть два канала связи в телеге. Первый это группа для жильцов квартиры. Туда прилетают только самые важные уведомления. А второй канал - это служебная информация и управление - директ с ботом. Туда валится например история, если какой либо девайс отвалился и обратно вернулся в строй. То, что нужно для дебага или управления автоматикой. Например запросить состояние системы и узнать показания датчиков.

Отдельно напишу про Node-RED. Система гибкая и позволяет выстроить всевозможные схемы автоматизации. Много плагинов, а так же можно самому писать скрипты. Но не зашло. Не хватает типизации. Непривычно писать в функциональном стиле автоматику и думать про разные потоки данных. Решил что моих тупых сценариев с головой хватает описать в стандартном блоке HA и куда проще отлаживать или переделать. И поддержка скриптов. Если кода получится очень много, то возвращаться спустя полгода - скорее будет сложновато.

На мой взгляд, автоматизация должна быть максимально тупой, простой и легко поддерживаемой. Без всяких умных колонок, выключателей, светильников, внешних облаков и завязанных внешних вендоров, а также ассистентов. В идеале один раз настроил, покрыл необходимые кейсы. И больше к никогда не притрагиваться. Или если что-то нужно поправить, то не вспоминать полный путь прохождения сигнала от датчика, обработку и действие. Опять же зависимости. Контекст со временем забывается и замыливается, а тратить время на прохождение и вспоминание, что к чему и куда ведет - кажется пустой тратой времени. Конечно если цель - разобраться как все работает, то само собой это оправдано. Но если цель автоматизация и упрощение быта - все должно быть простым как валенок.

Все схемы подключения различной периферии.
Все схемы подключения различной периферии.

Заключение

Осталось придумать корпус, чтобы все хозяйство было упаковано и красиво смотрелось в углу комнаты или под шкафом каким. Также хочется перевести с Wifi на Matter, чтобы хоть немного разгрузить радиоканал. Относительно недавно появилась возможность нового протокола на базе ESP32C3. Но пока не исследовал поддержку в Esphome и опять же нужно придумать переходник на текущие устройства.

В планах перевести большинство сенсоров на I2C шину. Как пример отказаться от MH-Z19B и перейти на SCD41. Проще использовать только 4 общих контакта от контроллера и через них управлять устройствами, а не занимать все ноги.

Хотелось бы конечно настроить еще принудительную вентиляцию через приточку и разобраться с проветриванием помещения, отопления и поддержанием уровня влажности. Но это далеко идущие цели. И тут уже нужны профильные люди, для расчетов. Так что пока довольствуюсь тем что уже сделал.

Во сколько обошлась вся затея?

Поскольку проект растянулся на несколько лет, то сказать сколько стоила система целиком - сложновато. Но попробовал составить таблицу исходя из цен на январь 2024.

Базовый набор на 6 устройств, сервер и обвязка:

р.

ед.

р.

USD

WEMOS D1 MINI (esp8266)

140

6

р.840

$10,04

MH-Z19B

1500

3

р.4 500

$53,81

AHT21

90

6

р.560

$6,70

Screen OLED SSD1306

130

3

р.390

$4,66

Screen OLED SSD1309

500

3

р.1 500

$17,94

Led strip Ws2812D

250

2m

р.500

$5,98

BH1750

54

6

р.324

$3,87

DS18B20

120

6

р.720

$8,61

MH-sensor-series (Raindrops Detection)

60

3

р.180

$2,15

PIRO AM312

50

6

р.300

$3,59

SMD1206 resistors

300

1pac

р.300

$3,59

SS8550 transistors

100

1pac

р.100

$1,20

DC-DC 3A 5V stepdown

6

60

р.360

$4,30

PCB Prototype v1

10

1

р.836

$10,00

PCB Prototype v2

36,8

1

р.3 078

$36,80

Metal box

2000

1

р.2 000

$23,91

Connectors

500

1

р.500

$5,98

AC-DC Driver 12V 5A IP67

2000

1

р.2 000

$23,91

Server (Atom N3350)

7168

1

р.7 168

$85,71

р.26 156

$312,74

Тут еще не хватает e-ink esp32, бухты кабеля, ИБП и прочей мелочевки.

Было любопытно отследить то, с чего начиналась эта маленькая затея и то, к чему пришла. Понял, что когда делаю какой либо проект, нужно отмечать прогресс или регресс по нему. Дабы спустя время сделать оценку результата и двигаться дальше. Нужно больше заметок на полях, пометки с фотофиксацией и датами. Куда проще потом собирать этапы проекта. Trello с карточками появился на моменте первой печатной платы, когда задачек стало много. Но похоже надо было после завершения карточки делать еще и фото, перед тем как отправить в столбец done.

Таким вот незамысловатым способом из одной железки мониторинга уровня СО2 получилось дорасти до полу-умной квартиры, управляемой с помощью HA и MQTT. В процессе сталкиваясь с различными проблемами, удалось создать функциональную и настраиваемую систему. И благодаря наличию open-source - создавать подобные штуки по типу "сделай сам" стало кудааа проще, чем когда-либо.

Комментарии (31)


  1. Javian
    11.04.2024 13:55

    К слову об i2c тоже думал. Привлекательно выглядит при строительстве или ремонте уложить только двухжильный провод.


    1. Serge78rus
      11.04.2024 13:55
      +5

      Лучше все таки использовать вещи по прямому назначению - I2C предназначен для коммуникаций внутри платы, для вытаскивания "наружу" есть другие интерфейсы, например, тот же RS485.


      1. Javian
        11.04.2024 13:55

        У меня в серверных температура собирается лет 15 по одному трехпроводному кабелю, на котором несколько датчиков 18b20. Правда и датчики и адаптер USB-i2c c маркировкой "Made in USA".


        1. serafims
          11.04.2024 13:55
          +5

          1Wire это не I2C, первый специально сделан для длинных линий.


          1. Javian
            11.04.2024 13:55

            Попутал :)

            Точно он https://habr.com/ru/articles/529720/


        1. Lorindo
          11.04.2024 13:55

          1-wire и i2c существенно отличаются. В i2c есть линия синхронизации тактово частоты а у 1-wire нет. Устройство на удалении получит сигнал синхронизации (SCL) с существенным запозданием, которое будет превышать допустимый порог для работы протокола и данные от удаленного устроства (SDA) будут приходить не сихронизированно с тактовой частото. Тем самым у вас не будет работать передача данных. Это все будет происходить потому что существует физическая задержка в передаче сигнала по проводам.

          К слову, для автора первого комментария. I2C требует не 2 провода а 3. SDL, SCL и GND(земля). 1-Wire можно путить по 2 двух проводной схеме с паразитным питанием, но это будет уменьшать скорость передачи, что в принципе может и не критично.

          RS-485 так же работает по 3 проводам: A, B, GND. Минус RS-485 в том что нужно ставить устроство которое будет передавать сигнал с устройства в RS-485, но есть готовые платы RS-485<->I2C, RS-485<->UART, RS-485<->SPI.


          1. tklim
            11.04.2024 13:55

            Устройство на удалении получит сигнал синхронизации (SCL) с существенным запозданием, которое будет превышать допустимый порог для работы протокола

            При 100метрах задержка будет 0.6мкс при том что по стандарту 5мкс, вроде, на ответ. Проблема тут в помехозащищённости и самое главное - ёмкости кабеля.

            А если говорить про 1wire - у него ровно такие же проблемы с задержками, просто скорость в разы меньше.


            1. Lorindo
              11.04.2024 13:55

              Время ожидания в 5ms не связано с данной проблемой. У вас будет рассинхронизация SCL и SDA на каждом бите.

              Если интересно почитайте статью: "Extending the SPI bus for long-distance communication". Суть проблемы там раскрыта и приводится пример решения.

              Но смысла в этом решении нет если можно выбрать протокол в котором уже заложена возможность передачи на большие растояния, например RS-485.


              1. tklim
                11.04.2024 13:55

                Не будет рассинхронизации. В приведенной статье упоминается SPI с битовой скоростью 1-20мбит/с. Там да, задержка на 100метровом кабеле будет в ~1 бит на 1мегабите и ~10бит на 10мбит/с.

                У i2c стандартная скорость - 100кбит/с - так что задержка <0.1 бита. У 1w скорость порядка 15кбит/с, так что там будет чуть надёжнее.


            1. tmxx
              11.04.2024 13:55

              При 100метрах задержка будет 0.6мкс при том что по стандарту 5мкс, вроде, на ответ. Проблема тут в помехозащищённости и самое главное - ёмкости кабеля.

              а какая проблема в емкости кабеля?


    1. plyatov
      11.04.2024 13:55
      +1

      Не стоит возлагать на шину I2C больших надежд для передачи данных по длинным линиям.

      Она рассчитана на линии 5-10 см.

      Еще протоколы передачи данных 99,9% I2C устройств не имеют контроля целостности данных.

      Если всё же не послушаете совета, то получите кучу разнообразных проблем возникающих со случайной периодичностью и отсутствием возможности их решить без костылей. Частенько можно даже не заметить, что по шине I2C данные передаются с ошибками.

      Применяйте RS-485 с протоколом MODBUS RTU и всё у вас будет хорошо на длинных линиях.


      1. tmxx
        11.04.2024 13:55

        Вообще, I2C применяется для контроля внутри серверных стоек с протоколом SMbus.

        Обычно с усилителями шины, насколько я помню.


        1. safari2012
          11.04.2024 13:55
          +1

          плюс, это часть VGA интерфейса.


        1. plyatov
          11.04.2024 13:55
          +1

          Не передергивайте. Я вам про "самолет АН-2", вы мне про "Airbus".

          SMbus - это не тоже самое, что I2C. Из общего у них только трех-проводная шина (SCL, SDA, GND).
          SMbus 1.1 имеет Packet Error Checking в протоколе, а I2C нет.

          Длина линий передачи в серверной стойке не сравнима с длиной линий в "умном доме". И сами же про усилители (повторители) шины написали.

          Преимущества МODBUS RTU поверх шины RS-485 перед шиной I2C:

          1. Дифференциальная шина. Отсюда и повышенная помехоустойчивость.

          2. Контроль ошибок с помощью CRC.

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


          1. tmxx
            11.04.2024 13:55

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

            Не зная структуры, трудно оценить длину сети. Вдруг есть необходимость контроля температуры в шкафу автоматики, например. И даже в этом случае не стоит забывать про усилители, потому что IIC - для связи между микросхемами на плате, как следует из названия.

            SMbus - это не тоже самое, что I2C. Из общего у них только трех-проводная шина (SCL, SDA, GND).

            Мы с разработчиками спецификации не согласны: "The SMBus and I²C bus are very similar and are generally interoperable". Что касается PEC - это уровень протокола.

            Но в целом, я согласен с вами, что RS-485 + Modbus RTU гораздо лучше подходит для целей домашней автоматизации. В том числе, для данного конкретного случая.


        1. Lorindo
          11.04.2024 13:55

          Серверная стойка она очень компактная, в неё расстояния между связываемыми устройствами измеряется в десятках см. А значит это в рамках того на что расчитан протокол, разве не так?


          1. tmxx
            11.04.2024 13:55

            Серверная стойка не такая уж компактная - если вести провода по кабельным каналам может быть и 5 м.

            Надо различать i2c и SMbus - физически это шины с аппаратными адресацией и арбитражом на монтажном ИЛИ.

            i2c - для обмена между ИМС на плате, более скоростной и с меньшей нагрузочной способностью. При этом протокол определяется устройствами - EEPROM или ADC, например, абсолютно разные. Длина - максимум десятки см (зависит от скорости).

            SMbus кроме физических уровней с повышенной нагрузочной способностью содержит описание протокола и формата пакетов, в том числе упомянутый PEC CRC-8. Длина - единицы метров.

            Использование чистой i2c для обмена вне платы/системной шины чревато непредсказуемыми граблями, как справедливо заметил plyatov.


      1. Lorindo
        11.04.2024 13:55

        I2C это протокол который обеспечивает передачу бит, более конкретно 8 бит за один frame. Контроль целостности данных это уже следующие уровни. RS-485 точно так же не проверяет целостность данных.

        По i2c можно так же передавать MODBUS RTU и другие протоколы более высокого уровня. MODBUS RTU это просто описание последовательности бай в сообщении.

        Возвращаясь к i2c, можно без проблем передавать последовательно некоторое кол-во байт, в которых первая часть будет данными а последние N байт контрольной суммой.


        1. tmxx
          11.04.2024 13:55

          Собственно, вы начали разрабатывать SMbus


          1. Lorindo
            11.04.2024 13:55

            Отправка байтов в переферийное устроство и подсчет для них CRC, это базовая операция которая пишется в почти любом embedded и реализуется в 10 строках кода. Это очень далеко он начала разработки своего протокола.


        1. plyatov
          11.04.2024 13:55

          Можно конечно пользоваться и SMbus, если сильно хочется, что не утерпеть. Но зачем?

          Используя же RS485+MODBUS RTU, можно воспользоваться кучей готовых датчиков и исполнительных устройств созданных именно для "умного дома".

          А для SMbus еще попробуй найди эти устройства в продаже.


  1. tmxx
    11.04.2024 13:55
    +5

    Подозреваю, что следующая статья будет называться "Ремонт полоумной квартиры"


    1. idudiq Автор
      11.04.2024 13:55

      Ремонт по случаю укладки очередного кабеля если только)


  1. Apv__013
    11.04.2024 13:55
    +1

    Ну или просто кондиционер на режим "авто провеетривание"


    1. idudiq Автор
      11.04.2024 13:55

      Не каждый кондиционер поддерживает забор воздуха с улицы


  1. serafims
    11.04.2024 13:55

    А как вы документируете все, что сделано, как работает и как подключено?


    1. idudiq Автор
      11.04.2024 13:55
      +1

      Тут скорее всего несколько моментов стоит обозначить.

      Есть общая схема, приводил в статье выше. А есть уже какие-то отдельные девайсы со своими конфигами под каждую комнату. Конфиги храню в Github, схему держу в Obsidian (+excalidraw plugin). Точка входа в понимание общих схем будет Obsidian. А дальше уже по ссылкам перехожу и нахожу нужную ноду. Так же для макеток и электросхем использую EasyEDA.


  1. zbara65
    11.04.2024 13:55

    Туя / Смарт лайф рулят ) ничего не понял но очень интересно)


    1. idudiq Автор
      11.04.2024 13:55

      Если их отвязать от клауда (та же localtuya интеграция), то еще можно подумать. А так совсем не хочется делать у себя дома привязку к внешним сервисам, которые завтра могут прикрыть доступ и все превратится в тыкву


      1. riky
        11.04.2024 13:55

        Zigbee туй напрямую подключаются к моему НА через z2m


  1. vint59
    11.04.2024 13:55

    MH-19 также имеет аналоговый выход, так что можно сразу в компаратор или в оу, а дальше например управлять вентилятором или форточкой