Сяоми будет не Сяоми, если не придумает очередной гаджет, которого еще не было ни у кого. На этот раз возникла идея совместить технологию E-Ink, которая используется в электронных «читалках» и домашний термометр-гигрометр. Посмотрим, что получилось.
У экранов E-Ink, помимо того, что они ничего не излучают, имеют идеальную контрастность и, практически, не бликуют, а, соответственно, наиболее близки, по визуальному отображению информации, к обычной бумаге, есть еще два неоспоримых преимущества: крайне низкое энергопотребление (т.к. энергия тратится только на перерисовку измененных элементов) и отличная обзорность при любом угле зрения. Все эти преимущества присущи и обзорному девайсу.
Как и любой товар Саяоми, упаковку сложно спутать с каким-либо другим брендом (разве, что с продукцией Apple):
Распаковка #3 Метеостанция Xiaomi Mijia Bluetooth
Внутри:
Комплектация:
— термометр (с батарейкой),
— подставка,
— липучка,
— магнит (на липучке)
— бумажка на китайском.
Внешний вид девайса (символы на дисплее — это не наклейка а изначально заданное «заводское» изображение):
С обратной стороны:
На боковой стороне отверстия для «забора наружного воздуха»:
Характеристики:
Модель: MHO — C201
Экран: E-lnk (Wide viewing angle)
Диапазон измеряемой температуры: 0 ℃ ~ 60 ℃
Диапазон измеряемой влажности:0 ~100%
Точность: ±0.3℃ и ±3%RH
Питание: CR2032 Button Battery (срок службы около 1 года)
Размер, небольшой квадратик 6.5х6.5см с цифрами во весь экран:
Вес:
Комплектные аксессуары. Подставка:
Магнит и наклейка:
Купил МЕТЕОСТАНЦИЮ Xiaomi | Распаковка и обзор
Инструкция
Вытаскиваем пластиковый язычок блокирующий трехвольтовую батарейку, аппаратец проводит самотестирование…
… и, практически, сразу видим показания текущей температуры и влажности. Кстати, дисплей, в отличии от электронных книг закрыт прозрачным стеклом (ну или пластиком):
Измерения температуры он проводит, примерно, раз в 5 секунд, меняя информацию на дисплее, проверял когда подышал в отверстия датчика.
Смайлик на экране интерактивный и, в зависимости, от измеренных параметров, меняет свое «настроение»:


Вот ему «жарко»:

Вот ему «влажно»:

А вот ему «так себе», когда поставили в холодильник:

Решил рискнуть и засунуть в морозилку (хотя, заявлено, что условия эксплуатации 0-60°С и был риск повредить этим дисплей).
Тестирование морозом
Оказывается и минус измеряет тоже!
Пара минут в морозилке:
Но измерения идут, примерно, до -8°С, дальше дисплей замерзает и «замирает». После получаса в морозилке (рядом термометр на жидких кристаллах):
После вытаскивания из морозилки я думал, что девайсику совсем поплохело, температура росла, а дисплей в норму не приходил:
Однако, примерно, через 3 минуты прибор перезагрузился (черный, потом белый экран) и пришел в норму:

Умный 🙂
Сравнение измеренной температуры с другими термометрами:
Гигрометр проверить нечем.
На подставке:
Углы обзора:
Под направленным бликом из окна:
Задняя крышка отщелкивается и дает доступ к батарейке и переключателю с Цельсия на Фаренгейты:
Заглянем глубже внутрь:
Интересным является датчик, он совмещенный, измеряет и температуру и влажность, мне такой еще никогда не встречался:
Итог
Приборчик замечательный, через меня проходит много всяких девайсов, электронных и не очень, и вроде бы привык, но этот сделан настолько «мимимишным», что его все время хочется вертеть в руках. Низкое энергопотребление, отличная обзорность дисплея и крупные цифры, точность измерений. Отлично вписывается в интерьер. Минусы — цена (но можно найти дешевле) — электронная бумага дорогая.
На этом все.
Товар предоставлен для написания обзора магазином. Обзор опубликован в соответствии с п.18 Правил сайта.
Планирую купить +36 Добавить в избранное Обзор понравился +59 +86
- 27 марта 2018, 11:23
- автор: summerman
- просмотры: 19555
Источник: mysku.me
Домашняя метеостанция на esp8266 + aqara-xiaomi, часть 2
Прошло уже полтора года с момента, как я опубликовал свою первую статью про мой проект Домашней метеостанции. За это время я получил многочисленные отзывы от читателей насчет функциональности и безопасности системы, а так же исправил порядочное количество багов, которые обнаружились при установке и развертывании системы у других пользователей (спасибо самым активным пользователям — HzXiO, enjoyneering, dimitriy16).
Но это всё лирика, пора к делу!
Итак, что было сделано в новой версии системы.
Железячная часть (на esp8266):
- Полностью переписан код системы: теперь повсеместно используется ООП для работы с сенсорами и дисплеями, для того, чтобы максимально упростить добавление новых датчиков, и сделать код понятным и структурированным
- Учтены пожелания касательно безопасности системы
- Упрощены страницы настройки модуля
- Удалены зависимости на RTC
- Изменен алгоритм рисования графиков — используется фильтр Калмана
- Каждый пользователь системы теперь видит исключительно свои модули
- Можно давать свои названия сенсорам, управлять их видимостью на страницах
- Добавлена возможность просмотра данных с датчиков температуры-влажности производства Aqara-Xiaomi.
1. Программа в виде портянки из 1000+ строк кода стала совершенно нечитаемой, слишком сложно стало ориентироваться в этом коде, слишком сложно и затратно по времени стало проверять и отлаживать изменения. Поэтому код был переписан — появились базовые интерфейсы, объявляющие стандартные методы для работы с сенсорами и дисплеями, появились их наследники, реализующие логику, специфичную для конкретных моделей, а так же фабрики, ответственные собственно за создание нужных классов.
Покажу на примере:
#define sensorsCount 2 int sensorTypes[sensorsCount] = ; int sensorPins[sensorsCount] = ; SensorEntity** sensorEntities; SensorOutputData* outputDatas;
Здесь объявлено, что у нас есть два сенсора типа DHT22, подключенных к пинам 2 и 0, а так же объявлены массивы для классов-оберток над сенсорами, и для массива полученных от них данных.
DisplayEntity display = DisplayEntity(DISPLAY_LCD_I2C);
Аналогично объявлен и используемый дисплей — задан его тип.
Инициализация сенсоров и дисплея происходит в методе setup:
void setupSensors() < outputDatas = new SensorOutputData[sensorsCount]; sensorEntities = new SensorEntity*[sensorsCount]; for (int i = 0; i < sensorsCount; i++) < int sensorType = sensorTypes[i]; int pin = sensorPins[i]; SensorEntity* entity = new SensorEntity(sensorType); entity->setup(pin); sensorEntities[i] = entity; > > void setupDisplay()
На каждом цикле замера происходит получение данных с сенсоров и передача их на дисплей для отображения:
void requestSensorValues() < for (int i = 0; i < sensorsCount; i++) < SensorEntity* entity = sensorEntities[i]; SensorOutputData sensorData = entity->getData(); sensorData.sensorOrder = i; outputDatas[i] = sensorData; > > void renderSensorValues() < for (int i = 0; i < sensorsCount; i++) < SensorOutputData sensorData = outputDatas[i]; display.printData(sensorData); >>
Собственно, эти небольшие куски кода — и могли бы быть всей программой, если бы не работа с вай-фай или создание точки доступа на esp8266 для настройки модулей.
Как видно, если пользователю нужно поменять используемый сенсор, или подключить новый дисплей — это будет сделать очень просто: потребуется всего-лишь прописать их типы, и поменять конфигурацию пинов.
Если понадобится добавить новый тип сенсора или дисплея — то следует создать наследника от базового класса, и переопределить методы получения данных и их отрисовки.
2. Изменения в безопасности — теперь точка доступа, создаваемая модулем, имеет пароль, прописанный в конфиге при прошивке модуля — больше никто не сможет подключиться к модулю без ведома пользователя.
3. При отрисовке графиков на сайте теперь используется фильтр Калмана, чтобы убрать дребезг значений.
4. Теперь есть возможность управлять видимостью и названиями сенсоров на модулях — это можно сделать на странице настроек каждого модуля на сайте.
5. Основная возможность, добавленная в этой ревизии метеостанции — это поддержка работы с датчиками Aqara для экосистемы умного дома от Xiaomi.
Для реализации этой возможности понадобятся: шлюз умного дома, переведенный в режим разработчика, и собственно сами датчики температуры и влажности. Датчики надо подключить к шлюзу через приложение MiHome, далее — о приложении и великих китайских облаках можно будет забыть: обмен данными будет идти внутри локальной сети, которую желательно поместить в гостевой сегмент без доступа в интернет вообще.
Для того, чтобы получать данные, транслируемые между датчиками и шлюзом в локальной сети, я в своем проекте использую Малинку, на которой запущен модуль, написанный на nodejs. Модуль слушает мультикаст-сообщения, передаваемые в сети, парсит их на предмет поиска нужных датчиков, благо все данные передаются в формате JSON, и после поиска датчиков — вычленяет из сообщений данные о температуре и влажности.
Полученные таким образом данные — модуль отправляет на указанный в конфиге сайт для дальнейшего отображения и хранения.
Приведу код модуля и конфига — см. под катом:
Модуль и конфиг на nodejs
var request = require(«request»); var config = require(‘./config’); const dgram = require(‘dgram’); const serverPort = config.serverPort; const serverSocket = dgram.createSocket(‘udp4’); const multicastAddress = config.multicastAddress; const multicastPort = config.multicastPort; const sensorDelay = config.sensorDelay; var sidToAddress = <>; var sidToPort = <>; var gatewayAddress; function sendSensorData(sensorId, temperature, humidity, gatewayAddress) < request(< url: config.addDataUrl, method: ‘GET’, qs: < isaqara: 1, moduleid: sensorId, modulename: sensorId, code: config.validationCode, temperature1: temperature, humidity1: humidity, ip: gatewayAddress, mac: sensorId, delay: sensorDelay >>, function (error, response, body) < if (error) < console.log(error); >> ); > serverSocket.on(‘message’, function (msg, rinfo) < console.log(‘Received x1b[33m%sx1b[0m (%d bytes) from client x1b[36m%s:%dx1b[0m.’, msg, msg.length, rinfo.address, rinfo.port); var json; try < json = JSON.parse(msg); >catch (e) < console.log(‘x1b[31mUnexpected message: %sx1b[0m.’, msg); return; >var cmd = json[‘cmd’]; if (cmd === ‘iam’) < var address = json[‘ip’]; var port = json[‘port’]; gatewayAddress = address; var command = < cmd: «get_id_list» >; var cmdString = JSON.stringify(command); var message = new Buffer(cmdString); serverSocket.send(message, 0, cmdString.length, port, address); console.log(‘Requesting devices list. ‘); > else if (cmd === ‘get_id_list_ack’) < var data = JSON.parse(json[‘data’]); console.log(‘Received devices list: %d device(s) connected.’, data.length); for (var index in data) < var sid = data[index]; var command = < cmd: «read», sid: new String(sid) >; sidToAddress[sid] = rinfo.address; sidToPort[sid] = rinfo.port; var cmdString = JSON.stringify(command); var message = new Buffer(cmdString); serverSocket.send(message, 0, cmdString.length, rinfo.port, rinfo.address); console.log(‘Sending x1b[33m%sx1b[0m to x1b[36m%s:%dx1b[0m.’, cmdString, rinfo.address, rinfo.port); > > else if (cmd === ‘read_ack’ || cmd === ‘report’ || cmd === ‘heartbeat’) < var model = json[‘model’]; var data = JSON.parse(json[‘data’]); if (model === ‘sensor_ht’) < var temperature = data[‘temperature’] ? data[‘temperature’] / 100.0 : 100; var humidity = data[‘humidity’] ? data[‘humidity’] / 100.0 : 0; var sensorId = json[«short_id»]; console.log(«Received data from sensor x1b[31m%sx1b[0m (sensorId: %s) data: temperature %d, humidity %d.», json[‘sid’], sensorId, temperature, humidity); sendSensorData(sensorId, temperature, humidity, gatewayAddress); console.log(‘Sending sensor data to x1b[36m%sx1b[0m.’, config.addDataUrl); >> >); // err — Error object, https://nodejs.org/api/errors.html serverSocket.on(‘error’, function (err) < console.log(‘Error, message — %s, stack — %s.’, err.message, err.stack); >); serverSocket.on(‘listening’, function () < console.log(‘Starting a UDP server, listening on port %d.’, serverPort); serverSocket.addMembership(multicastAddress); >) console.log(‘Starting Aqara daemon. ‘); serverSocket.bind(serverPort); function sendWhois() < var command = < cmd: «whois» >; var cmdString = JSON.stringify(command); var message = new Buffer(cmdString); serverSocket.send(message, 0, cmdString.length, multicastPort, multicastAddress); console.log(‘Sending WhoIs request to a multicast address x1b[36m%s:%dx1b[0m.’, multicastAddress, multicastPort); > sendWhois(); setInterval(function () < console.log(‘Requesting data. ‘); sendWhois(); >, sensorDelay * 1000);
var config = < validationCode: «0000000000000000», addDataUrl: «http://weatherhub.ru/aqara.php», serverPort: 9898, multicastAddress: ‘224.0.0.50’, multicastPort: 4321, sensorDelay: 30 >; module.exports = config;
Для запуска модуля на Малинке — используется команда nodejs sensor.js
Как автоматизировать запуск модуля при старте Малинки — пока не решил, вероятно кто-нибудь подскажет в комментариях, как это сделать проще и красивее.
Вид получаемых данных из консоли Малинки:
Получаемые данные
Как можно увидеть из вывода, в сети работает два датчика, с идентификаторами 52585 и 20046. Данные с них отправляются на сервер, указанный в конфиге (http://weatherhub.ru) — где поднят сам сайт и БД для хранения данных.
После запуска модуля, подключения датчиков, и запуска сайта — новые датчики можно будет сразу увидеть на странице Настройки:
Используя кнопку Параметры модуля — выбираем активные сенсоры (в нашем случае это Температура 1 и Влажность 1), сохраняем данные, и переходим на Главную, где видим получаемые данные:
На странице Данные — можно посмотреть данные с табличной форме:
На странице Графики — графики, для которых можно выбрать период отображения:
Сайт запущен в режиме одного пользователя, без авторизации. Поэтому отображаемые данные доступны всем. При включении авторизации — каждый пользователь получает уникальный код валидации, который надо будет указать либо в микропрограмме для контроллера, либо в модуле nodejs.
Весь код метеостанции доступен на Гитхабе: github.com/aproschenko-dev/WeatherHub
Дальнейшее развитие, которое мне видится:
- Возможность показа данных в графическом виде, в виде шкалы
- Добавление в стандартный набор поддерживаемых сенсоров наиболее распостраненных моделей — bme280, bmp280 и прочие
- Поддержка датчика CO2 — MHT-Z19
Уверен, что при развертывании и запуске метеостанции могут возникнуть множество вопросов — готов на них дать ответы, а по итогам — написать подробный мануал по системе.
- Умный дом
- Интернет вещей
- DIY или Сделай сам
- Здоровье
Источник: habr.com
Метеостанция Xiaomi Mijia Temperature And Humidity Electronic Watch
Mijia – одна из компаний-партнёров (суббрендов) Xiaomi. Упаковка и документация маркированы логотипом Mijia. На устройствах, дополнительных принадлежностях и комплектующих отсутствует логотип Xiaomi.
Контроль микроклимата в любом месте
Xiaomi Mijia Temperature And Humidity Electronic Watch — стильная и красивая метеостанция, которая поможет быстро узнать температуру и влажность в любом помещении: на кухне, спальне, офисе или ванной комнате. Знание параметров даёт возможность для создания оптимального микроклимата помещения.
Наглядное отображение
Уровень влажности и температура, да даже обычное время — привычные и нужные данные. С помощью Xiaomi Mijia Temperature And Humidity Electronic Watch можно быстро посмотреть эти параметры. Модель оснащена экраном E-Ink с отличными углами обзора, на который выводятся все параметры. Устройство даже выражает своё мнение о климате в доме, используя довольный и недовольный смайлик.
Для любого уголка дома
Устройство можно зафиксировать разными способами. В комплекте предусмотрена ножка, которая позволяет поставить метеостанцию на рабочем столе или прикроватной тумбе. С помощью скотча 3М можно закрепить девайс на стене. Магнитное крепление — для быстрой установки на холодильник или другой металлический предмет.
Работает в команде
Знания нужны для применения их на практике. И Xiaomi, как всегда, приходит на помощь. Устройство поддерживает синхронизацию с умным домом Mi Home (необходим блок управления умным домом). С помощью бесплатного приложения можно настроить автоматические действия и сценарии.
Например при понижении температуры система автоматически включит конвектор, при необходимости увлажнения — увлажнитель. Можно задать все задачи один раз и больше не переживать о необходимости ручной регулировки.
Долгая служба
Корпус устройства сделан из прочного пластика. Защитное стекло предотвращает повреждения экрана. Всё это гарантирует долгую службу метеостанции. В аспекте выносливости можно выделить и время работы. Срок работы от двух батареек — 1 год.
Источник: biggeek.ru