Новости:

W202club.su - русскоязычный форум клуба любителей и владельцев автомобилей Мерседес-Бенц с акцентом на C-класс в кузове W202.

Главное меню

Умный дом с самого нуля.

Автор Kira, 17 апреля 2020, 06:52:01

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

KiraАвтор темы

Захотелось мне добавить интеллекта системе отопления, а то 21-й век на дворе, а она управляется архаичными термостатами. Об этом, наверно, будет неинтересно, ибо сложно для незнакомых с предметом, в основном там программирование да алгоритмы всякие, а вот о том, с чего начать, как подступиться, расскажу.

Сперва смотрел в сторону ардуинок с малинками, но вдруг наткнулся на такую замечательную штуку и решил не изобретать очередной велосипед. Штука "из коробки" работает с кучей разнообразных датчиков, без дополнительных усилий дружит с популярными шинами и протоколами, для простых задач, типа "событие -> действия" или, например, многоканального термостата, самодостаточна. Были заказаны MegaD-2561-RTC - управляющий модуль, MegaD-14-IOR - обвязка входов управляющего модуля, MegaD-14-R - по простому, релюшка на каждый выход управляющего модуля, блок питания 12В на ДИН-рейку и россыпь датчиков. Отправили СДЭКом, пришло быстро, дополнительно подарили удобную отвёртку с очень маленьким жалом.

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


Начнём с датчиков.

DS18B20. Самый распространённый датчик температуры. 
[attach id=0 msg=774048]

Подключение - проще некуда. Первая нога - земля, вторая - сигнал, третья - питание. Может работать и по двум проводам, но нам трёх не жалко. С первой и третей всё очевидно, вторую втыкаем в любой цифровой вход устройства. Например, Р30

[attach id=1 msg=774048]

Теперь надо сказать устройству, что мы в порт Р30 воткнули цифровой датчик температуры. Пишем в браузере 192.168.0.14/sec/?pt=30
Меняем NC на DSen (Не подключено на Цифровой датчик), нажимаем "Save". Устройство перезагружается. Теперь там же выбираем вид нашего датчика 1W (1wire), снова "Save". Всё. Датчик подключён и работает. В чём можно убедиться, набрав в браузере 192.168.0.14/sec/?pt=30&cmd=get. Увидим пустую страницу с гордой надписью "temp:22.01", где 22.01 - температура показываемая датчиком.

Но каждый раз, когда нужно узнать температуру, заглядывать в браузер неудобно. Покажем её где-нибудь, например, на таком дисплее. 

[attach id=2 msg=774048]

Дядюшка Ляо продаёт их в среднем по 200р/шт (искать SSD1306).

Подключение ненамного сложнее. Питание, земля, и, поскольку дисплей работает по шине I2C, нам понадобится два порта устройства. Ногу, подписанную SDA подключаем на один порт, пусть Р32, ногу SCL на другой, Р33. Объясняем устройству, что же это мы к нему подключили. По аналогии с датчиком. 192.168.0.14/sec/?pt=32, меняем NC на I2C, затем указываем, что это линия SDA, потом указываем, на каком порту у нас линия SCL (33), выбираем, к какой категории принадлежит наш дисплей (Misc), и выбираем наш дисплей (SSD1306). Так же надо сказать устройству, что к порту Р33 подключена линия SCL. 192.168.0.14/sec/?pt=33, меняем NC на I2C, Mode - SCL. Всё, дисплей подключён. И у нас на страничке настроек датчика (192.168.0.14/sec/?pt=30) появилось новое поле "Disp". Пишем туда номер порта, на который подключена линия SDA нашего дисплея - 32. Тепреь мы видим показания датчика температуры на дисплее. Ура.
[attach id=3 msg=774048]

А если нам нужно много датчиков температуры? На каждый выделять отдельный порт устройства? Слишком расточительно. Подключим их шиной. Для этого идём в настройки нашего датчика (192.168.0.14/sec/?pt=30) и меняем 1W на 1WBUS. И подключаем наши много датчиков параллельно первому. 
[attach id=4 msg=774048] 

Пишем в браузере 192.168.0.14/sec/?pt=30&cmd=list и видим вот такое.
"eef816a8013c:22.00;096c79a20003:21.93;f95979a20003:22.25;ad2816a8013c:22.06;1b2916a8013c:21.81;2f3716a8013c:21.87;7f9e79a20003:22.12"
На первый взгляд, абракадабра, однако, присмотревшись внимательно, видим, что это повторения строки вида "xxxxxxxxxxxx:yy.yy", разделённые точкой с запятой. хххххххххххх - это адрес датчика (у каждого он свой, уникальный, ну, по словам производителя), а уу.уу - температура, которую намерил этот датчик. Пока не слишком удобно, разберёмся с этим позже.

А пока подключим два других датчика. Bosch BME280 и HTU21D. Первый умеет мерить темпреатуру, атмосферное давление и влажность, второй только температуру и влажность. Оба работают по шине I2C. Подключаем их так же, как подключали дисплей. Питание, землю, линии SDA на отдельные порты устройства (пусть Р34 и Р35), а вот лния SCL может быть одна на всех (Р33). Вообще, SDA тоже, но будет чуть сложнее общаться с датчиками. Нам бы пока что попроще.
Настраиваем тоже так же, как настраивали дисплей. 192.168.0.14/sec/?pt=34(35), меняем NC на I2C, затем указываем, что это линия SDA, потом указываем, на каком порту у нас линия SCL (33), выбираем, к какой категории принадлежит датчик: Temp/Hum, и выбираем датчик BME280(HTU21D).  [attach id=5 msg=774048]

Получаем данные.
192.168.0.14/sec/?pt=34&cmd=get
Видим "temp:21.74/press:729.70/hum:26.926".

192.168.0.14/sec/?pt=35&cmd=get
Видим "temp:21.94/hum:26.67".

Ну и схема всех подключений.
[attach id=6 msg=774048]

Продолжение следует...

Михаил Платонов

Я конечно безмерно уважаю паяльник и программатор, но прошу прощения в 202 по крайней мере в ресте уже всё красиво осуществлено, и даже я бы сказал прогрессивнее, например тот же датчик температуры стоит с куллером для уменьшения погрешностей измерения, да и дальше разобраться по сути всё уже продумано
Не сочтите за неадекватную критику
http://vk.com/white_mike_spb
C230K xx97 111.975 722.605
WDB2020241F656420

Anver

Кирилл, тема классная! Особенно для частного дома.
Я вот сам конечно механик, и вот во всей теме не очень! Конечно если посидеть и разобраться, то думаю все может получится, лишь бы было желание!
Но вот как по мне , конечно, видеть температуру это классно, но как-бы научить дом самому себя включать и выключать. Если сможешь подсказать, буду очень благодарен
и может кому, кто живет в частном доме - это бы тоже пригодилось.
В общем идея такова:
В связи с тем, что пользую 2 тарифа, то очень бы хотелось чтобы все-таки в ночное время использовать на максимум (отопление и воду). Т.е. надо чтобы основное отопление (у меня это 4 тэны по 3кВт) включалось ночью ( с 23-00 до 7-00) , но опять же, чтобы имело верхнее ограничение по температуре (чтобы утром можно было одеться и не задохнуться от жара))), а днем переходило в режим поддержания (либо отключения) (это 2 тэны 1 и 3 кВт), но чтобы температура не опускалась ниже какой-то отметки.
Интернет плохенький (живу за городом), поэтому управление через Интернет не канает. И вот думаю , как правильно собрать данную конструкцию и что для этого надо??
У тебя гляжу голова "светлая" и все эти "плюшки-релюшки" тебе подчиняются, может подкинешь идейку??

KiraАвтор темы

Почитай про Штуку, она с этим легко справится. Часы в ней есть, в дополнение один любой температурный датчик, тот же  DS18B20 и, например, это. И в общем, всё. Ну, может, трёхкиловаттник через пускатель подключать. Запрограммировать её на включение-выключение по часам и температуре очень просто.

Злой

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

KiraАвтор темы

Anver, подробнее. MegaD-2561-RTC + MegaD-2R + DS18B20 + блок питания на 12В.
1. Подключаешь 2651 проводом к роутеру (где угодно, если нет в доме).
2. В браузере (можно с телефона, если он в вайфай сети этого роутера) пишешь "192.168.0.14/sec".
3. Config - Cron.
    T:23:00:0 Act 29:1
    T:7:00:0 Act 29:0
Что означает: в 23:00 каждый день (последний 0 значит каждый день, 1 понедельник, 2 вторник...) включить порт 29.
Вторая строка соответственно, в 7:00 каждый день выключить порт 29.
4. Config - Program
    if P30>25 -> 29:0;22:0
    if P30<15 -> 22:1
Что означает: если значение на порте 30 больше 25, выключить порты 29 и 22.
Вторая строка: если значение на порте 30 меньше 15, включить порт22.
5. Настраиваешь порт 30 на один датчик DS18B20 как написано в первом посте. Тянешь провод в комнату, подключаешь датчик.
6. Соединяешь MegaD-2561-RTC и MegaD-2R как написано здесь.
7. Подключаешь к MegaD-2R ночные тэны на R1, дневные на R2. Если напрямую, то через пускатели.
Всё. Но, думается, алгоритм нужен посложнее. По аналогии сам придумаешь. Вообще, по температуре в комнате рулить отоплением неправильно. Большая инерционность, и как следствие, качели.

Anver

Кирилл, спасибо большое!! Будем пока лето переделывать ....заодно нужно еще щиток перебрать..

Anver

Цитата: Злой от 17 апреля 2020, 10:20:15если отопление электрическое то экономия звучит как ругательство. дорого топить электричеством. газом дешевле если он проведён
Не поверишь, живем в Сибири, газ добывают кругом, а газа в Сибири нет!!!!
Из эконом варианта, только уголь.!!!! Дома уложен водяной теплый пол, а его без большого акуммулятора топить углем нельзя.
Остается дизель и электричество. При нынешних ценах на солярку , дизельный котел заглох надолго.....
Остается только электричество...а тут уже как можем так и экономим.....хорошо хоть Саяно-Шушенская ГЭС под боком и для частников тарифы еще более-менее.

KiraАвтор темы

Я тоже думал, вырасту большой - подключу газ. А потом прикинул, при их апетитах только на за разрешение подключиться, да пошли они... 40 лет окупаться будет. И то, если цены на газ не вырастут. Воткнул в котёл пеллетную горелку, красота. И никакие проверяющие не лезут.

Anver

У меня сейчас ночной тариф 62 копейки, дневной 1,72 рубля....в принципе терпимо. При площади более 200 м2, в сильный мороз за свет отдаю около 10 тыс. Но охота еще меньше... :)

KiraАвтор темы

#10
Обрабатываем информацию с датчиков.

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

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

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

Итак, сервер нужен, займёмся.
Вообще, сервером может быть что угодно, на что можно поставить Linux, хоть малинка, хоть роутер (не все модели), хоть навороченый комп. Но это тема для отдельного разговора. Мы сидим за комопом с windows (если под линуксом, скорее всего, сервер у нас уже есть :D ). А для винды существует такая замечательная штука, как http://ospanel.io/ В ней есть всё, что нужно, и даже больше, установка проще некуда, - скачал, запустил, она распаковалась в указанную папку, ничего настраивать не нужно. Программа бесплатная, но не поскупитесь ребятам на пиво, она того стоит. В общем, скачали, программа распаковалась в указанную нами папку. Идём в эту папку, запускаем Open Server.exe Она спросит: это первый запуск? Говорим да. После установки нужных библиотек будет предложено перезагрузится. Перезагружаемся, запускаем её снова. В трее (там, где часы) появится красный флажок. Нажимаем на него, говорим "Запуск", флажок сменится на зелёный. Теперь у нас есть собственный веб-сайт. Открыть его можно, напечатав в адресной строке браузера "http://localhost/". А его файлы находятся в папке, куда мы распаковали программу +"\domains\localhost".

Теперь попробуем что-нибудь разместить на нашем сайте. В указанной выше папке создадим "новый текстовый документ" и напишем в нём <?php
 
echo "Привет, мир!";
 
?>
Сохраняем, закрываем, переименовываем его в "test.php". И, написав в аресной строке браузера "http://localhost/test.php" мы видим наше "Привет, мир!".

Разберёмся, что же мы написали.
<?php ?>
Ограничители. Всё, что находится между ними, сервер считает программным кодом на языке программирования php.
echo "Привет, мир!";
Как наверно уже догадались, вывод стоки "Привет, мир!". echo - команда (функция) для вывода строки на экрае. Кавычки нужны, чтобы указать, что всё, что между ними есть строка. Точка с запятой обязательна и означает конец команды. Несложно, правда?

Важное замечание. PHP это серверный язык, и программы, написаные на нём выполняются сервером. Это значит, что файл браузеру должен отдать сервер, а не файловая система. По простому, если дважды кликнуть мышкой по файлу в папке, он откроется в браузере, но программа реботать не будет и весь текст, что есть в файле вывалится на экран. Чтобы всё работало, нужно написать в браузере "localhost/test.php".

Понятие, без которого никуда - переменная. Это как ящик, в который можно что-нибудь положить. И у этого ящика обязательно должно быть имя. Когда мы в тексте программы что-то делаем с переменной (ящиком), действия производятся со значением переменной (содержимым ящика). РНР различает переменные по знаку бакса вначале.
<?php
 $peremennaya 
"Привет, мир!";
 echo 
$peremennaya;
 
?>


Строки можно складывать. Для этого между ними ставится точка. Например, У нас есть две строки "Привет" и "мир". Если написать "$peremennaya = "Привет" . "мир";", то значением переменной будет одна строка "Приветмир". Вообще, со строками можно делать много всякого.
Удобно поиграться с этим можно в онлайн-песочницах, напимер, здесь https://php-sandbox.ru/

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

И ещё нем понадобится функция "file_get_contents(файл)". Она читает содержимое файла в строку. Причём, делает это даже, если файл находится где-то в сети.




Теперь вернёмся к нашим датчикам.

Начнём с HTU21D.

Датчик выдаёт нам "temp:21.94/hum:26.67". Функцией substr(строка,старт,количество) уберём лишние символы.

<?php
$Val 
file_get_contents('http://192.168.0.14/sec/?pt=35&cmd=get');
echo 
"Датчик HTU21D";
echo 
"<br>";
echo 
"Температура: ";
echo 
substr($Val,5,5);
echo 
"<br>Влажность: ".substr($Val,-5,5);
?>


По строчкам:
1. Читаем ответ Штуки по запросу "http://192.168.0.14/sec/?pt=35&cmd=get" в переменную $Val.
2. Выводим "Датчик HTU21D".
3. Говорим браузеру писать с новой строки.
4. Выводим "Температура: ".
5. Выводим содержимое строки в переменной $Val начиная с пятой буквы, пять букв.
6. Выводим "(Новая строка)Влажность: " плюс содержимое строки в переменной $Val начиная с пятой с конца буквы, пять букв.

Видим следующее:
Датчик HTU21D
Температура: 21.80
Влажность: 25.43


Теперь Bosch BME280.

Ответ датчика "temp:21.74/press:729.70/hum:26.926"

<?php
echo "<br><br>Датчик BME280<br>";
$Val file_get_contents('http://192.168.0.14/sec/?pt=34&cmd=get');
$Massiv explode("/",$Val);
echo 
"Температура:".substr($Massiv[0],5,5);
echo 
"<br>Давление:".substr($Massiv[1],6,6);
echo 
"<br>Влажность:".substr($Massiv[2],4,6);
?>


Здесь в третей строчке мы функцией explode разбили стоку на части, разделённые символом "/" и поместили их в массив $Massiv. А дальше, как в предидущем случае, только вместо переменной у нас элемент массива с ключом в квадратных скобках.

На экране
Датчик BME280
Температура:22.05
Давление:737.27
Влажность:24.847



Ну и наконец, гроздь DS18B20.

"eef816a8013c:22.00;096c79a20003:21.93;f95979a20003:22.25;ad2816a8013c:22.06;1b2916a8013c:21.81;2f3716a8013c:21.87;7f9e79a20003:22.12"

Тут посложнее.
Нам понадобится условный оператор if и цикл перебора массива foreach

<?php
$Val 
file_get_contents('http://192.168.0.14/sec/?pt=30&cmd=list');
$Massiv=explode(";",$Val);
$Massiv1=array();
foreach(
$Massiv as $Value){
    if (
strpos ($Value,"eef816a8013c")===0)
        
$Massiv1["Ulica"]=substr($Value,13);
    if (
strpos ($Value,"096c79a20003")===0)
        
$Massiv1["Komnata1"]=substr($Value,13);    
    if (
strpos ($Value,"f95979a20003")===0)
        
$Massiv1["Komnata2"]=substr($Value,13);
    if (
strpos ($Value,"ad2816a8013c")===0)
        
$Massiv1["Komnata3"]=substr($Value,13);
    if (
strpos ($Value,"1b2916a8013c")===0)
        
$Massiv1["Komnata4"]=substr($Value,13);
    if (
strpos ($Value,"2f3716a8013c")===0)
        
$Massiv1["Komnata5"]=substr($Value,13);
    if (
strpos ($Value,"7f9e79a20003")===0)
        
$Massiv1["Komnata6"]=substr($Value,13);
}
echo 
"<br><br>Датчики DS18B20<br>";
echo 
"Улица: ".$Massiv1["Ulica"];
echo 
"<br>Комната 1: ".$Massiv1["Komnata1"];
echo 
"<br>Комната 2: ".$Massiv1["Komnata2"];
echo 
"<br>Комната 3: ".$Massiv1["Komnata3"];
echo 
"<br>Комната 4: ".$Massiv1["Komnata4"];
echo 
"<br>Комната 5: ".$Massiv1["Komnata5"];
echo 
"<br>Комната 6: ".$Massiv1["Komnata6"];
?>

Разбиваем строку на массив разделителем ";", объявляем второй массив, пока пустой, перебираем первый массив поэлементно и каждый элемент проверяем на наличие в строке адреса конкретного датчика. Если нужный адрес найден, добавляем в новый массив пару "ключ-значение", где ключ - расположение датчика, значение - измеренная им температура. После, выводим на экран.

Зачем нужно тройное равно. В PHP одинарное равно означает "присвоить", например, переменной её значение, двойное - сравнить без учёта типа, тройное - сравнить с учётом типа. Позиция искомого адреса в строке равна нулю. А ноль в рнр бывает разный. Число 0, строка "0", двоичное значение FALSE и NULL - пусто, неопределено. Так вот, тройное равно означает, что мы проверяем условие "число 0 равно числу 0".


ЗЫ: Рекомендую пользовать Notepad++. Вроде простой текстовый редактор, а умеет кучу вещей, типа подсветки синтаксиса, перекодировки (если вместо русского текста в браузере ромбики, нужно преобразовать кодировку в UTF-8) и очень много других полезностей.

KiraАвтор темы

#11
Теперь попробуем чем-нибудь поуправлять.  Например, лампочками. У MegaD-2561 выходы это цифровые порты, а мы хотим управлять относительно мощной высоковольтной нагрузкой, поэтому без исполнительного модуля не обойтись. Пусть это будет MegaD-14-R. По конструкции это 14 релюшек повешенные на 14 портов MegaD-2561 и один цифровой порт на всякий случай.
[attach id=0 msg=774151]

Подключим лампочки.

[attach id=1 msg=774151]

Например так. Одна лампочка горит по умолчанию.
Не забываем сказать устройству, что соответствующий порт теперь выход. Можно в поле Disp указать SDA линию нашего дисплея, тогда устройство будет показывать на дисплее включён порт или выключен.

Управлять будем с нашего сайта. Тут нам придётся поближе познакомится с html. Мы с ним уже сталкивались в прошлом посте, когда говорили писать браузеру с новой строки. Тег
, помните?

Итак, html, HyperText Markup Language — «язык гипертекстовой разметки» — стандартизированный язык разметки документов в интернете. На нём написаны все веб-странички. По-простому, указания браузеру что, где и как выводить на экран. В основном, состоит из тегов, как правило, парных, открывающего и закрывающего. Например, <FONT color="red">Красный цвет текста</FONT> А ещё в нём есть стандартные элементы управления, такие как кнопки, поля для ввода текста и т.д. Одним из них и воспользуемся. Чекбокс - маленький квадратик, в который можно поставить флажок. Добавим их себе на страничку. <input type="checkbox" name="lamp1">Лампа1
<input type="checkbox" name="lamp2">Лампа2
<input type="checkbox" name="lamp3">Лампа3
<input type="checkbox" name="lamp45">Лампа 4 ИЛИ 5


Теперь обработаем нажатия. Поскольку РНР - серверный язык, ему абсолютно всё равно, что творится у нас на страничке, его задача эту страничку отдать браузеру и на этом работы программы заканчивается. Но нам нужно передать программе значения наших чекбоксов. Для этого объединим чекбоксы в форму ввода и добавим кнопку "Отправить".

<form action="test.php" method="POST">
<input type="checkbox" name="lamp1">Лампа1
<input type="checkbox" name="lamp2">Лампа2
<input type="checkbox" name="lamp3">Лампа3
<input type="checkbox" name="lamp45">Лампа 4 ИЛИ 5
<br>
<input type="submit" name="submit" value="Отправить">
</form>


В action указывается адрес странички, которая будет обрабатывать данные формы. Обработаем их на этой же страничке. Напишем
<?php
if(isset($_POST['lamp1'])) 
file_get_contents("http://192.168.0.14/sec/?cmd=6:1");
if(isset(
$_POST['lamp2'])) 
file_get_contents("http://192.168.0.14/sec/?cmd=7:1");
if(isset(
$_POST['lamp3'])) 
file_get_contents("http://192.168.0.14/sec/?cmd=8:1");
if(isset(
$_POST['lamp45'])) 
file_get_contents("http://192.168.0.14/sec/?cmd=9:1");
?>


$_POST - глобальный массив, который создаётся автоматически и содержит всё, что передаётся страничке, в нашем случае, выбранные чекбоксы. Не выбранные просто не передаются. А дальше мы проверяем, есть ли в $_POST имя конкретного чекбокса. Если есть, даём команду устройству включить нужный порт. Функция file_get_contents возвращает ответ устройства ("Done."), но сейчас он нас не интересует, поэтому просто вызываем функцию, ничего не делая с ответом.

Теперь, если мы поставили флажки на нужных лампочках, при нажатии кнопки "Отправить" они включатся, а четвёртая и пятая переключатся. Если поставить все галочки, получится так.
[attach id=2 msg=774151]

Сделаем, чтоб они выключались, если флажки не стоят. Исправим.
<?php
if(isset($_POST['lamp1'])) 
file_get_contents("http://192.168.0.14/sec/?cmd=6:1");
else 
file_get_contents("http://192.168.0.14/sec/?cmd=6:0");
if(isset(
$_POST['lamp2'])) 
file_get_contents("http://192.168.0.14/sec/?cmd=7:1");
else 
file_get_contents("http://192.168.0.14/sec/?cmd=7:0");
if(isset(
$_POST['lamp3'])) 
file_get_contents("http://192.168.0.14/sec/?cmd=8:1");
else 
file_get_contents("http://192.168.0.14/sec/?cmd=8:0");
if(isset(
$_POST['lamp45'])) 
file_get_contents("http://192.168.0.14/sec/?cmd=9:1");
else 
file_get_contents("http://192.168.0.14/sec/?cmd=9:0");
?>

Т.е. если в массиве $_POST есть имя нужного чекбокса, включаем нужный выход, если нет - выключаем.

Остаётся сделать так, чтоб при загрузке страницы флажки устанавливались в соответствии с соотояние лампочек. Подправим форму.
<form action="test.php" method="POST">
<?php  
if(file_get_contents("http://192.168.0.14/sec/?pt=6&cmd=get")=="ON")
echo '<input type="checkbox" name="lamp1" checked="checked">Лампа 1(ВКЛ) ';
else 
echo '<input type="checkbox" name="lamp1">Лампа 1(ВЫКЛ) ';

if(
file_get_contents("http://192.168.0.14/sec/?pt=7&cmd=get")=="ON")
echo '<input type="checkbox" name="lamp2" checked="checked">Лампа 2(ВКЛ) ';
else 
echo '<input type="checkbox" name="lamp2">Лампа 2(ВЫКЛ) ';

if(
file_get_contents("http://192.168.0.14/sec/?pt=8&cmd=get")=="ON")
echo '<input type="checkbox" name="lamp3" checked="checked">Лампа 3(ВКЛ) ';
else 
echo '<input type="checkbox" name="lamp3">Лампа 3(ВЫКЛ) ';

if(
file_get_contents("http://192.168.0.14/sec/?pt=9&cmd=get")=="ON")
echo '<input type="checkbox" name="lamp45" checked="checked">Лампа 5(ВЫКЛ), лампа 4(ВКЛ) ';
else 
echo '<input type="checkbox" name="lamp45">Лампа 5(ВКЛ), лампа 4(ВЫКЛ) ';
?>

<br>
<input type="submit" name="submit" value="Отправить">
</form>


Перед тем, как рисовать чекбоксы, опрашиваем устройство на предмет состояния соответствующего выхода. Если выход включён, рисуем чекбокс с галочкой, если выключен - без галочки.

[attach id=3 msg=774151]

Ну и полный код.
Спойлер
<?php
$Val 
file_get_contents('http://192.168.0.14/sec/?pt=35&cmd=get');
echo 
"Датчик HTU21D";
echo 
"<br>";
echo 
"Температура: ";
echo 
substr($Val,5,5);
echo 
"<br>Влажность: ".substr($Val,-5,5);

echo 
"<br><br>Датчик BME280<br>";
$Val file_get_contents('http://192.168.0.14/sec/?pt=34&cmd=get');
$Massiv explode("/",$Val);
echo 
"Температура:".substr($Massiv[0],5,5);
echo 
"<br>Давление:".substr($Massiv[1],6,6);
echo 
"<br>Влажность:".substr($Massiv[2],4,6);

$Val file_get_contents('http://192.168.0.14/sec/?pt=30&cmd=list');
$Massiv=explode(";",$Val);
$Massiv1=array();
foreach(
$Massiv as $Value){
    if (
strpos ($Value,"eef816a8013c")===0)
        
$Massiv1["Ulica"]=substr($Value,13);
    if (
strpos ($Value,"096c79a20003")===0)
        
$Massiv1["Komnata1"]=substr($Value,13);    
    if (
strpos ($Value,"f95979a20003")===0)
        
$Massiv1["Komnata2"]=substr($Value,13);
    if (
strpos ($Value,"ad2816a8013c")===0)
        
$Massiv1["Komnata3"]=substr($Value,13);
    if (
strpos ($Value,"1b2916a8013c")===0)
        
$Massiv1["Komnata4"]=substr($Value,13);
    if (
strpos ($Value,"2f3716a8013c")===0)
        
$Massiv1["Komnata5"]=substr($Value,13);
    if (
strpos ($Value,"7f9e79a20003")===0)
        
$Massiv1["Komnata6"]=substr($Value,13);
}
echo 
"<br><br>Датчики DS18B20<br>";
echo 
"Улица: ".$Massiv1["Ulica"];
echo 
"<br>Комната 1: ".$Massiv1["Komnata1"];
echo 
"<br>Комната 2: ".$Massiv1["Komnata2"];
echo 
"<br>Комната 3: ".$Massiv1["Komnata3"];
echo 
"<br>Комната 4: ".$Massiv1["Komnata4"];
echo 
"<br>Комната 5: ".$Massiv1["Komnata5"];
echo 
"<br>Комната 6: ".$Massiv1["Komnata6"];

if (
count($_POST)!=0){
if(isset($_POST['lamp1'])) 
file_get_contents("http://192.168.0.14/sec/?cmd=6:1");
else 
file_get_contents("http://192.168.0.14/sec/?cmd=6:0");
if(isset($_POST['lamp2'])) 
file_get_contents("http://192.168.0.14/sec/?cmd=7:1");
else 
file_get_contents("http://192.168.0.14/sec/?cmd=7:0");
if(isset($_POST['lamp3'])) 
file_get_contents("http://192.168.0.14/sec/?cmd=8:1");
else 
file_get_contents("http://192.168.0.14/sec/?cmd=8:0");
if(isset($_POST['lamp45'])) 
file_get_contents("http://192.168.0.14/sec/?cmd=9:1");
else 
file_get_contents("http://192.168.0.14/sec/?cmd=9:0");
}
?>


<br><br>

<form action="test.php" method="POST">
<?php  
if(file_get_contents("http://192.168.0.14/sec/?pt=6&cmd=get")=="ON")
echo '<input type="checkbox" name="lamp1" checked="checked">Лампа 1(ВКЛ) ';
else 
echo '<input type="checkbox" name="lamp1">Лампа 1(ВЫКЛ) ';

if(
file_get_contents("http://192.168.0.14/sec/?pt=7&cmd=get")=="ON")
echo '<input type="checkbox" name="lamp2" checked="checked">Лампа 2(ВКЛ) ';
else 
echo '<input type="checkbox" name="lamp2">Лампа 2(ВЫКЛ) ';

if(
file_get_contents("http://192.168.0.14/sec/?pt=8&cmd=get")=="ON")
echo '<input type="checkbox" name="lamp3" checked="checked">Лампа 3(ВКЛ) ';
else 
echo '<input type="checkbox" name="lamp3">Лампа 3(ВЫКЛ) ';

if(
file_get_contents("http://192.168.0.14/sec/?pt=9&cmd=get")=="ON")
echo '<input type="checkbox" name="lamp45" checked="checked">Лампа 5(ВЫКЛ), лампа 4(ВКЛ) ';
else 
echo '<input type="checkbox" name="lamp45">Лампа 5(ВКЛ), лампа 4(ВЫКЛ) ';
?>

<br>
<input type="submit" name="submit" value="Отправить">
</form>

[свернуть]

Пожалуй, на этом остановлюсь ввиду отсутствия интереса соклубников к теме.

Radist

WDB2020181A604763
Главное хуже не сделать.

Плотник

 Интерес есть, читаю - только понимаю в этом нисколько)))
Поэтому и не комментирую, ибо не знаю хорошо это или плохо сделанно))
Результат потом покажите пож, интересно же в итоге финальный вариант!
WDB2020201A749612

Группа w202 в телеге
https://t.me/Mercedes_Benz_w202

KiraАвтор темы

#14
Старался сделать наглядно :) Максимально просто. Можно лучше, но сложнее для понимания.

Результат будет совсем непонятно :)