Я упоминал Raspberry Pis в нескольких своих недавних постах. Я продолжаю находить странные вещи в этих системах. Спрашивается: почему я вдруг возился с этими странными коробочками? Ответ включает в себя историю отопления и кондиционирования воздуха.
Во-первых, мне нужно вернуться и рассказать историю о том, что произошло, возможно, 10 лет назад. Я услышал ужасный шум, исходящий из внутреннего блока, где находится вентилятор. Это было похоже на вытекающую воду, и я наполовину ожидал, что потолок просто откроется и зальет все помещение. Этого не произошло, но на этом мой горячий воздух закончился. С этого момента он больше не будет производить тепло для помещения.
Я сообщил об этом обслуживающему персоналу в этом здании. На самом деле они сказали мне «нажать кнопку вверх». Вы знаете кнопку на термостате, которая переключает температуру с 70 на 71 и на 72? Фактическая целевая температура? Да. Они сказали мне настаивать на этом… и не проводили дальнейшего расследования . Тот факт, что он издал ужасный шум прямо перед остановкой, на них не повлиял. Тот факт, что я нормально эксплуатировал эту систему в течение пяти лет на тот момент и знал, как работает чертов термостат, никак не повлиял на них.
В конце концов мне пришлось изложить свое дело перед административным персоналом, и они пришли с настоящими техниками HVAC. Меня не было там, когда это произошло, но позже я узнал, что с этой штукой действительно была проблема механического типа. Другими словами, это не было ничего, что термостат мог бы когда-либо «исправить».
Я мог бы поставить эту штуку на 90, и она бы просто раздула воздух. Очевидно. Я знал это, но они отказывались принимать меня за чистую монету до тех пор, пока я не сошел с ума. ВТФ? (Я имею в виду, я точно знаю, почему. Но если я изложу это в письменной форме, на меня нападет кучка 12-летних. Так что я собираюсь обсудить это, и около 50% взрослых в комнате узнают о чем я буду говорить. Это абсолютно верно.)
Перенеситесь на несколько месяцев назад. У меня другое помещение в другом здании, и на этот раз кондиционер не справился со своей задачей. Я не хочу, чтобы какая-то хрень повторилась. Конечно, на этот раз это будет “стрелка вниз”, но у меня этого нет. Мне нужны были достоверные данные, которые они не могли опровергнуть.
С этой целью я приобрел несколько беспроводных датчиков типа «метеостанции». Обычно люди получают их, когда покупают так называемые «атомные часы» (это длинноволновое радио, большое вам спасибо), «метеостанцию», которая показывает как внутреннюю, так и внешнюю температуру и фактически может синхронизировать время с передачей 60 кГц . Вы паркуете одну часть (с большим дисплеем) внутри, а другая часть выходит наружу.
Внешние детали имеют тенденцию часто ломаться, поэтому существует процветающий бизнес по продаже запчастей. Я взял несколько из них и занялся. Один из них был беззастенчиво привязан к вентиляционному отверстию. Еще один был припаркован рядом с системным термостатом, а третий был размещен снаружи.
Есть эта программа под названием rtl_433, которая будет использовать дешевую USB-флешку SDR (программно-определяемое радио) за 20 долларов для приема и декодирования сигналов. Я взял это, убедил его выдать какой-то не совсем ужасный вывод и начал обертывать его для своих собственных целей. Затем я установил его на пару Raspberry Pis и поставил сверху RPC-сервер.
Почему несколько Пис? Ну и пара причин. В первую очередь хотелось разнообразия в своих радиоприемниках. Поместив их в разные места, я, вероятно, мог бы получить хорошее декодирование от одного, даже если что-то мешало ему добраться до другого. Это также позволяет мне обновлять, обновлять или даже перезагружать (!) их, если я делаю это по одному. Системы Raspberry Pi просто сидят и слушают радио (433 МГц), декодируя все, что могут. Если он выглядит как датчик, то он сохраняет эту информацию в памяти и запоминает, когда он ее услышал. Затем, если что-то запрашивает его по сети, он выкашливает все данные. У каждого датчика есть «идентификатор» и «канал», а также фактические значения температуры и влажности, и, наконец, есть значение возраста.
На моем Debianized Mac Mini работает еще одна часть этой системы. Примерно каждые 15 секунд он связывается с Pis и спрашивает их, что случилось. Теоретически у них обоих будет одинаковый набор данных, но на практике он может немного отличаться. Это отлично. Он знает, что это произойдет, и просто хранит новейший образец для всех датчиков, которые ему действительно интересны. Теперь вы знаете, почему у меня есть это поле «возраст»!
И да, «датчики, о которых он заботится», важны. Так как это нелицензионная полоса, и эти вещи довольно популярны, мои радиоприемники часто улавливают другие, выглядящие правдоподобно передачи из ближайших источников. Они непоследовательны, но они существуют.
Если у нас есть хорошие данные, которые не слишком устарели для датчиков, о которых мы заботимся, тогда эти точки данных сбрасываются как строки в базу данных Postgres на Mac mini. Затем он уходит в сон еще на 15 секунд или около того. Достаточно легко.
Было важно быстро добраться до этой стадии. Любые колебания температуры, которые вы не измеряете и не записываете, исчезают навсегда. Любые точки данных, которые вы не получаете из эфира, исчезают навсегда. Каждый раз, когда вы не опрашиваете «радиосервер» на Pis, эти сэмплы исчезают навсегда. Самым важным для меня было получить длинный поток непрерывных данных, чтобы я мог аргументировать свою позицию.
Зачем измерять и комнату, и вентиляцию? Это легко. Когда переменный ток включен, должен быть значительный перепад от одного к другому. Недостаточное падение означает, что либо система сломана, либо на улице так невероятно жарко, что он не может отвести тепло, когда прокачивается через змеевики. Поэтому у меня третий датчик снаружи: он мне говорит, какая температура прямо здесь, в здании — не в одном из аэропортов и не в каком-то идеальном случае. Он находится прямо здесь, в том же городском «тепловом острове», в котором находится внешняя половина системы HVAC. (И нет, внешний датчик не находится в месте, где внешняя система может влиять на него.)
Только так я мог показать, что падения не было вообще, несмотря на то, что (гиперлокальная) наружная температура была вполне разумной. Это должно было давать мне холодный воздух. Это не так. Там все было в цифрах. Я думаю, они поняли, что должны относиться ко мне серьезно, так как я получил план замены всего устройства. Для этого потребуется проделать гигантскую дыру в потолке, вытащить существующий блок, а затем установить совершенно новый блок.
Так вот, это произошло во время этих махинаций с «цепочкой поставок», так что это заняло *месяцы*, чтобы получить, и все это время я просто сидел здесь, выходил из системы, деловито собирая точки данных. В конце концов мне надоело смотреть на необработанные журналы, а затем запускать SQL-запросы, поэтому я начал с некоторых визуализаций.
Мой первый подход состоял в том, чтобы написать очень простую веб-страницу, которая в основном выполняла трюк «мета-обновления» 1995 года. Это будет IMG SRC программа CGI. Эта CGI-программа просто обратилась к базе данных, запросила у нее последние N часов, отобразила ее в виде графика в формате PNG, а затем отправила на стандартный вывод. Это дало мне хорошее графическое представление со всеми тремя датчиками, использующими один и тот же масштаб, и было легко увидеть, что происходит (и не происходит).
Это работало нормально, но это раздражало. Перезагрузка всей страницы в стиле 1995 года означала, что она мерцала, когда все возвращалось каждый раз. У него были фиксированные ширина и высота, и в основном он работал только в моем обычном окне веб-браузера на моей единственной машине. Если я загружал его откуда-то еще, то это выглядело неправильно.
Это был действительно дрянной рендерер, но это было только начало. Это выглядело так:
Вот как выглядит пространство, когда оно просто «свободно вращается». Я предполагаю, что периодические всплески связаны с циклом разморозки в ближайшем морозильнике, но я никогда не удосужился доказать это окончательно. Что касается больших циклов, то это просто то, что происходило с людьми, которые приходили и уходили, светило ли солнце в окна или нет, и тому подобное.
Помимо некоторых небольших улучшений (например, вертикальные полосы для часов), это то, что я использовал в течение нескольких месяцев. Затем однажды у меня возникла эта странная идея: что, если бы это было отрисовано на стороне клиента на холсте в JavaScript? Это позволило бы ему адаптироваться к любому размеру страницы, и он мог бы вычислить, как далеко вернуться назад, сохраняя при этом разумную плотность — то есть, сколько секунд готовит каждый горизонтальный пиксель?
Так что, когда я упомянул, что некоторое время назад делал что-то на JS, это тоже не было преувеличением. На самом деле я пишу это, потому что в этом вопросе действительно нет выбора. Если вы хотите делать такие вещи в браузере, это или ничего.
Во всяком случае, вот во что все превратилось (показывает снаружи):
Самое интересное в этом то, что я полностью злоупотребляю веб-сервером на этом Mac Mini, хватая угол окна моего браузера и вращая его. Эта штука перерисовывается повсюду и генерирует кучу запросов на свежеагрегированные данные с новыми настройками. Я не беспокоился об ограничении скорости или отмене дребезга каких-либо из них, поскольку я использую их только я, и я могу генерировать все запросы, которые захочу.
Вы не можете видеть это на этом втором снимке экрана, но я даже зашел так далеко, что проделал некоторую магию при наведении курсора, чтобы он установил НАЗВАНИЕ холста на значение температуры при любом смещении по оси X, на котором я нахожусь. Так что, если я замечу какой-то странный пик и захочу узнать это значение, укажу на него и немного подожду, пока всплывающая подсказка сразу же ответит на этот вопрос.
Фактическая замена произошла некоторое время назад, и теперь пространство снова управляется должным образом. Я не прекращал следить за этим, потому что, а, почему бы и нет. На это по-прежнему интересно смотреть, и, кроме того, это может повториться.
…
С точки зрения движущихся частей здесь это выглядит так:
Два Raspberry Pi: один 3B, один 3B+, которые у меня только что были. Стандартный Raspbian устанавливается, хотя и с большим количеством удалений «WTF это? До свидания». Я выбросил целую кучу посылок, которым нечего было там делать.
Две флешки RTLSDR, которые у меня тоже были: по одной на Pi.
rtl_433, который доступен в apt как «rtl-433». Он настроен на вывод JSON, так как это был наименее неприятный результат, который я мог получить от него. (Это все еще раздражает. Как-нибудь спросите меня о числах и символах для сенсорных каналов.)
Мой собственный «thermo_server», который выполняет функции pipe/fork/dup2/exec для переноса rtl_433, а затем сидит там, анализируя вывод и сохраняя его в памяти в одном потоке. Затем мой существующий мусор RPC передает эти данные авторизованным клиентам. Он использует jansson для обработки JSON, поскольку код для использования уже существует в других проектах.
О Mac Mini: это коробка Debian, как упоминалось ранее. Есть постгрес и апач. Он также запускает мой «thermo_logger», который знает, как время от времени проверять процессы «thermo_server» по сети (с мусором RPC). Затем он сбрасывает пригодные для использования данные в базу данных: INSERT INTO x … что угодно. Достаточно легко.
Кусок HTML и еще один кусок JS, который генерирует запросы к серверу и отображает точки данных в виде разумного графика. Также есть немного CSS, чтобы сделать его именно таким.
Программа CGI, невообразимо названная «данными», которая на самом деле берет эти запросы из выноски JS, обращается к базе данных, а затем передает их запрашивающему. Он тоже использует jansson, потому что JSON, потому что веб-браузеры. Это в основном единственное место, где это имеет немного смысла.
…
Итак, да, вот оно: я написал систему мониторинга температуры, чтобы не допустить плохого обращения со стороны обслуживающего персонала. Забавно, как это работает.