Умный дом — хранение данных

Для хранения данных, опираясь на опыте веб-программирования, я решил использовать MySQL как постоянное и Memcached как временное.

В мискуле всё просто. Есть база DOM. В ней таблица Places (места типа гостиная, спальня, кабинет, туалет и т.д.) Нужны «места» исключительно для удобства восприятия пользователем.

К местам привязывается таблица устройств (ардуины, ESP-хи и т.д., включая если надо RPI) и они описываются в таблице Devices.

CREATE TABLE dom.devices (
ID int(11) NOT NULL AUTO_INCREMENT,
PlaceID int(11) DEFAULT NULL,
Address varchar(255) DEFAULT NULL,
Model varchar(255) DEFAULT NULL,
LastActive datetime DEFAULT NULL,
PRIMARY KEY (ID)
);

Конечно int(11) это перебор, даже в Шуваловской квартире хватило бы int(2). Так же кто-то скажет что адрес, который обычно IPшник надо хратить в bigint и разворачивать через long2ip но во-первых не факт что это будет именно IP, во-вторых, нафига нагружать каждый раз процессор RPI для разворачивания long в IP если это не таблица Users на Facebook, и даже в супердоме больше сотни устройств не будет.

Теоретически напрашивается индекс по полю PlaceID но в реальности выборки по этому ключу у меня не будет, а соответственно нефиг плодить неиспользуемые индексы.

К таблице устройств привязывается таблица сенсоров которыми обвешено устройство.

CREATE TABLE dom.sensors (
ID int(11) NOT NULL AUTO_INCREMENT,
DeviceID int(11) DEFAULT NULL,
SensorType int(11) DEFAULT NULL,
LastUpdate datetime DEFAULT NULL,
LastValue float DEFAULT NULL,
Model varchar(255) DEFAULT NULL,
Pos int(11) DEFAULT 0,
PRIMARY KEY (ID)
);

Таблица сенсоров ссылается через SensorType на таблицу с описанием типов сенсоров.

В этой табличке ParamName — это название параметра, который отдает устройство. Name — человекочитаемое название. NDecimal это число знаков после запятой при оформлении результатов, ну а AfterChar это что пририсовать к этому значению.

Тот же DHT11 описывается как два отдельных сенсора (температура и влажность), поскольку серверной части совершенно не обязательно знать, что это один датчик. Если используется DS18B20 точность измерений температуры которого до сотых, то ему ставится ID=2.

В такой схеме возможна, хотя и маловероятна, проблема в случае если на одном устройстве висит несколько датчиков одного типа. Но эта проблема легко решается добавление новых типов с изменением их ParamName (co2-1, co2-2 и т.д.)

В результате получается вот такая схема базы данных, которая позволяет описать любой дом, от квартиры студии и гаража, до резиденции Медведева.

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