В рассказе пройдусь по кирпичикам системы, чем руководствовался в выборе. Вся система строится на заводских датчиках и самодельном контроллере на базе Particle (ex.Spark) Photon (такая esp8266 у которой облачная IDE на wiring из коробки), база девайса stm контроллер + wifi модуль от броадкома. Все это завязано на openhab сервер на Orange Pi One.
Почему не готовая система?
— Потому что могу сам и это в кайф
— У готовых систем хромает интеграция с внешними системами.
— У готовых систем нет вспомогательных функций — учет показаний счетчиков, датчики температуры воды, нотификация об отключениях воды и прочие пешие эротические фантазии.
Начем с кранов
Выбирал тупо в лоб по крутящему моменту. Некоторое время проживал в подмосковье, где качество воды (как наверно везде в замкадье) оставляет желать лучшего. Так шаровые краны на 1\2 дюйма если год не трогать — повернуть очень тяжело. А на полотенцесушителе 1 дюймовые я даже и не пытаюсь шевелить — только если усилить плечо ключем разводным, а тут и сорвать чего-нибудь можно. Проблема в отложениях кальциево-хзчего, «зарастают» одноим словом.
Соответсвенно выбор пал на проф серию от гидролока — 21Н*м крутящего момента по ощущениям не рекламный треп, кран просто огромный — оцените место его установки перед покупкой.
Кран герметизирован, по периметру резиновый уплотнитель, вход под винтовым сальником.
Снимаем крышку.
Перед нами верхняя часть платы и шаговый двигатель. Питается все это от 12 вольт. Замыкание контрольного кабеля на землю переводит кран в закрытое положение. На плате видим простенький контроллер PIC 12f629. Дожили, контроллер в приводе крана.
Сзади платы самое интересное.
L293 драйвер шаговика и фотопара (излучатель + фотоприемник). Она смотрит на основную шестерёнку привода, которая раскрашена на части — белая и черная, закрыто\открыто.
Кран вращается все время в одну сторону, логика контроллера простая — крутим вал, пока не переключимся на нужный цвет. Вращение крана в одну сторону, это меньше износ, а бесконтактный способ определения положения — меньше шансов закисания\сбоя переменного резистора или концевика.
Для монтажа можно открутить кран от привода — держится на 2 гайках. Между приводом и краном теплоизоляционная прокладка.
Ремонт у меня был полтора года назад. Кран покупал года три назад — разобрать, посмотреть внутри, купить еще и накрутить во время ремонта. Ага, сейчас… максимум чего успел в этом ацком цирке — заложить в сборку водоразводки грязевик с переспективой заменить его на кран.
И вот только спустя полтора года — докупил второй кран и накрутил их.
В итоге мы наблюдаем странное и редкое явление(читать голосом Дроздова) — вся информация с сайта производителя подтвердилась. Причем описание своеобразное, как будто писали технари, а потом маркетинг полирнул для народа, но все равно мало кто поймет все фишки. Не хватает раздела на сайте — для интеграторов с техподробностями внутри. Даже на счет повышенного крутящего момента на старте не соврали — кран на старте бухтит движком в 1,5А и через 2-3 сек начинает уже гундеть в обычном (ток 0,7 А) режиме. На закрытие уходит секунд 25-30.
Еще из опыта: на счет крутящего момента — он избыточный для Мск, тут вода вполне ОК, за полтора года в 100мкм фильтре пара окалин и никакого зарастания. За большой крутящий момент приходится платить и ценой, и временем открытия, и местом в шкафу. Думаю тут обычных приводов хватит от Гидролока Ультимэйт, Нептуна или Аквасторожа. За два последних не поручусь — не разбирал, лет 5 назад у них были частично пластиковые шестерни, сейчас вроде это исправили.
Еще есть гидролок виннер с прямым подключением датчиков к приводу — это если вам не надо все что я наворотил. Там питание автономное от 4 батареек, а база похоже от ультимэйт привода. Вообще, он потенциально интересен и для контроллера самопального — питание 5 вольт, не надо две шины на 5 и 12 вольт городить и можно выбросить опторазвязку.
Датчики протечки
Купил датчики той же контроры WSU — универсальные. У них два выхода «открытый коллектор», один тянет на землю только при наличии воды, второй — если вода попала, то тянет на землю все время, пока питание не рубанешь. Только первый выход использую, остальная логика в контроллере, но похоже этот выход может пригодиться для каких более кондовых систем диспечеризации.
Провода в комплекте метра три где то. Цвет проводов — Адъ_и_Израиль. Зацените цитату:
красный (коричневый) провод (Vcc) питание от +5 до +30 вольт.
черный(белый) провод (OUT2)
зеленый провод (OUT1)
желтый провод (GND)
Вот что мешало сделать белый\черный землей? На приводе крана тоже кстати провода по цвету с логикой не але. Первый датчик стоит на кухне, под раковиной рядом с посудомойкой.
Второй в ванной в специальной водоотводной канаве. Когда делал стяжку — не довел ее до стены. Получился этакий зумпф для сбора воды с ванной и туалета.
Из опыта эксплуатации — ужу было одно ложное срабатывание датчика у посудомойки. Судя по логу на один цикл опроса (500мс) было замыкание, модифицировал код — смена состояния теперь происходит при 10 подряд одинаковых значениях с датчика.
Контакты датчика покрыты позолотой. У товарища подобные датчики уже несколько лет, окисления не замечено.
Датчики давления
Практически — показометры. Точность +- 0,5 атм меня полностью устроила. На основе датчиков приходит оповещении по отключению воды. Покупал на Али тут.
Датчики температуры
А почему бы и не добавить? Из полезного — сможет раз в год оповестить об отключении горячей воды. Используются банальные ds18b20.
Счетчики
Самые обычные Itelma, раз в 10 литров замыкают контакты. На стороне контроллера выход подтянут к + 3,3v, счетчик тянет его на землю.
Контроллер
На базе Particle Photon, подробнее тут. Есть у них версия с 2G или 3G модулем (Electron). Первые прошивки был полный шлак, поморгать диодами ОК, но как только начинаешь чето сложное колбасить, играть с i2c и прерываниями может терять wifi. Сейчас жить можно. В принципе можно выкинуь датчики давления из схемы и замутить все на ESP8266 — дерзайте. Первым делом photon надо привязать к аккаунту particle (делается через App на мобиле или через консоль Particle CLI — пользую только второй метод) и прописать wifi-сеть. После привязки тут в разделе устройств появляется контроллер и его статус подключения к облаку.
У меня все ноды подключаются к облаку только для обновления прошивки. Не то что бы я параноил — просто работа с облаком жрет не богатые ресурсы контроллера. IDE поддерживает работу с библиотеками, буквально десяток поддерживается самой контрой, остальные — сообществом. По моему наблюдению все распространенное давно портировали, еще фишка — в IDE сразу вижно сколько проектов используют библитеку.
// This #include statement was automatically added by the Particle IDE.
#include "Adafruit_SSD1306/Adafruit_SSD1306.h"
// This #include statement was automatically added by the Particle IDE.
#include "MQTT/MQTT.h"
// This #include statement was automatically added by the Particle IDE.
#include "OneWire/OneWire.h"
SYSTEM_THREAD(ENABLED);
SYSTEM_MODE(MANUAL);
STARTUP(WiFi.selectAntenna(ANT_EXTERNAL));
STARTUP(System.enableFeature(FEATURE_RETAINED_MEMORY));
struct counter_struct {
float value;
byte state;
int pin;
};
struct valve_struct {
byte state;
int pin;
};
struct sensor_struct {
int timeout;
byte state;
int pin;
};
unsigned long currentMillis = 0;
unsigned long previous_conected = 100000; //финт ушами
unsigned long previous_wifi_uptime = 100000; //финт ушами
unsigned long previous_counter_read = 0; //финт ушами
unsigned long wifi_uptime;
unsigned long start_temp_timer = 0;
unsigned long read_temp_timer = 0;
byte display_timeout = 0;
//temp onewire
OneWire ds0 = OneWire(D2);
OneWire ds1 = OneWire(D3);
byte addr0[8];
byte addr1[8];
bool presense0 = false;
bool presense1 = false;
byte data[12];
#define OLED_RESET A7
Adafruit_SSD1306 display(OLED_RESET);
//valve control
retained valve_struct valve[2] = { {0, D4}, {0, D5} };
//counter control
retained counter_struct counter[2] = { {0, 1, A0}, {0, 1, A1} };
volatile int pressure[2] = {A2, A3};
#define SENSOR_TIMEOUT 10
volatile sensor_struct sensor[2] = { {0, 1, D6}, {0, 1, D7} };
void callback(char* topic, byte* payload, unsigned int length);
byte server[] = { 192,168,2,101};
MQTT client(server, 1883, callback);
bool publish_message(const char* t, const char* p, bool retain)
{
return client.publish(t, (uint8_t*)p, sizeof(p), retain);
}
bool publish_message(const char* t, int p, bool retain)
{
char buf_d[12];
int n = sprintf(buf_d,"%d",p);
return client.publish(t, (uint8_t*)buf_d, n, retain);
}
bool publish_message(const char* t, float p, bool retain)
{
//char buf_f[18];
String s(p, 4);
// dtostrf(p, 9, 4, buf_f);
//int n = sprintf(buf_f,"%f",p);
return client.publish(t, (uint8_t*)s.c_str(), s.length(), retain);
}
// recieve message
void callback(char* topic, byte* payload, unsigned int length) {
char p[length + 1];
memcpy(p, payload, length);
p[length] = NULL;
String message(p);
String t(topic);
if (t.equals("home/water_count/spark/set"))
{
if (message.equalsIgnoreCase("1"))
{
Particle.connect();
if (waitFor(Particle.connected, 10000))
{publish_message("home/water_count/spark", 1, false);}
else
{Particle.disconnect(); publish_message("home/water_count/spark", 0, false);}
}
else
{
Particle.disconnect();
publish_message("home/water_count/spark", 0, false);
}
}
else if (t.startsWith("home/water_count/valve/"))
{
int m = message.toInt();
int x = t.substring(23,24).toInt();
if (m > -1 && m < 2 && x > -1 && x <2)
{
set_valve(x, m);
}
else
{
publish_message("home/water_count/valve/" + t.substring(23,24), valve[x].state , true);
}
}
else if (t.startsWith("home/water_count/counter/"))
{
float m = message.toFloat();
int x = t.substring(25,26).toInt();
if (m > -1 && m <= 999999 && x > -1 && x <2)
{
counter[x].value = m;
}
publish_message("home/water_count/counter/" + t.substring(25,26), counter[x].value , true);
}
}
void setup() {
//Serial.begin(9600);
WiFi.on();
WiFi.connect();
if (waitFor(WiFi.ready, 5000)) {mqtt_connect();}
for (int i=0; i < 2; i++)
{
pinMode(valve[i].pin, OUTPUT);
digitalWrite(valve[i].pin, valve[i].state);
pinMode(counter[i].pin, INPUT);
pinMode(sensor[i].pin, INPUT);
counter[i].state = digitalRead(counter[i].pin);
pinMode(pressure[i], AN_INPUT);
}
pinMode(A4, INPUT_PULLUP);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C (for the 128x64)
display.clearDisplay(); // clears the screen and buffer
//Particle.connect();
}
void loop()
{
currentMillis = millis();
// проверяем наличие сети и подключения к MQTT брокеру
if (currentMillis - previous_conected >= 30000 || previous_conected > currentMillis)
{
previous_conected = currentMillis;
if (!client.isConnected() & wifi_uptime > 60)
{
mqtt_connect();
}
publish_message("home/water_count/rssi", WiFi.RSSI(), true);
}
if (currentMillis - previous_wifi_uptime >= 1000 || previous_wifi_uptime > currentMillis)
{
previous_wifi_uptime = currentMillis;
WiFi.ready() ? wifi_uptime++ : wifi_uptime = 0;
//work with button and display
int fg = digitalRead(A4);
if (display_timeout > 0)
{
display_timeout -= 1;
if (display_timeout == 0)
{
display.clearDisplay();
display.display();
}
}
if (fg == 0)
{
if (display_timeout == 0)
{
display.clearDisplay(); // clears the screen and buffer
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.print("C=");
display.println(counter[0].value, 4);
display.setCursor(0,16);
display.print("H=");
display.println(counter[1].value, 4);
display.setCursor(0,32);
display.print("Valve=");
display.print(valve[0].state);
display.print("|");
display.println(valve[1].state);
display.setCursor(0,48);
display.print("Sensor=");
display.print(sensor[0].state);
display.print("|");
display.println(sensor[1].state);
display.display();
}
display_timeout = 10;
}
}
//counter check
if (currentMillis - previous_counter_read >= 500 || previous_counter_read > currentMillis)
{
previous_counter_read = currentMillis;
for (int i=0; i < 2; i++)
{
byte count_state = digitalRead(counter[i].pin);
if (count_state != counter[i].state)
{
counter[i].state = count_state;
if (count_state == 0)
{
counter[i].value += 0.01;
char buf18[30];
sprintf(buf18,"home/water_count/counter/%d", i);
publish_message(buf18 , counter[i].value, true);
}
}
// работаем с датчиком протечки
byte sensor_state = digitalRead(sensor[i].pin);
if (sensor_state != sensor[i].state) //
{
sensor[i].state = sensor_state;
sensor[i].timeout = SENSOR_TIMEOUT;
}
if (sensor[i].timeout > 0)
{
sensor[i].timeout -= 1;
if (sensor[i].timeout == 0)
{
char buf18[30];
sprintf(buf18,"home/water_count/sensor/%d", i);
publish_message(buf18 , sensor[i].state, true);
if (sensor[i].state == 0)
{
set_valve(0, 1); //close both valve
set_valve(1, 1); //close both valve
}
}
}
}
}
// temp onewire
if (currentMillis - start_temp_timer >= 299000 || start_temp_timer > currentMillis)
{ //стартуем расчет
start_temp_timer = currentMillis;
presense0 = start_temp0();
presense1 = start_temp1();
}
if (currentMillis - read_temp_timer >= 300000 || read_temp_timer > currentMillis)
{//считывваем темп
read_temp_timer = currentMillis;
start_temp_timer = currentMillis;
if (presense0) read_temp0();
if (presense1) read_temp1();
//preasure calc and send
char buf18[30];
for (int i=0; i < 2; i++)
{
sprintf(buf18,"home/water_count/pressure/%d", i);
float read_val = analogRead(pressure[i]);
float value = (read_val - 600.0) / 300.0 ;
publish_message(buf18 , value, false);
}
}
//Particle.process();
client.loop();
}
void mqtt_connect()
{
if (client.connect("water_count"))
{ //подпись на spark и публикуем послднее состояние
client.subscribe("home/water_count/spark/set");
publish_message("home/water_count/spark", Particle.connected() ? 1 : 0, true);
client.subscribe("home/water_count/valve/+/set");
client.subscribe("home/water_count/counter/+/set");
}
}
bool start_temp0()
{
if ( !ds0.search(addr0)) { ds0.reset_search(); return false;}
ds0.reset_search();
if (OneWire::crc8(addr0, 7) != addr0[7]) { return false;}
ds0.reset();
ds0.select(addr0);
ds0.write(0x44, 0);
return true;
}
bool start_temp1()
{
if ( !ds1.search(addr1)) { ds1.reset_search(); return false;}
ds1.reset_search();
if (OneWire::crc8(addr1, 7) != addr1[7]) { return false;}
ds1.reset();
ds1.select(addr1);
ds1.write(0x44, 0);
return true;
}
bool read_temp0()
{
//delay(1000);
ds0.reset();
ds0.select(addr0);
ds0.write(0xBE, 0);
for (int i = 0; i < 9; i++)
{
data[i] = ds0.read();
}
int16_t raw = (data[1] << 8) | data[0];
float celsius = (float)raw * 0.0625;
if (celsius < 0 || celsius > 100) return false;
publish_message("home/water_count/temp/0", celsius, false);
//Serial.println(celsius);
ds0.reset_search();
return true;
}
bool read_temp1()
{
//delay(1000);
ds1.reset();
ds1.select(addr1);
ds1.write(0xBE, 0);
for (int i = 0; i < 9; i++)
{
data[i] = ds1.read();
}
int16_t raw = (data[1] << 8) | data[0];
float celsius = (float)raw * 0.0625;
if (celsius < 0 || celsius > 100) return false;
publish_message("home/water_count/temp/1", celsius, false);
//Serial.println(celsius);
ds1.reset_search();
return true;
}
void set_valve(int vlv, byte state)
{
valve[vlv].state = state;
digitalWrite(valve[vlv].pin, state);
char buf26[26];
sprintf(buf26,"home/water_count/valve/%d", vlv);
publish_message(buf26 , state , true);
}
Через MQTT подключаемся к брокеру. Мониторим датчики и шлем в соответствующие ветки mqtt события и значения. Например home/water_count/valve/0 — привод хол воды. home/water_count/counter/0 — показания счетчика хол воды.
Подписываемся на команды изменения состояния привода и установки текущего значения счетчика (холодной и горячей воды ):
client.subscribe("home/water_count/valve/+/set");
client.subscribe("home/water_count/counter/+/set");
На устройстве одна кнопка — по нажатию включаем экран, рисуем текущие показания счетчиков, сенсоров и кранов. Экран OLED, быстро выгорает если делать включенным все время.
STARTUP(System.enableFeature(FEATURE_RETAINED_MEMORY));
Это интересная пограммно-аппаратная фишка контроллера stm, в reference Particle называют ее BackupSRAM. У Photon есть вывод vbat — это не батарейное питание и не зарядка. Пока есть напряжение на этой ноге, содержимое 4кбайт SRAM сохраняется при полной обесточенности контроллера. Таким образом отпадает проблема износа EEPROM.
В коде переменные, которые надо загнать в эту память объявляют с указанием: retained. Аппаратно я реализовал подпитку от суперконденсатора на 1,5F. По даташиту память сдохнет на 1,6v, по моим стендовым опытам на протоборде это настанет через 2 недели примерно с моим конденсатором. Логика закрытия кранов при срабатывании датчиков «автономна» и не зависит от подключения к openhab. Есть 3 ходовый переключатель прямого управления приводами — автоматика, OFF (открытые краны), Close (закрываем).
Схема платы ниже:
Проект Eagle вместе с кастомными либами можно скачать тут.
Плата делалась ЛУТ, в дорожках не мельчил.
Блок питания. Нам надо и 12 и 5 вольт. Донор ищется на ebay по строке: «hard drive power adapter 5v 12v», типа такого.
Корпус
Распечатывался пластиком PLA на 3d принтере (Tarantula Tevo). Сопло 0.4мм, слой 0,25мм. Крышка является заодно и базой для крепления платы контроллера. База с блоком питания крепится к стене. База с крышкой не скрепляются винтами, хватает натяжения крышки (как у бабушки крышки на банках с вареньем) и работает слоистая структура стенок.
3D модель в архиве.
Вот как это все выглядить смонтированное на водоразводке.
Openhab
Развернут на Orange Pi One под Armbian.
Без картинок - если оставить теги картинок, Хабр ломается.
Number watercount_temp1 "T cool [%.1f °C]" (gWaterCount) { mqtt="<[mqtt_bro:home/water_count/temp1:state:default]" }
Number watercount_temp2 "T hot [%.1f °C]" (gWaterCount) { mqtt="<[mqtt_bro:home/water_count/temp2:state:default]" }
Number watercount_count0 "Count cool [%.2f М?]" (gWaterCount) { mqtt="<[mqtt_bro:home/water_count/counter/0:state:default]" }
Number watercount_count1 "Count hot [%.2f М?]" (gWaterCount) { mqtt="<[mqtt_bro:home/water_count/counter/1:state:default]" }
Number watercount_pressure0 "P cool [%.2f Атм.]" (gWaterCount) { mqtt="<[mqtt_bro:home/water_count/pressure/0:state:default]" }
Number watercount_pressure1 "P hot [%.2f Атм.]" (gWaterCount) { mqtt="<[mqtt_bro:home/water_count/pressure/1:state:default]" }
Number watercount_sensor0 "Sensor0 is [MAP(water_sensor.map):%s]" (gWaterCount) { mqtt="<[mqtt_bro:home/water_count/sensor/0:state:default]" }
Number watercount_sensor1 "Sensor1 is [MAP(water_sensor.map):%s]" (gWaterCount) { mqtt="<[mqtt_bro:home/water_count/sensor/1:state:default]" }
Number watercount_valve0 "Valve cool" (gWaterCount) { mqtt="<[mqtt_bro:home/water_count/valve/0:state:default], >[mqtt_bro:home/water_count/valve/0/set:command:*:default]" }
Number watercount_valve1 "Valve hot" (gWaterCount) { mqtt="<[mqtt_bro:home/water_count/valve/1:state:default], >[mqtt_bro:home/water_count/valve/1/set:command:*:default]" }
String watercount_sendStr "LastVol:[%s]" (gWaterCount)
Number watercount_sendCool "Send cool [%.2f М?]" (gWaterCount)
Number watercount_sendHot "Send hot [%.2f М?]" (gWaterCount)
Number watercount_sendSwitch "Autosend" (gWaterCount)
Number watercount_rssi "WaterCount [%d dB]" (gSpark_RSSI) { mqtt="<[mqtt_bro:home/water_count/rssi:state:default]" }
Number watercount_spark_state "WaterCount Spark" (gSpark) { mqtt="<[mqtt_bro:home/water_count/spark:state:default], >[mqtt_bro:home/water_count/spark/set:command:*:default]" }
Нужно небольшое правило трансформации для показаний датчика протечки.
1=dry
0=wet
undefined=undefined
Формируем страницу для управления:
Text label=«Водоподготовка» icon=«water»
{
Frame
{
Text item=watercount_temp1
Text item=watercount_count0
Text item=watercount_pressure0
Switch item=watercount_valve0 mappings=[1=«Close», 0=«Open»]
}
Frame
{
Text item=watercount_temp2
Text item=watercount_count1
Text item=watercount_pressure1
Switch item=watercount_valve1 mappings=[1=«Close», 0=«Open»]
}
Frame
{
Text item=watercount_sensor0
Text item=watercount_sensor1
}
Frame
{
Switch item=watercount_sendSwitch mappings=[0=«OFF», 1=«ON»]
Text item=watercount_sendStr
Text item=watercount_sendCool
Text item=watercount_sendHot
}
}
И правила обработки:
rule "Check watercount_sensor0"
when
Item watercount_sensor0 received update
then
if ((watercount_sensor0.state as DecimalType) == 1)
{
if ((watercount_sensor0.historicState(now.minusSeconds(3)).state as DecimalType) == 1)
{
sendTelegram("****_bot", "Sensor0 was wet less than 5 seconds")
}
else
{
sendTelegram("****_bot", "Sensor0 become dry")
}
}
else
{
if ((watercount_sensor0.historicState(now.minusSeconds(3)).state as DecimalType) == 0)
{
sendTelegram("****_bot", "Sensor0 was dry less than 5 seconds");
}
else
{
sendTelegram("****_bot", "Sensor0 become wet! Valves will be closed!")
}
}
end
rule "Check watercount_sensor1"
when
Item watercount_sensor1 received update
then
if ((watercount_sensor1.state as DecimalType) == 1)
{
if ((watercount_sensor1.historicState(now.minusSeconds(3)).state as DecimalType) == 1)
{
sendTelegram("****_bot", "Sensor1 was wet less than 5 seconds")
}
else
{
sendTelegram("****_bot", "Sensor1 become dry")
}
}
else
{
if ((watercount_sensor1.historicState(now.minusSeconds(3)).state as DecimalType) == 0)
{
sendTelegram("****_bot", "Sensor1 was dry less than 5 seconds");
}
else
{
sendTelegram("****_bot", "Sensor1 become wet! Valves will be closed!")
}
}
end
rule "Check watercount_temp2"
when
Item watercount_temp2 received update
then
if ((watercount_temp2.state as DecimalType) < 37 )
{
sendTelegram("****_bot", String::format("Hot water temp drop to %s", watercount_temp2.state.toString));
}
end
rule "Check watercount_pressure0"
when
Item watercount_pressure0 received update
then
if ((watercount_pressure0.state as DecimalType) < 1 && (watercount_pressure0.historicState(now.minusSeconds(3)).state as DecimalType) >= 1)
{
sendTelegram("****_bot", String::format("Cool pressure drop to %s", watercount_pressure0.state.toString));
}
if ((watercount_pressure0.state as DecimalType) > 1 && (watercount_pressure0.historicState(now.minusSeconds(3)).state as DecimalType) <= 1)
{
sendTelegram("****_bot", String::format("Cool pressure rise to %s", watercount_pressure0.state.toString));
}
end
rule "Check watercount_pressure1"
when
Item watercount_pressure1 received update
then
if ((watercount_pressure1.state as DecimalType) < 1 && (watercount_pressure1.historicState(now.minusSeconds(3)).state as DecimalType) >= 1)
{
sendTelegram("****_bot", String::format("Hot pressure drop to %s", watercount_pressure1.state.toString));
}
if ((watercount_pressure1.state as DecimalType) > 1 && (watercount_pressure1.historicState(now.minusSeconds(3)).state as DecimalType) <= 1)
{
sendTelegram("****_bot", String::format("Hot pressure rise to %s", watercount_pressure1.state.toString));
}
end
rule "Generate send string counters" //every 24 day of mounth in 00.01 minutes
when
Time cron "0 0 1 24 1/1 ?"
then
var float deltaCool = (watercount_count0.state as DecimalType).floatValue() - (watercount_sendCool.state as DecimalType).floatValue()
var float deltaHot = (watercount_count1.state as DecimalType).floatValue() - (watercount_sendHot.state as DecimalType).floatValue()
if (deltaCool >= 0 && deltaHot >= 0)
{
watercount_sendStr.postUpdate(String::format(" %.2f / %.2f м3", deltaCool, deltaHot))
watercount_sendCool.state = watercount_count0.state
watercount_sendHot.state = watercount_count1.state
sendTelegram("****_bot", String::format("Лизюкова 23, корп 5, кв. 23. Счетчик №2560097 (хол.вода) = %.2f м3. Cчетчик №2538996 (гор.вода) = %.2f м3. %s", (watercount_sendCool.state as DecimalType).floatValue(), (watercount_sendHot.state as DecimalType).floatValue(), watercount_sendStr.state.toString()))
}
else
{
watercount_sendSwitch.postUpdate(0)
sendTelegram("****_bot", "Current counters value less than sended last time. Turn off autosend.")
}
end
rule "Send string counters"
when
Time cron "0 0 23 24 1/1 ?"
then
if (watercount_sendSwitch.state == 1)
{
sendMail("uk@uk.ru", "Лизюкова 23, корп 5, кв. 23", String::format("Лизюкова 23, корп 5, кв. 23. Счетчик №2560097 (хол.вода) = %.2f м3. Cчетчик №2538996 (гор.вода) = %.2f м3", (watercount_sendCool.state as DecimalType).floatValue(), (watercount_sendHot.state as DecimalType).floatValue()));
sendTelegram("****_bot", "Send email with watercount values");
}
else
{
sendTelegram("****_bot", "Can't send email with watercount values - autosend is OFF.");
}
end
rule "Rotate valves"
when
Time cron "0 0 05 25 1/1 ?"
then
if (watercount_valve0.state == 0 && watercount_valve1.state == 0)
{
watercount_valve0.postUpdate(1)
Thread::sleep(1000)
watercount_valve1.postUpdate(1)
Thread::sleep(1000)
watercount_valve0.postUpdate(0)
Thread::sleep(1000)
watercount_valve1.postUpdate(0)
sendTelegram("****_bot", "Valves was rotated.");
}
else
{
sendTelegram("****_bot", "Can't rotate valves, it's closed.");
}
end
Для отправки сообщений не пользуюсь встроенным функционалом андроид приложения openhab, как и иинтеграцией с их облаком. Мне по душе бот Телеграмм. Как настроить и подлючить бота можно подсмотреть на wiki. Для отправки писем с почтового ящеика gmail, если у вас двухфактораная аутентификация, надо включить разовый пароль для почтового приложения и прописать именно этот пороль в конфиге openhab.
Пройдусь по правилам.
Check watercount_sensor — контроллер отправляет новые значения сенсора протечки только при смене значения или если было ложное срабатывание (менее 10 циклов). Анализируем пришедшее и историческое значение, формируем информационные сообщения. Есть нюанс — попытка получить prevoiusItem постоянно отдает текущее значение, решения не нашел — беру значение "-3 сек", если кто поборол — отпишите в коменты или в личку.
Check watercount_temp2 — проверяем, если меньше 37, значить горячая вода стала холодной, надо по приходу включить проточный нагреватель.
Check watercount_pressure — анализируем текущее и предыдущее значение, реагируем сообщением на падение ниже 1 атм и росту выше нее.
Generate send string counters — стартует по cron 24 числа каждого месяца в 1 час ночи. Проверяем, что значения сейчас больше отправленных в прошлый раз. Если меньше — выключаем автоотправку и формируем оповещение. Если ОК — запоминаем значения счетчиков для отправки в УК, отправляем в телеграмм будущее тело письма. Заодно в watercount_sendStr сохраняем, сколько мы потребили за прошлый месяц.
Generate send string counters — стартует по cron 24 числа в 23.00. Проверяет включена ли автоотправка, если вкл — шлем на почту кправляющей компании значения счетчиков. Получается у меня есть 24 числа весь день, что то исправить или просто вырубить автоотправку, если в телеграм пришла ошибка.
Update by comment. Rotate valves — правило для закрытия\открытия крана раз в месяц против закипания. 25 числа в 5 утра — что бы не попасть на работу посудомойки или стиралки, но даже если и попадет — не критично, перекрытие воды будет около 3-4 секунд.
И только тут начинается умный дом...
Объединение систем в единой точке (openhab) позволяет строить логику, не доступную набору автономных систем. Например: пришло событие увеличения счетчика воды — система безопасности активна, замки входной двери закрыты, потребление электроэнергии посудомойкой и стиралкой менее 5 Вт — значит зафиксирована протечка мимо датчиков. Формируем команду на закрытие кранов, отправляем сообщение боту в Телеграмм. Но этом как нить потом.
Комментарии (117)
GreyPhantom
28.11.2016 20:02+3Дожили, контроллер в приводе крана.
А шаговый двигатель (он реально шаговый? ) для того чтобы изредка крутить на небольшой угол, да еще и в одну сторону, уже никого не удивляет? действительно- «дожили»: контроллеры, WiFi и Bluetouch где надо и не надо, облака, управление с планшета/айфона/часов. Показательный пример- контроллер для регулирующего клапана (для промышленного применения) с кучей «плюшек» на борту- беспроводной интерфейс (зачем, если кабели к нему так и так тянуть?), графический дисплей (почему не сенсорный?) и прочие «преимущества» в основном не нужные потребителю, но увеличивающие цену. И назначение упомянутого контроллера- управлять приводом задвижки. Мне (да и всей системе отопления в целом) глубоко фиолетово на сколько мм переместился шток за последние пол-часа: задача регулятора- поддерживать заданный расход, а это может быть и 5, и 20 и 90 % хода. Дисплей и прочая «светомузыка» нужны практически только при наладке. Вот и выходит для связи с центральным контроллером по протоколу «Супер-ПуперBus» нужен какой-то микроконтроллер, PIC16 вполне бы справился, но «как-то не круто, давайте ARM 7 поставим», а после- «осталось куча незадействованных входов/выходов, да и ресурсов процессора еще дофига- давайте прикрутим пинание кошки по сигналу от марсианского вездехода».
zvirusz
28.11.2016 20:39А подскажите, что за кран таки выбрали? Есть у него опознавательные знаки? :)
Nizametdinov
28.11.2016 20:45В статье есть — гидролок профессиональный, именно его фото внутренностей в статье используется.
zvirusz
28.11.2016 20:48Спасибо, не понял, что «гидролок» — название производителя.
http://gidrolock.ru/production/sharovoy-kran-s-elektroprivodom-gidrolock-professional/
Спасибо.Nizametdinov
28.11.2016 20:50Тут похоже так же петрушка, как у Ксерокса и копировального аппарта. Встречал такую фразу — «у меня гидролок от Аквасторожа».
seniaiff11
28.11.2016 20:51Вот смотрю на фотографию и не понимаю — зачем байпас между коллекторами холодной и горячей воды? У вас еще и бойлер «на всякий» есть? А то у меня разрыв шаблона произошел…
Nizametdinov
28.11.2016 20:54Какой именно байпас? :)
Их два:
1) между фильтром и редуктором давления — он для промывки фильтра обратным потоком воды (холодный промывается горячей и наоборот).
2) в конце коллектра — это отводы на проточный водонагреватель. На него оба крана открываются и вход гор воды закрывается.
ClearAirTurbulence
28.11.2016 20:52Из не-IT — можно было сделать шланги от стока фильтров в канализацию, чтобы при промывке обратным током воды не париться c ведрами.
Ответ на комментарий выше:
Вот смотрю на фотографию и не понимаю — зачем байпас между коллекторами холодной и горячей воды?
Обычно так делают, чтобы обратным током воды мыть фильтры.Nizametdinov
28.11.2016 20:59Спасиб. Задумка именно такая — причем решил просто засвелить сверху 110мм трубу фрезой и вставить 12мм носик для садовых шлангов (есть такие для врезки в платиковые бочки), а не городить из пластика вставку с 50мм отводом, потом в нее через пару переходников отвод как на стиралку.
Пока не было необходимости промывать, подозрительно чистая вода, поэтому доработка вытесняется в backlog более приоритеными.
HappyGroundhog
28.11.2016 23:02Только главное не забыть, что по хорошему на эти шланги надо ставить сухой гидрозатвор. Многие считают неправильным прямое подключение канализации в стояк питьевой воды) Даже если там есть кран на фильтре… я просто надел две трубки и сливаю через них в унитаз. Заодно есть бонус, видно сколько шлака с фильтра вымылось.
Nizametdinov
28.11.2016 23:07>>>Многие считают неправильным прямое подключение канализации в стояк питьевой воды)
Тоже слышал, но ИМХО перебор. Если так заморачиваться, то нельзя и канализационный слив посудомойки подключать без сухого сифона.himch
28.11.2016 23:29Посудомойка обсыхает после рабочего цикла, плюс высокая температура и моющее средство.
А тут прямая дорога для бактерий.
В мануалах производителей все подобные сливы исполняются через воздушный разрыв.Nizametdinov
29.11.2016 00:22>>>Посудомойка обсыхает после рабочего цикла
В поддоне снизу все время есть какое то количество воды, насос начисто все не выкачивает, влажность в машинке некислая.
Мало того — шланг сливной идет снизу вверх до уровня подключения к сифону раковины. И он все время заполнен водой.
Фото воды, вытекшей из снятого только что шлангаHatifnatt
29.11.2016 02:47Для производственных моек (общепита) это прописано в СанПиН кстати. См. СанПиН 2.3.6.1079-01
(Измененная редакция. Изм. № 2)
3.8. Производственное оборудование и моечные ванны присоединяются к канализационной сети с воздушным разрывом не менее 20 мм от верха приемной воронки. Все приемники стоков внутренней канализации имеют гидравлические затворы (сифоны).
Nizametdinov
29.11.2016 09:10ценизм снипов и методичек по расчету потерь с военной кафедры местами радует.
Моечная ванна — это большая раковина. К домашней раковине требования нет, ибо тут только 1-2 человека продрищется :)?
Судя по этому санпин кстати для слива дренажа достаточно сделать U колено шлангом для затвора, но так как слив не постоянный он будет пересыхать, поэтому городят сухой сифон. Но логика выше говорит что это лишнее для напорных сливов
maratische
30.11.2016 13:29у меня на сифоне под раковиной кухни обнаружили «коннекторы» для подключения посудомойки и стиралки, куда и воткнул их
опять же содержимое сифона раковины промывается ацкой химией из посудомойки
lexuspp
01.12.2016 19:59А вот если такой малореальный, но возможный случай.
Вот собираетесь промыть фильтры. Открываете краны, а тут внезапно воды нету, и еще эффект обратной тяги. То есть холодная вода вместо того что бы приходить начинает убывать (к примеру потому что сосед внизу тоже открыл кран). И получается что начнет подсасываться содержимое из канализации?Nizametdinov
01.12.2016 20:05>>>И получается что начнет подсасываться содержимое из канализации?
У нас в стране практически нет напорной канализации. То есть подсасывать может только воздух.
Этот подсос воздуха — вполне реально может произойти, но совпасть должны факторы с вероятностью уровня «встретить вчера динозавра в Нью-Йорке».
himch
28.11.2016 23:23Правильно считают, бактериальное заражение не нужно.
Судя по комплектации, вдохновлялись работами Игоря Иващенко?Nizametdinov
28.11.2016 23:36+1>>>вдохновлялись работами Игоря Иващенко
Впервые слышу, гугл выдает картинки с водоразводкой, похоже какой то сантехник прошаренный.
А по комплектации:
far — был очень положительный опыт на прошлой квартире по кое какой арматуре
rehau трубы\фиттинги — просто посмотрел как устроена гильза обжимная, это гениально
бугатти краны — тоже опыт с прошлой квартиры.
xsash
28.11.2016 20:53у данного запорного крана какая логика, у меня сейчас стоит нептун на 12 вольт, там три провода, (земля + два), при подачи напряжения кран либо закрывается, либо открывается, стоят концевики
нашел на сайте производителя
Управление.
Соединение черного провода с синим проводом (GND): закрытие шарового электропривода.
Отсоединение черного провода от синего провода (GND): открытие шарового электропривода.zvirusz
28.11.2016 21:03Там есть 2 варианта (помимо деления на 220/12в):
1. Нормально-открытый, когда в разомкнутом состоянии контактов кран открыт, в замкнутом — закрыт. Вы про него и написали.
2. «С пропорциональным управлением» — когда при подключении к нулю одного из 2 проводов соответственно меняется и состояние крана.Nizametdinov
28.11.2016 21:18С пропрциональным — был еще третий вариант — там надо была кодовой посылкой задавать значение 0-255 градус открытия, сейчас не нашел на сайте.
Но это все не совсем правильно — это же шаровый кран, а не регулирующий вентиль. Нельзя его в полуоткрытом состоянии использовать. То есть 1 вариант самый правильный для использования по прямому (отсечному) назначению ИМХО.
Про регулировку — отдельно напишу, на отоплении использую.
Nizametdinov
28.11.2016 21:10Тут напряжние на кране должно быть всегда по хорошему.
Черный провод — это фактически подтянутый к + вывод контроллера внутри крана.
Замыкаем на землю — контроллер внутри привода читает с этого порта 0 и закрывает кран.
В принципе можно коммутировать чем угодно — реле, или как в статье оптопарой, или простом слаботочным транзистором, типа 2N3904. Но лучше оптопарой, стоимость такая же, а по напряжению развязка надежнее.
shurik303
28.11.2016 21:25На подобном фильтре (Honeywell) я сетку поменял на 50мкм, и что характерно, не забивается, а вот следующий за ним полипропиленовый, тоже 50мкм, стабильно меняется раз в два месяца. И вот еще, интересно, зачем шаговый двигатель, ведь шаровый клапан не сможет нормально дросселировать поток. А для гидролока, была идея: применить модульную серву и 555 таймер, но так и осталась идеей.
Nizametdinov
28.11.2016 21:34>>>И вот еще, интересно, зачем шаговый двигатель, ведь шаровый клапан не сможет нормально дросселировать поток.
Могу только предпологать. Я там выше написал — в этой проф серии года три назад был привод с управлением посылкой байта в прямом и обратном порядке бит. Привод выставлял эти 255 значений угла поворота крана. Возможно двигатель пошел из-за унификации на все проф модели, крутящего момента с счетом пары шестерен редуктора в нем до дури.
>>>ведь шаровый клапан не сможет нормально дросселировать поток.
Полностью согласен, поэтому наличие кранов с пропорциональным управлением в этой серии считаю совсем лишним.angryMyPuK
28.11.2016 22:56скорей всего для профилактики, с некоторой периодичностью:
пример 1 раз в месяц — крутнуть туда обратно на 25 %Nizametdinov
28.11.2016 22:58Тут все проще с профилактикой, шар в одну сторону вращается.
В стандартном контроллере гидролока есть правило раз в месяц замыкать\размыкать линию. Шар соответсвенно делает полоборота (проходит полностью открытие и закрытие)
Urvin
29.11.2016 10:38И вот еще, интересно, зачем шаговый двигатель
Шаговый двигатель позволяет точно позиционировать кран в положении открыто/закрыто и не имеет инерции.Nizametdinov
29.11.2016 11:05Тут инерция не критична — с учетом редуктора перемещение штора на оборот минимальное.
А позоционирование идет по фотопаре, она определяет положение крана.
Поэтому да, зачем шаговый — это интересный вопрос.
APLe
29.11.2016 03:42Когда-то думал себе систему противопротечки поставить — но почитал форумы, пользователи жалуются на то, что краны ломаются — неожиданно и непредсказуемо.
Nizametdinov
29.11.2016 08:10Угу — и обратной связи нет, пользователь узнает о поломке после затопа.
Мой контроллер шлет показания уровня сигнала wifi каждые 30 сек, центральный сервер Openhab мониторит и если нет ссобщения больше 2 минут — отправляет нотификацию мне.varnav
29.11.2016 17:14Механическую часть мониторить всё равно не получится.
Nizametdinov
29.11.2016 17:18Про поломавшиеся краны гиролок проф еще ни разу не слышал, с его крутящим моментом перегрузить его — нереально ИМХО.
Но для праноиков можно и тут кое что допилить — надо вывести наружу сигнал с фотопары, и аналоговым входом проверять, что при подачи сигнала на закрытие синал меняется. Можно это делать и раз в месяц при профилактическом обороте крана в правиле «Rotate valves»uSasha
30.11.2016 17:33Можно тупо задублировать, поставить две штуки (или более, в зависимости от паранойи) последовательно :)
instalator
29.11.2016 06:38-2Объединение систем в единой точке (openhab) позволяет строить логику, не доступную набору автономных систем.
Тут важные момент, что система должна работать без «единой точки» (в данном случае OH), а у вас получается если упадет опенхаб или отключат электричество то все старания на защиту от протечек потрачены зря. Приемущество автономных именно в их автономности.
Я себе поставил аквасторож из-за автономности и прикрутил к нему управление и мониторинг состояния на сервер.beho1der
29.11.2016 07:55Я как понял у автора реализованно и автономность, а OH просто обьединяет все!
Nizametdinov
29.11.2016 08:08+2Вот ты прям в душу плюнул.
Логика срабатывания по показаниям датчиков протечки внутри контроллера.
Openhab не принимает в ней участия, он дает логику второго уровня, нотификации меня и отправку показаний счетчика в УК.
avstepanov
30.11.2016 17:16А как сделал мониторинг состояния и управление? Куда подключался — не поделишься?
instalator
30.11.2016 17:21Пока что сделал тупо, внутри блока управления поставил Ардуино мини и подпаялся к кнопкам и светодиодам. Управляю через NRF2.
На плате есть RXTX хочу посмотреть что там бегает, но пока руки не доходят до этого.avstepanov
30.11.2016 17:26Жестко :) Там еще есть «разъем для подключения расширений» — лучше подключаться через него (выглядит, как LAN-разъем).
На этом разъеме есть питание (5В), информация о срабатывании (если «авария», на линии 0, если все штатно — 1), есть две линии, которые при подаче на них 0 — откроют или закроют кран (в зависимости от того, на какую линию).
Только вот не нашел я там сигнала, который бы однозначно говорил, что кран открыт или закрыт :(instalator
30.11.2016 18:17Вариантов много, поэтому сделал на скорую руку, работает год уже.
Веб морда управления аквасторожом
Zzzuhell
29.11.2016 08:52Не думали добавить логику отключения ПММ/СМ при сработке системы по протечке?
Просто посудомойка или стиралка — гордые птицы. Захотят во время цикла свежей водички попить, а ее умный автомат перекрыл. И тут, КМК, начнется армегеддец :)Nizametdinov
29.11.2016 09:13Пробовал отключить — все с ними ок.
Ппм и см слили воду и заморгали ошибкой (мои siemens по крайней мере)Usper
30.11.2016 23:11Не доверяете аквастопу от сименса? Они вроде гарантию от протечек дают и даже обещают возместить расходы на ремонт, если таки протечка случится.
Nizametdinov
30.11.2016 23:13Не-не — этим доверяю, решение по защите в том числе гибкой подводки у них очень правильное.
Датчики больше нужны для зажиты от гибкой подводки в смесители на кухне и в ванной много всего окромя стиралки.
Aquahawk
29.11.2016 09:09+1Так шаровые краны на 1\2 дюйма если год не трогать — повернуть очень тяжело.
Удивлён что никто не написал. Аварийная запорная система должны по расписанию раз в месяц должна ночью перекрыть-открыть кран. Ибо кран который год никто не крутил может и перекрыть не до конца, и покрытие задраться, и вообще сломаться шар может(он хрупок и вверху его паз для отвёртки которая вентилем крутится).Nizametdinov
29.11.2016 09:16Эта фраза была про обычные краны на входе любой квартиры.
У гидролока контроллер крутит краны раз в месяц.
У меня эта логика в правиле на openhab, в статье его нет, оно совсем простое. Добавлю попозже, сейчас с мобилы
Godless
29.11.2016 10:15Помимо openhub рассматривали что-то для интеграции? Или просто пальцем в небо?
ЛирикаВот уже несколько лет тема умного дома мусолится и прогрессирует. Приятно видеть, что от простого описания кусочков мы перешли именно к вопросу объединения в одно целое. И отдельное спасибо за схемы/код и за то что поделились своим опытом.Nizametdinov
29.11.2016 11:18+1Думаю тут основная интеграция идет через mqtt на транспортном уровне. Как написали в самом первом коменте, можно openhab заменить на node red, или еще чем подобным. Можно вообще обойтись подписками mqtt одних нод на события других нод, исключив любую прослойку (кроме самого mqtt сервера).
Но я выбрал опенхаб за счет расширяемости плагинами и гибкости.
Это сейчас все на mqtt, а завтра надо будет прикрутить девайс с rs485 или еще чем то — опенхаб тут рулит
lingvo
29.11.2016 13:31Сейчас этих интеграционных софтов вагон и маленькая тележка. Вот примерный список самых популярных.
Трудно сказать, какой из них выстрелит, а какой загнется. Поэтому надо на чем-то остановиться, но сделать так, чтобы при случае можно было легко перелезть на что-то другое.
Zolg
29.11.2016 12:24Датчики давления
Практически — показометры. Точность +- 0,5 атм меня полностью устроила.
эти +- со временем гуляют, или просто ошибка калибровки? получится по разности показаний датчиков до и после загрязненность фильтра отслеживать (поймать изменение как раз на те самые 0,5 атм )?Nizametdinov
29.11.2016 12:39Ну я с запасом дал. Реально +- 0,08 у меня получилось на диапазоне 0-6 атм расхождение от Far манометра. Вопрос — насколько правильно показывает Far :).
Поидее да — можно поставить два датчика и мониторить загрязнение фильтра, хорошая идея.
aboltys
29.11.2016 13:36Спасибо за статью! Сам реализую подобную систему и тоже на openhab, только помимо водоснабжения прикрутил еще электроснабжение, мониторинг климата и освещение. Изначально пробовал несколько систем можордомо, iobroker (в самом начале его пути), остановился на openhab по причине множества биндингов, можно подключить практически любое устройство, ну и мануалов на момент освоения было больше :) Из подходов автора понравилось, что модуль управления шариками автономный, openhab лишь дополняет систему, в случае протечки и неактивности openhab вода все равно перекроется, сам придерживаюсь такого же принципа. Из пожеланий, все же рекомендую перходить с MQTT на что-нибудь другое (по крайней мере для важных компонент, таких как водоснабжение и электричество) например на ModBus и соответственно переводить эти системы на проводную шину, у меня нечасто, но бывали траблы с MQTT. У себя еще хочу реализовать автономные счетчики для воды на PCF8583 (питаются от обычной часовой батарейки, подключаются к контролеру по i2c), что бы разгрузить основной контроллер и openhab от подсчета и хранения количества воды.
Nizametdinov
29.11.2016 13:51>>>только помимо водоснабжения прикрутил еще электроснабжение, мониторинг климата и освещение
А у тебя это все на одном контроллере?
>>>все же рекомендую перходить с MQTT на что-нибудь другое
Пока с mqtt у меня все железо-бетонно. Для москито мои 0,5 сообщения в сек не нагрузка. Провода заложены, сам конечно больше провод уважаю, wifi всегда лотерея — но пока живет.
Тут еще такая фигня — я закопал 800 метров витой пары на 56 кв метрах и все равно находятся точки, где нафакапил — и придется по wifi идти однозначно.
>>>еще хочу реализовать автономные счетчики для воды на PCF8583
Тоже мысли такие были, пока обошелся суперконденсатором на пару недель, посмотрим как себя поведет.
У меня нет такого — сделал и живет, все время чешется — контроллер управления светом 4-ую итерацию сейчас будет переживать.aboltys
29.11.2016 14:28Не, у меня дома такой зоопарк, что мама не горюй))) все это делалось постепенно, но все отлично внедряется в openhab, соответственно для всего можно писать правила)
Учет электроснабжения реализован на SDM220MT (покупал на алиэкспресс) в openhab заведен по ModBus, счетчик ставится сразу после вводного меркурия (к нему нереально подключится, все опломбировано и объяснить электрикам что-то нереально), второй счетчик поставил на одну из вводных линий (для мониторинга определенных устройств), на сервере торчит обычный копеечный USB ModBus адаптер, счетчик в регистрах выдает полную, активную, реактивную мощности, напряжение, ток, частоту, косинус фи и еще кажется что-то.
Свет делал очень давно и реализован через noolite-ские контроллеры и пульты, в openhab есть биндинг, через который можно рулить как контроллерами, так и принимать команды с пультов.
Всевозможные датчики (температура, влажность, освещенность и т.д.) реализованы через esp8266, заводятся в openhab через MQTT.
Бесперебойник как обычно через USB -> NUT -> Network UPS Tools Binding.
Прелесть ModBus в том что одна шина (фактически 2 провода витой пары) в длину может достигать до 1,2 км, и на одну шину можно вешать кучу устройств, плюс время отклика достаточно малое.
Если интересно чуть позже выложу скриншоты с графиков от счетчика SDM220MT.
Кстати, я так понял, что датчики давления обычные аналоговые, подключаются к АЦП? Какой там макс уровень 5в или 3,3в?Nizametdinov
29.11.2016 14:38>>>SDM220MT.
По нему была статья тут не так давно.
>>>датчики давления обычные аналоговые, подключаются к АЦП?
Угу. Там +5в, земля и сигнальная линия.aboltys
29.11.2016 14:59Кстати, у вас на скриншоте давления 4 и 6 атм, не многовато? может редукторами понизить до 2,5 — 3 атм, всяко гибкие подводки сохранее будут. Или датчики стоят до редукторов?
Nizametdinov
29.11.2016 15:02Это до редукторов давление, на фильтре 100мкм. После редукторов 2,5.
И это я на 10 этаже, простая формула говорит, что на 1 этаже 9 очков в холодном стояке и кто то выбрасывает редукторы при ремонте :)Tomasina
30.11.2016 10:20а в доме какая водоразводка — снизу вверх, или сверху вниз?
Nizametdinov
30.11.2016 13:33Гравитация на нашей планете одинаковая при любой подаче воды :).
Водоразводка — с 1 по 10 этаж — все подача снизу.
С 11 по 19 этаж — горячая сверху, холодная снизу.
aboltys
29.11.2016 15:15+1Кстати, если будите реализовывать учет электроэнергии, то не советую неинвазивные методы, точность крайне низкая, до установки SDM220MT, собирал неинвазивные датчики тока из проекта опенэнерджимониторинг, заколебался его настраивать, напряжение еще более-менее, а ток измеряет очень грубо, SDM220MT измерения через шунт, точность намного выше.
beho1der
29.11.2016 18:03Слегка путаете, протокол и интерфейс. ModBus у вас работает скорее всего поверх RS485. А если использовать ModBusTCP то он не лучше в плане надежности, чем тот же MQTT.
lingvo
29.11.2016 14:32Из пожеланий, все же рекомендую перходить с MQTT на что-нибудь другое (по крайней мере для важных компонент, таких как водоснабжение и электричество) например на ModBus и соответственно переводить эти системы на проводную шину, у меня нечасто, но бывали траблы с MQTT
И чем вас Modbus тогда спасет? Странно слышать о ненадежности MQTT — этот протокол сам по себе рассчитан на высокую надежность передачи в любых средах, в том числе Wi-Fi и сотовых сетях. Каждое сообщение подтверждается, также есть QoS, гарантирующие доставку сообщений и периодические ping-опросы, чтобы знать, если устройство отвалилось. Если у вас были с ним траблы, то либо какое-то из устройств не реализовало поддержку этого протокола полностью, либо были проблемы с физическим каналом передачи, но это уже вопрос не к MQTT. То, что провода лучше радио, это понятно. Но если это будет Ethernet c MQTT, то по надежности это будет не хуже, чем тот же Modbus TCP.aboltys
29.11.2016 14:54Вполне возможно, что проблемы на аппаратном уровне, MQTT поднимал на esp8266, периодически раз в несколько месяцев какой то из датчиков отваливается, именно не реагирует на MQTT запросы, хотя GET запросами инфа получается. У себя пока реализовал правила, если uptime через MQTT не меняется 2 мин, то посылается GET команда на перезагрузку esp8266 (костыль я знаю, но времени пока нет нормально сделать).
Nizametdinov
29.11.2016 15:00А на чем программируешь?
У меня есть две ноды на esp8266 wemos d1 mini — скетчи на ардуино ide, ни разу не отваливались за полгода.aboltys
29.11.2016 15:09Изначально начинал на arduino ide, но чем больше система становилась, тем больше понимал, что программист с меня так себе))) и время на программирование уходит гораздо больше, чем на железную составляющую, в общем перешел на готовые прошивки от хоумс смарт, сейчас ковыряю есп изи
Nizametdinov
29.11.2016 15:15В этом и может быть проблема. Все эти сборники — попытка впихнуть невпихуемое. Там и вебсервера и поддержка кучи датчиков, это все жрет память, а ее гулькин фиг.
Библитеки mqtt и ip стек на esp8266 ардуино ide вылизывается ацкой толпой народа, посмотри сколько народа комитится на гитхабе в этом проекте, это не сравнимо с поделками кулибиных, какими бы крутыми они не были.
Попробуй написать тестовую ноду в arduino ide и посмотри как у нее будет с отваливаниемaboltys
29.11.2016 15:20на счет впихнуть невпихуемое согласен )) за свободной памятью слежу, все лишнее стараюсь обрубать, на счет тестовой ноды, нужно будет в одну есп залить посмотреть на стабильность
varnav
29.11.2016 16:49-2Чем сложнее система — тем ниже её надёжность.
borec1
30.11.2016 19:42Не по теме, конечно. Но в принципе — да.
По мне так поставить два запорных крана с управлением от ВЫКЛЮЧАТЕЛЯ. Уходишь из дома — выключаешь не только весь свет (все же это делают, да?), но и воду.
Стоимость в разы ниже. Надёжность — не меньше.Nizametdinov
30.11.2016 19:45Звонок на телефон: Чувак, тут такие девушки — развратные и доступные, давай к нам?
А ты в ответ: Не могу, у меня стиралка еще не постирала. :)
Шутка конечно, но с долей правды. Такой кондовый сценарий предполагает, что ты не будешь пользоваться этим выключателем при включенной ПММ и СМ. А это человеческий фактор, он всегда стреляет.borec1
30.11.2016 19:59СМ имеется с незапамятных времён. ПмМ была до преезда (в новую кухню не стали ставить — нет смысла при семье из 3 человек). Ни разу не оставляли включёнными эти приборы, когда уходили из дома. Не знаю почему. Может недоверие ко всей бытовой технике*. Может ещё что-то. Тем не менее ни разу такой ситуации не возникало.
* — родители, уходя из дома, выключают телевизор из розетки. Наверное наследственное :))
EvalApply
30.11.2016 14:52Что за шланги использовали для разводки воды?
Nizametdinov
30.11.2016 14:55Шланги??? Трубы наверно — это Rehau Stabil
EvalApply
30.11.2016 15:10Спасибо!
Был незнаком c ними, обычно ПП или МП трубы белые, серые — шланги.Nizametdinov
30.11.2016 15:21У рехау каждая серия труб своего цвета, для отопления например розовые :).
Они ощутимо дороже обычного металопласта и требуют спец инструмента для натяжки гильз — но по надежности трубы и соединения несравнимы с обычными.
Navi154
30.11.2016 15:15И только тут начинается умный дом…
Объединение систем в единой точке (openhab) позволяет строить логику, не доступную набору автономных систем. Например: пришло событие увеличения счетчика воды — система безопасности активна, замки входной двери закрыты, потребление электроэнергии посудомойкой и стиралкой менее 5 Вт — значит зафиксирована протечка мимо датчиков.
Вот вот. Все на датчики надеются. А если труба лопнула где нет датчика. При вашей схеме можно просто считать потребление на каждой точке и сумму сравнивать с входным расходом.
— появился расход на входе в квартиру, значит мониторим потребители. Суммируем все потребители за определенный промежуток времени и сравниваем сумму с той что прошла на вход за тот же период времени.
Если совпадают — все ок. Если разница, значит куда то еще уходит. Датчики молчат — проблема в трубе.Nizametdinov
30.11.2016 15:18Принцип понят правильно, а реализация понята не правильно :).
Я меряю потребление электричества, а не воды у двух приборов (стиралка и посудомойка).
То есть если меня нет дома, а работает посудомойка — то тикающий счетчик — это нормально.
А вот если меня нет дома, посудомойка и стиралка не потребляют электричество — это уже беда.Navi154
30.11.2016 15:27Я то как раз и имел ввиду недостаток вашей логики. Пример. Вы дома. Посудомойка не арбайтен. Стирлку сдали в ремонт. Никакого потребления электричества. Вода расходуется! В чем дело? Ну конечно же унитаз. Или кран в раковине.
А если вы дома, но спите. а лопнула труба. Датчики далеко. Стиралка и посудомойка электричество не кушают. Значит все ок??? Спим дальше. Как в этом случае определить кто расходует воду? Кран в ванной или в раковине.
А если считать все потребители то сразу станет ясно. Если вода пошла, но нет расхода на конечных потребителях — тревога. А еще лучше считать сумму. Так как где тонко там и рвется. Лопнула труба в момент открытия крана. Если просто смотреть есть расход или нет. То не определишь. А если утекло 3л, а с крана выбежал всего 1, то вопрос — куда убежали еще 2?
вот именно это и имел ввиду.Nizametdinov
30.11.2016 15:36А — понял. Это совсем идеальный, но нереальный вариант — его проблема вот тут:
>>> если считать все потребители то сразу станет ясно
Несуществует кранов и унитазов с встроенными счетчиками воды (может и к лучшему :) ).
Если бы они были — да, можно вообще отказаться от датчиков.
Проблема лопнувшей трубы у меня минимизируется по другому:
1) примение труб рехау с натяжными гильзами. Это ипически надежное решение.
2) в туалете и ванной полы сделаны с уклоном в сторону зумпфа (см фото), где бы ни лопнула труба — вода потечет в зумпф и замкнет датчик. Проблема только на кухне — там нет уклона.
3) практически нет гибкой подводки (только от смесителя на кухне).
Полностью пока нельзя застраховаться, можно только минимизировать риски.Navi154
30.11.2016 15:44Даже ваше решение — это уже много. Я лишь подсказал как бы это хотелось видеть в идеале.
А в чем проблема со счетчиками на кранах и унитазах. Их ведь можно и установить. Согласен это деньги. Но на будущее. Вдруг под вами будет квартира олигарха ))) с крутым ремонтом.
Я ванной сделал пассивную систему безопасности. Так же как и у вас уклон к вертикальной канализационной трубе. а в нее врезал сифон (по примеру как в отелях душ и сифон вделан в пол). Получается если что… то все бежит и сливается как раз в этот сифон и канализацию.
Один минус. Время от времени (месяца3-4) там высыхает вода. И тогда приходится устраивать потоп в ручную. Что бы был гидрозамок от запаха. Ну а поскольку полы в ванной моем, то Достаточно плеснуть лишнего и пусть туда сбегает.
Nizametdinov
30.11.2016 15:50>>>А в чем проблема со счетчиками на кранах и унитазах.
Пороблема не в деньгах. Посмотрите любой кран — у него есть гибкая или медная подводка диаметром 8-11мм. Ваш счетчик все равно будет до нее. И если порвет эту подводку, вода польется не в раковину, но будет считаться и в вашем алгоритме все будет ОК, хотя протекли. Надо счетчик прям внутрь крана встраивать или в его выпуск, а это очень сложно технически.
>>>Время от времени (месяца3-4) там высыхает вода.
Залейте туда 2 столовых ложки растительного масла и премешайте, что бы оно «всплыло» с обоих сторон сифона. Это исключит испарение воды из сифона. Аналогично совветую делать, когда едете в отпуск с любым сифоном.Navi154
30.11.2016 16:44за масло спасибо, не подумал.
а насчет счетчика. Именно поэтому датчик протечки там и нужен. Так как «последняя миля» не защищена. А так согласен — были бы встроенные то меньше возни. Зато если неконтролируемая утечка и будет то только здесь. И здесь как раз датчик.
uSasha
30.11.2016 17:38ИМХО проблема надумана и это оверинжиниринг. Мокрых точек в квартире 2-3-4, обычно не больше. Мне кажется, раскидать по ним датчиков не должно быть проблемой.
Skynet2034
30.11.2016 16:56Выбирал тупо в лоб по крутящему моменту.… Так шаровые краны на 1\2 дюйма если год не трогать — повернуть очень тяжело
А не легче их просто запрограммировать на цикл закрытие-открытие ну, скажем, раз в неделю? Тогда и запас по крутящему моменту не понадобится. А значит — краны и подешевле будут, и габаритами поменьше.
superyarik
01.12.2016 11:36расскажите подробнее про датчик протечки? где покупали у нас? я сейчас делаю подобную систему, только на wemos плате, датчик пока стоит самый простой ардуиновский с цифровым выводом.
Nizametdinov
01.12.2016 11:43Датчики — http://gidrolock.ru/production/datchiki-protechki-vody-gidrolock/, у меня WSU.
Покупал в Мск в плеер.сру или в stelmarket — точно уже не помню, цена около 600р каждый.
Учитывай — что у этих активных датчиков выход «открытый коллектор». То есть он по срабатыванию подтянет вывод контроллера к земле и этот вывод должен быть предварительно подтянут к питанию через резистор 4,7к-10к.
Это все есть на моей схеме, смотри картинку — выводы D6 и D7.superyarik
03.12.2016 16:01а почему вы не использовали встроенную подтяжку пинов? их нет в плате или недостаточно такой подтяжки?
и зачем r1 и r2?Nizametdinov
04.12.2016 01:39Встроенная подтяжка есть в контроллер, но она довольно слабая — около 40к сопротивление подтягивающего резистора.
r1\2 — токоограничение сопротивлением 200-300 Ом. Когда ток маленький — падение напряжения на них минимальное, но с ростом тока — падение растет, пассивная защита портов контроллера от больших токов.superyarik
04.12.2016 10:03А согласование уровней не нужно в данном случае? Питание датчика-то 5v, а логические пины по идее 3.3 на плате
Nizametdinov
04.12.2016 11:26Это зависит от контроллера, насколько его входы чувствительны к перенапряжению.
Для STM32F205, который под крышкой photon — цифровые входы толерантны к 5в, а вот аналоговые нет — погорят.superyarik
05.12.2016 17:15На wemos d1 r2 как раз 10к на подтяжке пина, сделал через модуль согласования уровней — работает(датчик от 3.3в не взлетел, чуда не случилось).
спасибо! Существуют аналогичные промышленные датчики пламени и утечки газа(дыма)? а то в свой блок я воткнул обычный ардуиновский датчик пламени и MQ-2 датчик газа, на изменение состава в плане дыма/газа кое-как реагирует.
И ещё: у вас есть нотификация о том, что данные перестали поступать от системы?Nizametdinov
05.12.2016 18:33>>Существуют аналогичные промышленные датчики пламени и утечки газа(дыма)?
Да, гугли по «ИЗВЕЩАТЕЛЬ ПОЖАРНЫЙ ДЫМОВОЙ ОПТИКО-ЭЛЕКТРОННЫЙ», но его надо будет курочить и искать как запитать\снимать сигнал.
>>>у вас есть нотификация о том, что данные перестали поступать от системы?
Да, каждая нода раз в 30 секунд отправляет сообщение с уровнем сигнала wifi.
Openhab раз в минуту проверяет, что бы между посылками не было перерыва более 2 минут, если больше — то сообщает мне имя ноды в телеграмм.
Код опенхабаrule «Check node online» //every minutes
when
Time cron «0 0/1 * * * ?» //every min
then
var Date d_now = new Date()
diff = d_now.getTime() — watercount_rssi.lastUpdate().getTime()
if (diff > 120000 && diff < 180050)
{
sendTelegram("*****_bot", «water_count is offline»)
}
end
theg4sh
01.12.2016 23:03Прекрасная статья, спасибо!
Все здорово, но почему корпус из PLA для потенциально влажного помещения?
Он же имеет свойство впитывать влагу, что в свою очередь может неблагоприятно отразиться на электронике.
Да, и не забудьте удостовериться года через 1,5-2, что корпус все еще в рабочем состоянии:
Nizametdinov
01.12.2016 23:12Угу, читал что PLA недолговечен.
Пробовал на ABS перейти, но без термокамеры такие большие модели ведет и они отслаиваются.
На пару лет точно хватит, а к тому времени надеюсь принтер перевести на coreXY кинематику и «закамерить».
Времени бы еще на все это :)theg4sh
02.12.2016 00:31Да, согласен насчет отслоения, думаю, это происходит из-за плохого контакта с поверхностью. Но я нашел выход: печатаю без прямо на стекле на столе с подогревом, перед печатью наношу на место печати лак для волос Syoss экстрасильной фиксации (другие марки не пробовал в связи с прекрасными показателями этой). За все время еще ни разу ничего не отслоилось, только детали бывает с приличным усилием приходится отдирать от нагретого стола. Что показывает, что лак намного лучшее сцепление по сравнению со каптоновым покрытием. Плюс старое напыление после 5+ печатей отлично смывается под струей воды.
Как термокамера для Prusa i3 отлично подошел перевернутый квадратный журнальный столик из Ikea, обернутый упаковочной пленкой. Как вариант, можно кстати сделать стенки из стеклопластика для эстетики, но это уже, как говорится, на вкус и цвет все фломастеры разные :)
Успехов с умным домом!
mike_y_k
02.12.2016 11:26Небольшое дополнение к списку систем — waterleak.ru
Начинка у них сделана на решениях от TI
Система модульная, разработчики идут на контакт.
Имеет сразу и автономное питание (4*AA) и сетевой адаптер.
Все соединения обычными RJ коннекторами (4P, 6P, 8P).
Используемые краны имеют очень малое время срабатывания при небольшом потреблении.
Опыт эксплуатации за почти 2 года только поменял один раз резервные батарейки ;).Nizametdinov
02.12.2016 11:42База от Ти — это очень хорошо, у них есть очень энергоэффективные решения.
Минус ИМХО — краны, на сайте ноль инфы, но по виду и времени открывания похожы на обычный Китай с Али, типа такого
https://ru.aliexpress.com/store/product/5pcs-lot-NPT-BSP-SS304-1-2-electric-control-valve-DC5V-2-wires-control-for-water/116043_879090156.html
Два провода, управление путем переброса полярности питания.
У них слабый крутящий, около 2N*m по «их» измерениям, хотя реально и того меньше. Тут простая математика — они работают 5 сек, при мощности 5в * 0,5А = 2,5Вт — итого 12,5Вт тратят.
Гидролок декларирует 21N*m, но открывается 30 сек и жрет при этом 0,7А * 12В = 8,4Вт. Итого за закрытие = 252Вт.
Допустим гидролок не врет на счет крутящего, получаем пропорцию:
21 к 252 как Х к 8,4
Х = 0,7 N*m
Че то не верю, что китайцы порвали все шаблоны и увеличили эффективность двигла в 3 раза :)mike_y_k
02.12.2016 12:33С кранами там все хорошо и управление явно не полярностью.
Интерфейс крана обеспечивает его диагностику и возврат в установленное состояние если вдруг руками покрутили. Сам не пробовал, но видел остатки карандаша после срабатывания такого крана. На скорости почти не сказалось. При регулярном выполнении контроллером цикла закрыть-открыть крутящий момент не самый важный показатель.
Внутри металлический редуктор и достаточно высокобортный двигатель.
Сам кран Bugatti.
Так что на тему качества — далеко не noname ширпотреб из сплавов с высоким содержанием цинка (проходил такое — за год почти растворился).
mike_y_k
02.12.2016 12:49У нас несколько разное знание о данном предмете.
Для Вас он на картинке, а я его могу руками пощупать.
И окно есть для визуального контроля и руками можно при необходимости закрыть-открыть. Усилие на ручном приводе через редуктор весьма небольшое, только крутить долго надо. Ну тут законы механики никак не обмануть.Nizametdinov
02.12.2016 13:37https://ru.aliexpress.com/store/product/Stainless-Steel-DN15-Electirc-Operated-Valve-DC12V-7-Wires-NPT-BSP-Female-1-2-Actuated-Valve/116043_32720370425.html — в том же магазине, те же яйца, только с концевиками.
Там же внутренности редуктора.
>>>Сам кран Bugatti.
По фото с сайта совсем не похож, у бугатти под приводы одна модель 200 крана и она на моих фото выше, если система уже стоит у тебя — сделай фото крана, забрось на https://habrastorage.org/ — и сюда ссылку, очень интересно посмотреть что за зверь такой.
>>>видел остатки карандаша после срабатывания такого крана
Есть такое видео — это индастриал привод с пиковым моментом в 40Н*м и то тупит https://www.youtube.com/watch?v=8a0RgXeA_Ag
>>>Для Вас он на картинке, а я его могу руками пощупать.
Есть такая штука — физика и математика — если ими пользоваться, то можно и не щупать :). Но щупать — да, всегда интересно.
geraole
06.12.2016 21:20Что будет когда электричество пропадет?
Nizametdinov
06.12.2016 21:31Нуууу, боюсь в этом случае прекратят работать межатомарные силы и нам уже будет на все пофиг.
Вероятность протечки в момент отключения электричества стремится к нулю(ибо является произведением вероятностей двух крайне малых вероятностей отдельных событий), с тем же успехом можно защаться от падения метеорита в отдельно взятой квартире.
Но если охота по-параноить — надо использовать блок питания на 12в, к нему в буферном режиме свинцовую батарею и получать 5в через DC-Dc преобразователь.
lingvo
Так как у вас MQTT уже используется, то советую вместо Rules в OpenHAB сделать всю логику в Node-Red — там программировать и отлаживать такие сценарии на порядок проще и по опыту скажу, что по сравнению с OH он вообще не глючен. А OpenHAB использовать только для перевода различных интерфейсов к MQTT — веб, телеграмы и т.д.
Nizametdinov
Спасиб, покурю статью — как то прошла мимо, вообще не в курсе.
Тут еще такое дело — делать автоматизацию можно на чем угодно, хоть на скриптах — тут кому что удобнее и привычнее. Если кто то реализует подобное моему на своем "каркасе" и запилит ответную статью будет вообще прекрасно.
ZigFisher
При использовании телефона с OS Android и для работы с MQTT рекомендую всем приложение MQTT Dash.
Приложение бесплатное, стабильное, простое в настройках и управлении, кушает минимум ресурсов, автор всегда на связи.
lingvo
У меня на андроидных панелях стоит Commandfusion iViewer с MQTT скриптом — бесплатно на один скрин и графических возможностей больше. Работает в 24/7 уже месяцев 6 как.
Но Dash-приложение с MQTT интерфейсом все равно нужно, только слегка в другом виде — я всех девелоперов прошу об этом:
— сделайте его на iOS и на Android
— сделайте возможность посылать MQTT сообщения с заблокированного экрана, чтобы не нужно было долго разблокировать телефон, потом искать и открывать нужное приложение. Надо чтобы просто взял телефон, два раза на ощупь нажал и все, как в Homekit на Apple.
Тогда из телефона получится идеальный пульт управления любой MQTT автоматизацией. Я даже за такое бы приложение заплатил пару баксов. Передайте разработчику, если можно.
superyarik
а как Commandfusion iViewer взаимодействет с домашним сервером, когда вы не дома? порты пробрасываются как-то через домашний роутер?