Термостат по wifi mqtt

Термостат для котла на esp8266 (Часть 1)

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

Все я запланировал делать на контроллере ESP8266, управлять на платформе Majordomo, а передавать информацию по протоколу MQTT.

Что я использовал

  • Контроллер ESP8266
  • Водостойкий датчик температуры Dallas 2x
  • Ультразвуковой датчик расстояния HC-SR04P 3v
  • Макетная плата для тестов

Мои ошибки

1. Первое что я посоветую, так это не паять на прямую все датчики к контроллеру, а присоединять все через штепсели.

Было так, что написал код, припаял, пошел в котельную, все установил, прошла неделя тестов и тут я понял, что хочу доработать код, а так как все припаяно на прямую, пришлось контроллер тащить со всеми проводами, что не очень удобно.

2. Не пичкать лишнего!

Решил изначально добавить светодиодов, чтобы можно было видеть, работает ли контроллер, есть ли связь с wi-fi, и т.д. Оказалось обсалютно бесполезной идеей, только лишняя пайка (Это на мой взгляд).

3. Купить коробку, куда положить контроллер.

Лучше сразу заморочиться и сделать красивенько в коробочке и не откладывать на потом!

Проблемы в коде, с которыми я столкнулся

1. Не правильные показания с сенсоров

Датчики температуры, могут дать сбой и выдать заоблачную температуру, такую как -127 или любую другую. Стоит сразу создать функцию, которая будет проверять приблизительно реальную цифру, скажем, если это бойлер, то температура может быть от 10 до 70 градусов.

2. Mqtt отключает клиента, если нету цикла в течении 15 секунд

Чтобы отправлять команды на контроллер с Majordomo, нужно, чтобы контроллер всегда имел связь с сервером MQTT, иначе вы не сможете управлять реле. Так как мне не нужно получать данные каждую секунду, а к примеру раз в минуту, то я использовал delay, для паузы цикла. Но проблема в том, что тогда сервер MQTT разрывает связь с клиентом esp8266. Тогда я решил использовать другой метод тайминга.

В итоге, что у меня получилось

 #include #include #include #include //#include //SR-04 const int trigPin = 13; //D7 const int echoPin = 12; //D6 //DALLAS #define PIN_DS18B20 5 //D1 int countDallasSensors; //VARIABLES long SR_Duration; int SR_Distance; float tempBoiler; float tempPot; //NETWORK byte mqtt_server[] = < 192, 168, 1, 231 >; char buffer[10]; // WiFi credentials. const char* WIFI_SSID = "#"; const char* WIFI_PASS = "#"; const char* MQTT_SSID = "#"; const char* MQTT_PASS = "#"; OneWire oneWire(PIN_DS18B20); DallasTemperature dallasSensors(&oneWire); void MQTTMessage(char* topic, byte* payload, unsigned int length) < >WiFiClient wifiClient; PubSubClient client(mqtt_server, 1883, MQTTMessage, wifiClient); void connectWIFI() < WiFi.persistent(false); WiFi.mode(WIFI_OFF); WiFi.mode(WIFI_STA); WiFi.begin(WIFI_SSID, WIFI_PASS); unsigned long wifiConnectStart = millis(); while (WiFi.status() != WL_CONNECTED) < delay(500); // Only try for 5 seconds. if (millis() - wifiConnectStart >5000) < return; >> > void reconnectMQTT() < // Loop until we're reconnected while (!client.connected()) < Serial.println("Reconnect to MQTT"); client.connect("ESP8266 Thermostate", MQTT_SSID, MQTT_PASS); client.publish("outTopic", "connecting.."); delay(5000); >> void getDistance() < // Clears the trigPin digitalWrite(trigPin, LOW); delayMicroseconds(2); // Sets the trigPin on HIGH state for 10 micro seconds digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); // Reads the echoPin, returns the sound wave travel time in microseconds SR_Duration = pulseIn(echoPin, HIGH); // Calculating the distance SR_Distance = SR_Duration * 0.034 / 2; >void getTemperature() < dallasSensors.requestTemperatures(); delay(1000); tempBoiler = dallasSensors.getTempCByIndex(0); tempPot = dallasSensors.getTempCByIndex(1); >void sendToServer(int distance, double tempBoiler, double tempPot, int countDallasSensors) < client.publish("outTopic", "connected"); if(distance < 150 && distance >0) < client.publish("ESP/ToHome/distance", String(distance).c_str()); >if(tempBoiler < 150 && tempBoiler >0) < client.publish("ESP/ToHome/tempBoiler", String(tempBoiler).c_str()); >if(tempPot < 150 && tempPot >0) < client.publish("ESP/ToHome/tempPot", String(tempPot).c_str()); >client.publish("ESP/ToHome/countDallasSensors", String(countDallasSensors).c_str()); Serial.println("Reported!"); delay(1000); > void toDeepSleep() < client.disconnect(); WiFi.disconnect(); delay(1000); Serial.println("Sleeping.."); delay(20); ESP.deepSleep(60e6); >void setup() < Serial.begin(9600); // Wait for serial to initialize. while (!Serial) < >dallasSensors.begin(); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); countDallasSensors = dallasSensors.getDeviceCount(); connectWIFI(); Serial.println("Device Started"); Serial.println("-------------------------------------"); > void loop() < if (WiFi.status() != WL_CONNECTED) < connectWIFI(); >if (!client.connected()) < reconnectMQTT(); >if (client.connected()) < getDistance(); getTemperature(); sendToServer(SR_Distance, tempBoiler, tempPot, countDallasSensors); toDeepSleep(); >client.loop(); > 

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

Читайте также:  Asrock deskmini a300 wifi

Настройка в majordomo

Первое, что нужно сделать, так это настроить mqtt, про сам mqtt я уже писал в статье «MQTT«. В самом majordomo нужно скачать модуль и заполнить все необходимые поля во вкладке «настройки».

Дальше нужно создать соответствующие объекты, проще всего создать в «простые устройства«, один будет, датчик процентное значение, а другой термостат.

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

 $min = 10; $max = 70; $val = 30; // Это значение которое пришло с датчика $percent = (100 - ((($val - $min) * 100) / ($max - $min))); $percent = number_format((float)$percent, 0, '.', ''); sg('Sensor_percentage01.value', $percent); 

Стоит ли заморачиваться?

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

Так же, если бойлер греется от котла, как в моем случае, то в весеннее и осеннее время, когда котел работает не постоянно, перед тем как сходить в душ, теперь можно посмотреть температуру воды, чтобы не было фиаско )).

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

Плюсов много, но вполне возможно, что все это дело можно оптимизировать еще лучше, так что всегда рад комментариям снизу!

Перед тем как полностью переходить на управление котлом через Majordomo, обязательно к прочтению статьи «Majordomo, защита от взлома«

Читайте также:  Windows and ubuntu wifi

One thought on “ Термостат для котла на esp8266 (Часть 1) ”

Ничего не ясно, а где код для реле и собственно «оно» само?
В чем термостатность?
Или вы просто сделали датчик на еспешке с отправкой на сервер данных о температуре и все?

Источник

Термостат по wifi mqtt

Документация ниже относиться к новому термостату !

Настройка термостата

Работа с отрицательными температурами требуют проверки !

Select thermostat — выбор номера термостата, выбор доступен, если в шестеренке установлено количество термостатов больше одного. Рекомендуется устанавливать количество не больше , чем требуется для экономии ресурсов.

В поле GPIO указываем номер GPIO, которым требуется управлять. Он может быть как локальный, так и на расширителях портов, а так же удаленный(но очень не желательно). Если это локальный GPIO, то он должен быть настроен на выход через опцию GPIO. При использовании расширителей портов они так же могут иметь настройки.

Если требуется использовать режим охлаждения или управлять понижением влажности, то нужно включить режим Enable invert mode.

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

В поле setup требуется указать значение температуры(или другого параметра в зависимости от типа датчика) , в поле Hysteresis требуется указать гистерезис. Все значения могут быть указаны так же до 3 знаков после запятой(точнее точки).

При ошибках чтения датчика после 3 попыток термостат выключает GPIO до устранения неисправности. При этом на странице термостата показывается ошибка.

Данные установки термостата передаются на все системы модуля, в том числе и на D2D или VSENS. Название метрик доступно на вкладке Metrics. Выключенные и не использующиеся термостаты не будут передавать данные, если выбран датчик disable и нажато после этого кнопка Set.

Коды ошибок: 4 — датчик не существует или еще не получены данные, 5 — 32 битное значение, не поддерживается термостатом, 100 и выше — ошибка датчика.

Работа с планировщиком заданий

На данный момент работа с термостатом предусмотрена только в новом планировщике заданий(cron).

Пример установки температуры по времени и дням недели, в поле state off требуется установить ночную температуру, значение state on не имеет значение, так как используем параметр set внутри кода:

week:1,2,3,4,5 //настройки для будней: set:20 7:00-16:00 set:25 16:01-22:00 week:6,7 //настройки для выходных: set:25 //можно упустить,т.к выше эта же температура установлена 7:00-22:00

Комментарии из примера требуется убрать при вставке в поле ввода.

Значения температуры вводятся без запятой, если в настройках термостата указали значение например с 2 знаками, то тут необходимо вводить значение умноженное на 100.

Работа в ModBus Slave

Поддерживается как чтение так и запись настроек через регистры Holding register начиная с 0 адреса.

На каждый термостат выделено 3 регистра по порядку : установка , гистерезис, ID датчика. Далее следуют настройки по порядку следующих термостатов, если они есть. Пример: 0 — первый термостат, 3 — второй термостат, 6 — третий термостат и т.д.

Данные в регистрах содержат целое число, количество знаков определяет установленное значение в веб интерфейсе. Пример: если там ранее было установлено значение 12.34 , то все настройки в ModBus идут умноженные на 100.

Читайте также:  Телефон то подключается то отключается от wifi

Работа в Interpreter

Из опции Interpreter доступно чтение и установка значения термостата:

thermsetX — переменная чтения значения термостата без запятой. Х — номер термостата считая от 1.

thermoset(1,251) — установит 25.1 градусов на 1 термостате, если изначально в настройках термостата было выставлено значение с 1 знаком после запятой.

Включать или выключать термостат в Interpreter можно используя надстройку управления как GPIO.

Используя условие можно менять значение термостата по времени. Пример:

Изменение значения при выполнения условия(например нажатие кнопки) с выводом на экран. Пример:

if(gpioget(14)==0) thermoset(1,thermset1+1) printd(1,_THERMSET1_) endif

Умное управление GPIO



В этом режиме подача команды на изменение состояния GPIO происходит только при событии. Поддерживается немедленная отправка состояния на MQTT и MajorDoMo. Ручное изменение GPIO нарушает логику работы термостата.

БЕЗ включенной опции — каждые 10 секунд, термостат принудительно включает требуемый уровень на GPIO. Внешнее управление не нарушает логику работы.

Крайне не рекомендуется использовать remap gpio и vgpio !

Управление термостатом через SMS GSM модули, Telnet, Telegram и ICQ (ESP32, ESP8266RTOS)

settermo X Y Z — Установка параметров указанного термостата, где X — номер термостата Y установка, Z — гистерезис.

gettermo X — чтение параметров указанного термостата, где X — номер термостата,

ontermo X — вкл термостата X,

offtermo X — выкл термостата X.

Управление термостатом через MQTT

email/hostname/ [set/]thermo_enX — Где — X — номер термостата. В топик можно слать 1 или 0 для вкл/выкл термостата;

email/hostname/ [set/]thermsetX Где — X — установка температуры термостата (гистерезис остается тот же);

email/hostname/[set/] thermhsX — установка гистерезиса. Где — X — номер термостата.

set добавляем, если включен отдельный топик на запись.

Управление термостатом get командами(API Options)

Описание настройки находится в документации опции.

Управление термостатами как GPIO

Для контроля включением/выключением термостата из любых систем модуля можно использовать дополнительную опцию, требуется указать в шестеренке начальный виртуальный gpio , например 200, в этом случае первый термостат будет соответствовать 200 gpio, второй — 201 и т.д.

Альтернативный термостат, реализация с помощью конструктора кода.

Источник

Inreviews

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

Для создания термостата котла будем использовать платформу ESP8266. Ее реализаций существует великое множество, от миниатюрных плат с одним цифровым выходом до отладочных с полноценным набором GPIO, встроенным стабилизатором питания и преобразователем TTL для прошивки и программирования.

Мой выбор пал на миниатюрную плату Wemos D1 mini Pro. У нее достаточное количество GPIO (11), встроенный стабилизатор напряжения, преобразователь USB-UART на CH340. В то же время плата имеет миниатюрные размеры, всего 2,5 на 3,5 см., что позволяет легко встраивать ее в готовый корпус.

Для компоновки докупил корпус на DIN-рейку, дисплей, датчики, реле, кнопки и блок питания на 5 вольт.

На скорую руку был собран тестовый стенд для разработки программной начинки. Софт можно написать самому в среде Arduino IDE а можно использовать готовые прошивки, типа WiFi-IoT или EspEasy.

По-скольку дома уже трудится сервер Openhab2 с Mosquitto, управление было решено сделать через mqtt. Панель управления будет иметь следующий вид.

В следующей статье рассмотрим процесс программной настройки и окончательную сборку термостата.

Источник

Оцените статью
Adblock
detector