Зарегистрироваться

Контроль температур горячей воды в ТСЖ с оповещениями в Telegram на базе ESP8266

Последнее время в нашем доме часто стала возникать проблема с горячей водой. В принципе, это началось, когда мы отсудили котельную в общедомовую собственность и начали сами ей распоряжаться, в том числе наняли другую обслуживающую организацию. Потом обслуживающую организацию снова поменяли, стало дешевле, но качество не выросло. И больше всего напрягало, что с момента остановки котельной до момента, когда горячая вода снова нагревалась до нужной температуры, проходило очень много времени — порой до четырех часов. Складывалось ощущение, что диспетчеризация не работала, либо на ее сигналы просто забивал диспетчер, а высылали техника к нам только после телефонного звонка. Приходилось щупать змеевик в ванной и гадать — 5 минут назад было теплее и он остывает или все-таки котельную уже запустили и он нагревается? Бегать в котельную вечером, как вы понимаете, тоже очень лениво.

Наткнулся тут на обзоры всяких датчиков от Sanja, этот добрый человек прислал ссылки на запчасти, что мне надо закупить (плата с модулем WiFi NodeMCU ESP8266 и датчики DS18b20) и даже ролик на ютубе, показывающий, что надо делать и как. В принципе, этих ссылок достаточно для создания аналогичного устройства, но были и сложности, о которых я и хочу рассказать, дабы еще более упросить повторение процесса для таких же новичков в этом деле, как я)

Это мой первый опыт использования подобной техники и программирования контроллеров, поэтому используемые методы пайки или монтирования могут повергнуть в шок бывалых мастеров… Впечатлительных прошу отдалиться от мониторов). Также я не стал заморачиваться с печатью корпуса для устройства, а использовал пластиковую бутылку (почти), как научила меня передача «Очумелые ручки» в свое время :)

Итак, нам понадобится:
  • Плата с модулем WiFi NodeMCU ESP8266 ~220 руб
  • Датчики Dallas DS18b20 по ~80 руб за штуку
  • Резистор 4к7 маломощный ~5 руб
  • Разъемы «мама» для подключения к ножкам Arduino и подобным ~120руб за 40 штук
  • WiFi роутер (если в предполагаемом для установки помещении его еще нет) ~400 руб б/у
  • Блок питания USB (1А, говорят, достаточно, но я брал на 2А) и кабель microUSB для программирования (при подключении к компу) и питания ~200 руб

Сначала параллельно соединяем все датчики, которые нам нужны, в одно целое
по такой схеме:

Получилось примерно так:

Потом, конечно, это все тщательно замотано изолентой/термоусадкой.


Подключаем к пинам по схеме, плату подсоединяем USB-кабелем к компьютеру, запускаем свежеустановленный Arduino 1.8.2 и настраиваем его, как описано тут. Порт меняем на COM4 (если плата уже подключена).

Распаковываем архив в папку, где у вашей Arduino лежат скетчи. В комплекте уже есть библиотеки, которые было так тяжело найти подходящие, пол дня убил на это.
Загружаем сам скетч sketch_esp8266dallas в среду разработки.
Меняем там на строках 14 и 15 название WiFi сети и пароль к ней, а также на 45 строке адрес сервера, на котором будут сохраняться передаваемые параметры. Серверная часть (PHP) описана ниже.
К слову, мы могли бы уже здесь отправлять уведомления в Telegram, если температуры ниже заданного уровня, немного изменив код отправки GET-запроса, но Telegram у нас в России под запретом, поэтому существуют некоторые проблемы с использованием его API. Альтернативный вариант — использовать API от sms.ru, но это уже совсем другая история. Главное, что сюда можно вписать абсолютно любое обращение к какому угодно сервису, будь то «народный мониторинг» или любой другой.

Пробуем скомпилировать скетч через меню «Скетч — Проверить/Компилировать», если все хорошо и ошибок нет, то можно загружать в плату «Скетч — Загрузка».

Открываем меню «Инструменты — Монитор порта» и видим примерно такую картину:


А если у вас картина другая и плата WiFi-соединение поднимает, но запросы нифига не идут, то скорее всего роутер находится слишком далеко и сигнал слабый. У меня роутер стоял в соседней комнате (!) и я пару часов убил на выяснение, почему же не работает сервис Blink или любой другой. Когда ты этим занимаешься первый раз, сложно понять, что плате просто не хватает мощности сигнала, ведь к сети то она подцепиться смогла, причем с первого раза. И именно по этой причине пришлось купить дополнительный роутер, потому что в подвале, где я хотел расположить датчик, ситуация с WiFi была бы еще хуже. Я даже посмотрел кучку обзоров на разные вариации этой платы и анализ мощности приема WiFi-сигнала, а также возможность использования дополнительных антенн, но найденные примеры не демонстрировали существенного эффекта.
Тут мне пришла в голову мысль, что вместо WiFi-платы можно было бы использовать сразу модуль с RJ-45 на борту, но было уже поздно :)

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

У меня, как у любого порядочного веб-программиста, имеется с пяток хостинговых площадок в распоряжении, поэтому вопроса о том, где разместить серверную часть, не возникло — уже работал в ТСЖ сайт на вордпрессе. Но есть и варианты бесплатного хостинга с PHP и MySQL, я ими не пользовался и ссылок ставить не буду, но найти их легко в Яндексе.

Далее нам нужно через PHPMyAdmin создать табличку в любой имеющейся или новой базе с названием temperatures и полями: datatime (тип DATETIME), t1 (DECIMAL), t2 (DECIMAL), t3 (DECIMAL), t4 (DECIMAL).

Распаковываем архив серверной части через ftp у себя на сервере и правим в файлах index.php и json.php параметры соединения с базой данных и в index.php внешний адрес скрипта для получения данных.

В коде нет ничего невероятного, если кому-то лень скачивать архив, то вот содержимое основных php-скриптов:

index.php
<?php
// Параметры соединения с базой данных
$db_server = 'localhost';
$db_name = '*****';
$db_user = '*****';
$db_passwd = '******';

// Подключение к базе данных
$db_connection = @mysql_connect($db_server, $db_user, $db_passwd);
if (!$db_connection || [email protected]_select_db($db_name, $db_connection))
{
	echo "Error during SQL connection";
}
mysql_select_db($db_name, $db_connection);

// Сохранение в базу переданных с контроллера данных
if(isset($_GET['t1']) && isset($_GET['t2']) && isset($_GET['t3']) && isset($_GET['t4'])) {
	$t1 = floatval($_GET['t1']);
	$t2 = floatval($_GET['t2']);
	$t3 = floatval($_GET['t3']);
	$t4 = floatval($_GET['t4']);
	if($t1>0 && $t2>0 && $t3>0&& $t4>0) {
		$result = mysql_query("
			INSERT INTO `temperatures` (datatime,t1,t2,t3,t4) 
			VALUES (now(), $t1, $t2, $t3, $t4)");
		echo mysql_error();	
		
		// Если температуры ниже минимума, отправим сообщение в Telegram
		if($t4<40 || $t2<35 || $t1<50 || $t3<50) {
			include 'tele.php';
			message_to_telegram("ГВС_П: $t4, ГВС_О: $t2, Котельная_П: $t1, Котельная_О: $t3");
		}
	}
	
	die();
}
?>

<html>
<head>
	<title>Температурные данные дома №*** по ул.*********</title>
	<link href="/temp/style.css" rel="stylesheet">
	<link href="/temp/jquery.datetimepicker.min.css" rel="stylesheet">
	<script type="text/javascript" src="/temp/jquery-3.3.1.min.js"></script>
	<script type="text/javascript" src="/temp/moment.js"></script>
	<script type="text/javascript" src="/temp/jquery.datetimepicker.full.min.js"></script>
	<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.3/Chart.min.js"></script>
	<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.3/css/bootstrap.min.css" rel="stylesheet">
</head>
<body> 
	<div class='current row'>
		<div class='col time'></div>
		<div class='t1 col'>ГВС, подача:
 <b></b></div>
		<div class='t2 col'>ГВС, обратка:
 <b></b></div>
		<div class='t3 col'>Котельная, подача:
 <b></b></div>
		<div class='t4 col'>Котельная, обратка:
 <b></b></div>
	</div> 
	<div class="row selectperiod">
		<div class="col"><input type="text" id="datastart" value="" class="form-control"/></div>
		<div class="col"><input type="text" id="dataend" value="" class="form-control"/></div>
		<div class="col">Точность: <select id="intervalMinutes">
			<option value="1">1 мин</option>
			<option value="5">5 мин</option>
			<option value="15">15 мин</option>
			<option value="30" selected>30 мин</option>
			<option value="6">1 час</option>
			</select>
		</div>
	</div>  
	<div id="chartContainer" style="position: relative; height:40vh; width:90vw;margin: 0 auto;">
		<canvas id="myChart"></canvas>
	</div>
	<script>
	// Создание и отрисовка графика
	function getChart(dataFromJSON) {
		var dates = [], t1arr = [], t2arr = [], t3arr = [], t4arr = [];
		dataFromJSON.forEach(function(item, i, arr) {
			dates.push(item.datatime);
			t1arr.push(item.t1);
			t2arr.push(item.t2);
			t3arr.push(item.t3);
			t4arr.push(item.t4);
		});
	
		var ctx = document.getElementById("myChart").getContext('2d');
		window.myChart = new Chart(ctx, {
			type: 'line',
			data: {
				labels: dates,
				datasets: [{
					label: 'ГВС, подача',
					data: t1arr,
					borderColor: '#ffc700',
					backgroundColor: 'rgba(255,255,255,0)'
				},{
					label: 'ГВС, обратка',
					data: t2arr,
					borderColor: '#3bd100',
					backgroundColor: 'rgba(255,255,255,0)'
				},{
					label: 'Контур котельной, подача',
					data: t3arr,
					borderColor: '#ff0000',
					backgroundColor: 'rgba(255,255,255,0)'
				},{
					label: 'Контур котельной, обратка',
					data: t4arr,
					borderColor: '#ee00ff',
					backgroundColor: 'rgba(255,255,255,0)'
				}]
			},
			options: {
				responsive: true,
				//maintainAspectRatio: false,
				legend: {
					display: false
				},
				scales: {
					xAxes: [{
						type: 'time',
						time: {
							unit: 'minute'
						}
					}]
				}
			}
		});
	}
	
	// Обновление графика данными
	function updateChart(dataFromJSON) {
		var dates = [], t1arr = [], t2arr = [], t3arr = [], t4arr = [];
		dataFromJSON.forEach(function(item, i, arr) {
			dates.push(item.datatime);
			t1arr.push(item.t1);
			t2arr.push(item.t2);
			t3arr.push(item.t3);
			t4arr.push(item.t4);
		});
		
		window.myChart.data.labels = dates;
		window.myChart.data.datasets[0].data = t1arr;
		window.myChart.data.datasets[1].data = t2arr;
		window.myChart.data.datasets[2].data = t3arr;
		window.myChart.data.datasets[3].data = t4arr;
		window.myChart.update();
	}
	
	// Получение данных для графика
	function doUpdateChart() {
		$.getJSON( "путь к файлу/json.php?datastart="+$("#datastart").val()+"&dataend="+$("#dataend").val()+"&intervalMinutes="+$("#intervalMinutes").val(),
			function( data ) {
				updateChart(data);
			});
	}
	
	// Получение текущих данных
	function doUpdateLastValues() {
		$.getJSON( "путь к файлу/json.php?last=true",
			function( data ) {
				$(".time").html((data[0].datatime+'').replace(' ', '
'));
				$(".t1 b").text(data[0].t1+"°C");
				$(".t2 b").text(data[0].t2+"°C");
				$(".t3 b").text(data[0].t3+"°C");
				$(".t4 b").text(data[0].t4+"°C");
			});
	}
		
	$(function() {
		// Выбор дат
		$.datetimepicker.setLocale('ru');
		$('#datastart,#dataend').datetimepicker({
		  format:'d.m.Y H:i',
		  lang:'ru',
		  minDate:'20.11.2018',
		  maxDate:Date.now(),
		  formatDate:'d.m.Y',
		  dayOfWeekStart: 1,
		  i18n:{
			  ru:{
			   months:[
				'Январь','Февраль','Март','Апрель',
				'Май','Июнь','Июль','Август',
				'Сентябрь','Октябрь','Ноябрь','Декабрь',
			   ],
			   dayOfWeek:[
				"Вс", "Пн", "Вт", "Ср", 
				"Чт", "Пт", "Сб",
			   ]
			  }
			 },
		});
				
		// Загрузка текущих данных
		doUpdateLastValues();
		// Заполнение графика
		$.getJSON( "путь к файлу/json.php?datastart="+$("#datastart").val()+"&dataend="+$("#dataend").val()+"&intervalMinutes="+$("#intervalMinutes").val(),
			function( data ) {
				getChart(data);
			});
					
		window.lastDataStart = $("#datastart").val();
		window.lastDataEnd = $("#dataend").val();
		window.intervalMinutes = $("#intervalMinutes").val();
		var winHeight = $(window).height();
		setInterval(function() {
			var changed = false;
			if($("#datastart").val() != window.lastDataStart) {
				changed = true;
				window.lastDataStart = $("#datastart").val();
			}
			if($("#dataend").val() != window.lastDataEnd) {
				changed = true;
				window.lastDataEnd = $("#dataend").val();
			}
			if($("#intervalMinutes").val() != window.intervalMinutes) {
				changed = true;
				window.intervalMinutes = $("#intervalMinutes").val();
			}
			if(changed)
				doUpdateChart();
		}, 1000);
		// Обновлять текущие данные раз в 30 сек
		setInterval(function() {
			doUpdateLastValues();
			doUpdateChart();
		}, 30000);
	});
	</script>

</body>
</html>

json.php
<?php
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);

// Параметры соединения с базой данных
$db_server = 'localhost';
$db_name = '*****';
$db_user = '*****';
$db_passwd = '*****';

// Вычисление разницы дат
function dateDifference($date_1 , $date_2 , $differenceFormat = '%a' )
{
    $datetime1 = date_create($date_1);
    $datetime2 = date_create($date_2);   
    $interval = date_diff($datetime1, $datetime2);   
    return $interval->format($differenceFormat);   
}

// Подключение к базе данных
$db_connection = @mysql_connect($db_server, $db_user, $db_passwd);
if (!$db_connection || [email protected]_select_db($db_name, $db_connection))
{
	echo "Error during SQL connection";
}
mysql_query("set names utf8");

// Если запрошены текущие данные
if(isset($_GET['last'])) {
	$result = mysql_query("
			SELECT DATE_FORMAT(DATE_ADD(datatime, INTERVAL 1 HOUR),'%d.%m.%Y %H:%i:%s') datatime,t1 t3,t2 t2,t3 t4,t4 t1 FROM temperatures 
			ORDER BY datatime DESC
			LIMIT 1");
	$data = [];
	while($row = mysql_fetch_assoc($result)) {	
			$data[] = $row;
	}
	// Выводим только их и заканчиваем на этом
	die(json_encode($data ));
}

$intervalMinutes = 30;
$datastart = date_add(date_create(date('Y-m-d H:i:s')), date_interval_create_from_date_string('-1 days'));
$dataend = date_add(date_create(date('Y-m-d H:i:s')), date_interval_create_from_date_string('1 hour'));
if(isset($_GET['intervalMinutes']))
	$intervalMinutes = intval($_GET['intervalMinutes']);

// Если слишком большой временной промежуток, то не будем наружать сервер большим объемом данных, округлим побольше
$difHours = date_diff($datastart, $dataend);
if($difHours->format('%days')>3) 
	$intervalMinutes = 60;
if($difHours->format('%days')>10) 
	$intervalMinutes = 180;
if(isset($_GET['datastart']) && $_GET['datastart']!="")
	$datastart = date_create($_GET['datastart']);
if(isset($_GET['dataend']) && $_GET['dataend']!="")
	$dataend = date_create($_GET['dataend']);
	


$result = mysql_query("
	SELECT roundeddatetime datatime, AVG(t1) t3,AVG(t2) t2,AVG(t3) t4,AVG(t4) t1 
	FROM
	(
		SELECT DATE_FORMAT(DATE_ADD(DATE_ADD(datatime, INTERVAL (".$intervalMinutes."-MINUTE(datatime)%".$intervalMinutes.") MINUTE), INTERVAL 1 HOUR),'%Y-%m-%d %H:%i:00') roundeddatetime,t1,t2,t3,t4 FROM temperatures 
		WHERE datatime>DATE_ADD('".$datastart->format('Y-m-d H:i:s')."', INTERVAL -1 HOUR) AND datatime<DATE_ADD('".$dataend->format('Y-m-d H:i:s')."', INTERVAL -1 HOUR)
	) t1
	GROUP BY roundeddatetime
	LIMIT 3440");
$data = [];
while($row = mysql_fetch_assoc($result)) {	
	$data[] = $row;
}

echo json_encode($data );
?>

tele.php
<?
// сюда нужно вписать токен вашего бота
define('TELEGRAM_TOKEN', '*****:********');

// сюда нужно вписать ваш внутренний айдишник чата
define('TELEGRAM_CHATID', '414951********599');

//echo message_to_telegram('Данные!');

function message_to_telegram($text) {
    $ch = curl_init();
	$url = "https://api.telegram.org/bot".TELEGRAM_TOKEN."/sendMessage?chat_id=".TELEGRAM_CHATID."&text=".$text; // где XXXXX - ваши значения

	$prxy       = '162.33.68.41:56505'; // адрес:порт прокси http://spys.one/proxys/US/
	$prxy_auth = 'auth_user:auth_pass';       // логин:пароль для аутентификации
	curl_setopt_array ($ch, array(CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true)); 
/********************* Код для подключения к прокси *********************/


    curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);  // тип прокси 
    curl_setopt($ch, CURLOPT_PROXY,  $prxy);                 // ip, port прокси
    curl_setopt($ch, CURLOPT_PROXYUSERPWD, $prxy_auth);  // авторизация на прокси
    curl_setopt($ch, CURLOPT_HEADER, false);                // отключение передачи заголовков в запросе 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);            // возврат результата в качестве строки
    curl_setopt($ch, CURLOPT_POST, 1);                      // использование простого HTTP POST
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);        // отмена проверки сертификата удаленным сервером
	curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
	// Параметры ниже подходят, если у вас PHP свежей версии
	//curl_setopt($ch, CURLOPT_RESOLVE, array("api.telegram.org:443:146.185.158.29"));
    //curl_setopt($ch, CURLOPT_DNS_SERVERS, '8.8.8.8,8.8.4.4');  // тип прокси 
/***********************************************************************/
    $response = curl_exec($ch);
	if ($response === FALSE) {	 
		$response = "cURL Error: " . curl_error($ch);	 
	}
	$info = curl_getinfo($ch); 
	//$response .= '
Took ' . $info['total_time'] . ' seconds for url ' . $info['url']."
";
	curl_close($ch); 
	return $response;
}
?>


style.css
.current {
	margin-top: 10px;
	padding: 0 10px;
	font-size: 14px;
}
.current div {
	height: 100px;
}
.current b {
	display:inline-block;
	border: 3px solid #ffc700;
	padding: 5px;
	font-size: 30px;
}
.t2 b {
	border: 3px solid #3bd100;
}
.t3 b {
	border: 3px solid #ff0000;
}
.t4 b {
	border: 3px solid #ee00ff;
}
.current .time {
	padding-top: 20px;
	font-weight: bold;
	text-align: center;
	font-size: 18px;
}
.selectperiod {
	padding: 5px 30px;
}
.selectperiod div{
	text-align:center;
}


В архиве лежат еще файлики библиотеки jquery, moment.js и jquery.datetimepicker.
Для красивого отображения графика используется ChartJS.

Итак, теперь у нас сохраняются температуры в базу и даже выводятся в виде красивого графика. Дело за малым — настроить оповещения в Telegram, когда температуры достигают слишком малых значений. По этой инструкции легко настроить бот, который будет присылать вам сообщения, если послать запрос на api.telegram.org. Мой код такой обработки температур и отправки в телеграм в файле index.php:
// Если температуры ниже минимума, отправим сообщение в Telegram
if($t4<40 || $t2<35 || $t1<50 || $t3<50) {
	include 'tele.php';
	message_to_telegram("ГВС_П: $t4, ГВС_О: $t2, Котельная_П: $t1, Котельная_О: $t3");
}


Но вот незадача, телеграм то в России заблокирован! И у большинства провайдеров вы даже IP-адрес сервера не получите по этому имени домена.
Для работы с этим сервером придется использовать SOCKS-прокси (выше есть код файла tele.php), плюс в некоторых случаях потребуется прописать
curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);

чтобы запросы начали ходить бесперебойно.

Можно раскомментировать строчку 9 в файле tele.php и проверить отправку, обновив страницу.

Подготовка завершена, осталось разместить все это на местах:


Придерживаясь колхоз-стайла, датчики к трубе можно примотать великим Скотчем, но для лучшей теплопередачи предварительно смазать место контакта термопастой:

А сверху нужно еще теплоизолировать датчики от внешней среды. Самый практичный вариант — пенофолом (фольгированый вспененный полиэтилен).

Для потомков и случайно оказавшихся в бойлерной слесарей желательно обозначить на корпусе, что это за фиговина с проводами:


Прокинули витую пару с интернетом до бойлерной, подключили роутер, вставили в розетку наше устройство и наслаждаемся картинкой:


Открывать ссылку можно с любого устройства, даже со слабым интернетом. Вообще говоря, веб-сервер можно поднять и на самой ESP8266 и рисовать аналогичный график, заморочившись с обновлением IP-адреса через DynDNS, но «я художник, я так вижу» :) Да и стабильность у такого варианта все-таки куда выше, а еще доработки в серверную часть можно вносить прямо с рабочего места в другом городе, а не программировать каждый раз плату.

На этом можно остановиться, ибо все работает, но есть и пока не решенные проблемы.
Первая — это датчики почему-то иногда сбоят. С периодичностью раз в 4 часа плата почему-то путается в показаниях и присылает откровенную фигню. Один раз даже показало температуру в -70 градусов на одном из датчиков, после чего я внес в серверный код условие добавления в базу значений, только если они все положительные.
Вот пример полученных корявых данных


Второе — если температура все-таки опустится ниже установленного в коде минимума, Telegram-бот вас задолбает сообщениями. Нужно сохранять время предыдущей отправки (например, в файле на хостинге или в базе) и анализировать, прошел ли час (к примеру).

Третье — найденный в интернете прокси-сервер может просто-напросто прекратить свое существование, его нужно будет сменить. А сообщения то вам не будут присылаться в телеграм… Поэтому надо добавить либо оповещение на email, либо сделать парсинг свежих прокси каждый раз. А может кто-то знает лучшее решение?

Надеюсь, хоть кому-нибудь данный пост был полезен, а может кого-то подтолкнет все-таки заказать эту плату и сделать свой вариант погодной станции (следуя поговорке «Что бы вы ни собрались сделать на базе ESP8266, все равно получится погодная станция»).

UPD 1: В комментариях muskati предложил использовать twitter.com/tgvpn:
['proxy' => 'socks5://login:[email protected]:1080']


UPD 2: Полезный совет от merlin7 про использование медианного фильтра.

UPD 3: SiZE предложил вместо танцев с прокси телеграма использовать bullhorn_bot, намного проще.
Добавить в избранное +97 +159
+
avatar
  • Mice
  • 22 ноября 2018, 10:59
+4
>> А может кто-то знает лучшее решение?

купить платный прокси за 3 бакса
+
avatar
  • genix
  • 22 ноября 2018, 11:05
0
Да, я думал про такое решение, но хочется минимизировать затраты :)
+
avatar
  • muskati
  • 22 ноября 2018, 11:26
+3
twitter.com/tgvpn

['proxy' => 'socks5://login:[email protected]:1080']
+
avatar
  • genix
  • 22 ноября 2018, 11:37
0
Искал подобное, но почему-то не нашел. Спасибо!
+
avatar
0
Купить за 5 баксов виртуалку в облаке у хетцнера и хостить всё там.
+
avatar
  • Sanja
  • 22 ноября 2018, 12:08
+7
за € 2.49 вообще-то: www.hetzner.com/cloud

VPN-сервер разворачиваем скриптом с github.com/jawj/IKEv2-setup (даже домен не понадобится).

на нём же поднимаем прокси для Телеграма (так он на мобильном меньше жрёт батарейку, чем через VPN) -https://habr.com/post/412759/#comment_18717423

Через мою хетцнеровскую виртуалку сидят 60 человек сослуживцев, загрузка минимальная, скорости выжимаются с лихвой за сто мегабит
+
avatar
  • stasv
  • 23 ноября 2018, 11:11
0
Заставил ребенка развернуть подобную пепяку на Digital Ocean, но тут сам DO в Роскомнадзоровский бан попал по айпишнику.
+
avatar
0
Не используйте для телеграма носки. Носки спокойно читаются DPI и прибивается коннект если он к телеграму. Используйте родной MTProto Proxy
Если кому-то очень надо и лень ставить, то в личке могу поделиться своим, мне не жалко.
+
avatar
  • volos4
  • 22 ноября 2018, 11:24
0
поставте локальный TOR. он умеет proxy
+
avatar
  • Ermak82
  • 22 ноября 2018, 11:24
0
3??? БАКСА?
VPS же за 1 евро в европе продают, слабенькие очень, но там можно и серверную часть поднять, и собственно заблокирован телеграм для него не будет.
+
avatar
  • Di1Ly
  • 22 ноября 2018, 11:42
+1
может кому надо, тут на тарифе SMART за 1 2,79 евро (подняли цены блин!!!) в мес, дают linux VPS vmware 1gb 20gb 1TB трафика
+
avatar
  • Ermak82
  • 22 ноября 2018, 12:25
0
Действительно подняли :(. Но для клиентов которые по 1 евро покупали, вроде оставили 1 евро. Сейчас жалею что только 1 сервер поднял.
+
avatar
0
Блин. У меня всего три виртуалки там по 1 евро. Вот ведь хотел четвертую взять несколько месяцев назад. За 2.79 уже смысла нет, можно взять у более надежных хостеров за такие деньги
+
avatar
  • adeep
  • 22 ноября 2018, 23:50
0
arubacloud 1евро в месяц
+
avatar
0
Стоит туда зайти и посмотреть. Они подняли цены.
+
avatar
0
Уже нет. 2,79 евро в месяц
1 остался только для продления для клиентов с уже купленным тарифным планом по 1 евро.
+
avatar
+8
Последнее время в нашем доме часто стала возникать проблема с горячей водой. В принципе, это началось, когда мы отсудили котельную в общедомовую собственность и начали сами ей распоряжаться

отличное начало!
+
avatar
  • genix
  • 22 ноября 2018, 12:55
+5
Да :) Но если сравнить платежи, то экономия для людей в двух домах (288 квартир) очень существенная получилась. За октябрь, например, по сравнению с прошлым годом, 1000 рублей разница для средней двушки.
А проблемы мы решим!)
+
avatar
0
а отопление нормально?
+
avatar
  • genix
  • 22 ноября 2018, 19:01
0
Не очень понял вопрос. Пока не было холодов, чтобы кто-то жаловался на холод
+
avatar
  • mikel23
  • 22 ноября 2018, 11:14
0
А нет готовой такой же. Просто wi-fi метеостанции с веб интерфейсом или отправкой e-mail telegramm и тд.?..
Конкретно нужена только температура в серверной.и если она больше порога то сообщение.

Интересен опыт реальный.
+
avatar
+2
Еспешка за два бакса из Китая и прошивка с WiFi-Iot.ru за те же два бакса — вуаля!
+
avatar
  • stdm
  • 22 ноября 2018, 11:31
0
Я такое сделал на распберри, куплленной на авито за 500 р.
Рисуется график температуры (по простому, через MRTG), при превышении заданного порога отправляется уведомление на почту (самодельным скриптом на питоне).
Если бы первая, самая древняя распберри тормозила меньше, можно было бы сказать что на настройку ушло 15 минут. С учетом ее тормозов, времени ушло чуть больше, только пакеты минут 20 обновлялись )
+
avatar
  • mikel23
  • 22 ноября 2018, 12:12
0
А готовое есть? Я из готового видел SON OFF.

www.aliexpress.com/item/Sonoff-TH10-TH16-Smart-Wi-Fi/32854996164.html
+
avatar
  • stdm
  • 22 ноября 2018, 12:28
0
Я делал систему исходя из следующих требований:
— не WiFi
— минимальная зависимость от локальной инфраструктуры (железке назначен внешний IP и зависит она только от оборудования провайдера)
— возможность удаленного контроля и настройки
— возможность добавления функций в случае необходимости
+
avatar
+2
Есть конструктор для ESP8266 — wifi-iot.com
Там можно прикрутить разные сервисы, например Народный мониторинг.
+
avatar
  • genix
  • 22 ноября 2018, 12:58
0
И зачем-то платить, если, например, понадобится всунуть больше 1 температурного датчика. Я не понял этой идеи, ведь самое сложное для меня было именно понять, как скетч заливать в плату…
+
avatar
0
Если нужно готовое устройство, то есть СМС-стукачь u-m.biz/phpBB3/viewtopic.php?t=175
+
avatar
  • freezl
  • 22 ноября 2018, 14:04
0
Если есть серверная, то наверняка есть и сервера, и мониторинг. В серверах навалом датчиков температуры, которые по IPMI отдают значения. Ставим Zabbix и настраиваем получение данных по IPMI и алерты на превышение какого то порога. Покупать вообще ничего не надо.
+
avatar
  • Di1Ly
  • 22 ноября 2018, 11:15
-1
Раз уж ESP8266, я бы эту задачу реализовал на Blynk.
По идее бесплатного объема элементов приложения должно хватить, или можно поднять свой сервер на дешевом хостинге.

В приложении графики выглядят красиво, есть экспорт в .csv.
Оповещения приходят в само приложение, думаю API от телеграмм тоже можно прикрутить.
+
avatar
  • genix
  • 22 ноября 2018, 11:40
0
В посте ссылки как раз на использование blink, но мне захотелось вывести именно в веб, без всяких приложений
+
avatar
  • dimats
  • 22 ноября 2018, 11:16
-4
Термодатчики скотчем… да…

Используйте хотя бы обычный силиконовый герметик, и желательно не через краску
+
avatar
  • genix
  • 22 ноября 2018, 11:41
+2
А Вы сравнивали теплопроводность силиконового герметика и минимального слоя алкидной эмали?
+
avatar
  • dimats
  • 22 ноября 2018, 11:59
+4
Да, но не с краской. Краску всегда удаляю с металла.

Ставлю уже много лет светодиоды не только на термоклей, но и на герметик, особенно если звезды использую (на автомобильный герметик, что на 200-300 градусов, он удобнее, и гдето читал теплопроводнее обычного строительного)

Когда-то эту идею почерпнул из интернета, попробовал, сравнил температуру радиатора, оказалась разница в пределах статичтических погрешностей.

PS: если вы разбирали блоки питания, в них сплошь и рядом термождатчики на герметике приклеены к радиаторам.
+
avatar
  • hcetih
  • 22 ноября 2018, 13:31
+2
Вполне себе стандартное решение взять датчик и просто прижать к трубе. И герметик и удаление краски — колхоз. А для высокой точности есть совсем другие способы монтажа датчика
+
avatar
  • ambuddy
  • 22 ноября 2018, 13:54
+1
Это важно, если вам надо только однажды узнать температуру, например, для обзора того же блока питания. А когда у вас есть динамика, не важно, что показывает датчик в конкретный момент. Важно, как текущие показания соотносятся с предыдущими. Грубо говоря, даже если датчик стабильно показывает на 50 градусов меньше, то и текущее и предудыщее значения будут на 50 градусов меньше, что просто учитывается в коде прослушки… Ну может коряво объяснил, но надеюсь, смысл понятен :)
+
avatar
0
Посоветуйте недорогой термоклей, аналогичный в блоках питания?
+
avatar
  • phazz
  • 23 ноября 2018, 05:03
+1
И ещё нужно было брать датчик без гильзы, он намного чувствительней и за счёт того что одна сторона плоская будет лучше прилегание. А теплоизоляция сверху нужна обязательно, иначе при изменении внешней температуры показания датчика тоже будут меняться.
+
avatar
  • Xizel
  • 22 ноября 2018, 11:22
+1
А что мешает зделать на народном мониторе и не выставлять датчик для всех. У меня так и работает. Есть и приложение для андрюши и прокси не надо.
+
avatar
  • genix
  • 22 ноября 2018, 11:46
0
Мне хотелось именно простоту просмотра для всех. Понадобится — просто поменяю путь к странице)
+
avatar
  • Xizel
  • 22 ноября 2018, 11:54
0
Ваш проект взял на заметку. У Нас телеграмм не блокируют, сервер есть дома — очень здорово. А подымать прокси тоже для народа не просто. Может отстрелялся с прошивками и пользуйся…
+
avatar
0
Поднять MTProto Proxy это ровно 1(одна) команда, что бы человеку подключить телеграм через нее это два тычка пальцем по экрану мобилы. Вроде не очень сложно.
+
avatar
+4
термопастой мазать не обязательно. можно просто поверх наложить кусок пенки.
+
avatar
  • genix
  • 22 ноября 2018, 11:50
+3
Согласен, теплоизолировать снаружи надо, не дошли руки еще) А термопаста валялась, че бы и не применить, хуже то не будет)
+
avatar
0
и лучше не особо тоже)
+
avatar
0
Поднять свой прокси и vpn, например на aruba.it
+
avatar
  • rocket1
  • 22 ноября 2018, 11:32
+5
На вашем сайте браузер ругается на несовпадение доменов при ajax запросах. Происходит запрос c домена 'www' на домен без 'www'. Настройте полиси, или «как порядочный веб-программист»© делайте запрос getJSON на относительный url. :)
+
avatar
  • genix
  • 22 ноября 2018, 11:51
0
Спасибо, да, поменяю на относительные) Но такой ошибки у себя не получал
+
avatar
  • neomoto
  • 22 ноября 2018, 11:33
0
Кто ж так переменные называет. И таблицы
+
avatar
  • genix
  • 22 ноября 2018, 11:53
+3
Куда без этого комментария :) Вы не смогли понять по названию переменных, для чего они нужны?)
+
avatar
  • neomoto
  • 23 ноября 2018, 09:16
0
я, конечно, смог, их всего 4 ) Просто если регулярно так делать, то войдет в привычку, а это не очень хорошо
+
avatar
  • fps
  • 22 ноября 2018, 11:55
+1
А что там не так?
+
avatar
  • neomoto
  • 23 ноября 2018, 09:15
0
имя переменной должно иметь смысл и в идеале отражать то, что она хранит
+
avatar
  • fps
  • 23 ноября 2018, 09:56
+1
Бесспорно. Но это никак не отвечает на мой вопрос.
+
avatar
+1
Должно иметь смысл для кого? Если код пишется для себя и не планируется его открывать под цивилизованными лицензиями, а так же не планируется, что кто-то другой будет с ним работать, то можно задавать такие имена, что они будут иметь смысл только для тебя.
+
avatar
  • AndyBig
  • 22 ноября 2018, 11:34
+1
Не пашет график по этому адресу :))
+
avatar
  • genix
  • 22 ноября 2018, 12:00
0
Попробуйте без www ;)
+
avatar
  • AndyBig
  • 22 ноября 2018, 12:12
0
Перебрасывает все равно на www :)
+
avatar
  • sir0ta
  • 22 ноября 2018, 12:42
-1
Это дебильный хром. Попробуй через IE. он не добавляет www.
+
avatar
  • AndyBig
  • 22 ноября 2018, 12:53
+1
Хром тоже сам ничего не добавляет в адрес :)
ЗЫ: уже заработало :) А www добавляла опера если только явно не написать перед именем сервера http:// :)
+
avatar
  • sir0ta
  • 22 ноября 2018, 13:05
0
Добавляет.
www.thewindowsclub.com/browser-automatically-adds-www-to-url
If your Google Chrome browser does this, Disable Prediction Service.

Go to Settings > Show advanced settings > Uncheck the box saying Use a prediction service to help complete searches and URLs typed in the address bar or the app launcher search box.
Сам столкнулся. Заказчик прозевал оплату хостинга (там все), хостинг хоть и имел бэкап, но все скрывает после подобного. Т.е. надо просить ТП. При восстановлении ребята как-то не правильно прописали зоны в DNS. И вышло так что www.site.ru был доступен, а site.ru редиректил на заглушку, как будто там ни чего нет. Я сразу этого не заметил, т.к. при наборе site.ru хром автоматом добавлял www. и перекидывал меня на сайт. У заказчика же была лиса и он сразу столкнулся с подобной проблемой. Я проверил на всех устройствах что у меня есть и естественно везде у меня хром и на всех устрйоствах я смог зайти на сайт.
+
avatar
  • AndyBig
  • 22 ноября 2018, 13:30
0
Добавляет.
Только если вводится адрес, который ранее уже открывался с www :)
+
avatar
  • Brs
  • 22 ноября 2018, 19:38
0
Надо было ему адсенс или Яндекс директ привесить) заработал бы)))
+
avatar
  • genix
  • 22 ноября 2018, 13:26
+6
Да, уже починил, спасибо)
Там энтузиасты начали графиком член рисовать, вот ведь муськоэффект… А я даже сознательно в посте ссылки не указал на график, все равно нашлись бета-тестеры))
+
avatar
  • AndyBig
  • 22 ноября 2018, 14:27
+2
Засветили адрес — сознательно или нет — ждите муськоэффекта :)
+
avatar
  • Brs
  • 22 ноября 2018, 19:37
0
У меня пашет во всю) и правда значит система работает ))
+
avatar
  • AndyBig
  • 22 ноября 2018, 19:51
0
Так автор уже давно все исправил :)
+
avatar
  • Rost
  • 22 ноября 2018, 11:39
+1
Раз уж такая пьянка, то может кто-нить подскажет самый дешевый вариант мониторинга трехфазного напряжения сети, который можно прикрутить к esp8266?
PZEM избыточен и дорог на три фазы.
+
avatar
  • Bacchus
  • 22 ноября 2018, 11:53
+1
Я сейчас смотрю на ZMPT101B но пока не пробовал
+
avatar
  • Rost
  • 22 ноября 2018, 17:53
0
У него аналоговый выход, понадобится 3шт esp8266.
Но цена приятная.
Вариант годный, уж всяко лучше, чем самостоятельно искать какие-то трансформаторы и после них городить выпрямители и делители.
+
avatar
  • Bacchus
  • 22 ноября 2018, 20:05
0
3 esp это жестоко :-)
PCF8591 или ADS1115 несколько попроще будет :-)
+
avatar
0
Хотел бы я на такое чудо посмотреть:)) А так- действительно внешний ацп на нужное число каналов, а если не нужна сверхвысокая точность, то можно и мультимплексором переключать входы.
+
avatar
+3
Мониторинг это мерить напряжение? Делитель и выпрямитель на АЦП
+
avatar
0
Можно реализовать на одной PZEM поочередно подключая каждую фазу (естественно при этом замеряем только напругу и ток по фазам) или вариант использовать аналоговый вход через понижающие трансформаторы. Так как вход один, необходимо также релешками коммутировать выходные напряжения трансформаторов на аналоговый вход. Схемы для однофазной сети в инете имеются.
+
avatar
0
Для точности «1 час» у вас вместо 60 минут используется 6 минут.
+
avatar
  • genix
  • 22 ноября 2018, 13:27
0
Спасибо, исправил!
+
avatar
  • AndyBP
  • 22 ноября 2018, 11:53
+2
Вот и бета-тестеры подтянулись…
+
avatar
  • Dfcz22
  • 22 ноября 2018, 11:54
0
Сразу же хочется все-все-все контролировать и получать от бота информацию. Желательно бота с ИИ, что бы поговорить было с кем.
+
avatar
  • genix
  • 22 ноября 2018, 12:03
0
Точно! Но не сразу, с момента заказа платы прошел ровно год)
+
avatar
  • bakinec
  • 22 ноября 2018, 12:07
+3
желательно обозначить на корпусе, что это за фиговина с проводами:
для особо продвинутых слесарей (ну и потомков тоже), можно было ещё QR-код наклеить на корпус :)
+
avatar
  • genix
  • 22 ноября 2018, 13:28
+1
Спасибо за идею, попробую срисовать :)
+
avatar
  • SilverD
  • 22 ноября 2018, 12:07
+1
Вопрос по бойлерной:
Почему такая просадка по температуре в 10:30 вечера и в 8:30 утра? Хотя, температура теплонасителя не упала.
Мощности теплообменников не хватает? Или они забились и требуют промывки?
+
avatar
  • Harwest
  • 22 ноября 2018, 12:24
0
Наверное расход большой на помывку…
+
avatar
  • genix
  • 22 ноября 2018, 13:34
0
Это тоже верно, к сожалению, не заложили это в смету на год, придется в следующем теперь.
+
avatar
  • npp
  • 22 ноября 2018, 12:31
0
Если б мощности теплообменников не хватало — ТС проявил бы явную озабоченность.
Обыкновенные пики потребления.

Вот почему вечером и утром резко уменьшается температура теплоносителя — это уже интересно. Такое впечатление, что ложные срабатывания погодных датчиков или других, которые контролируют работу теплогенерации.
+
avatar
  • SilverD
  • 22 ноября 2018, 12:36
+2
Я раньше работал инженером в эксплуатации бизнес-центра.
У нас такая ситуация была (с падением температуры в пики), когда теплообменники забились совсем. Мы их промыли химией, и все встало на свои места. И потом пришли к выводу, что теплообменники нужно промывать минимум раз в год. Иначе происходит такая ситуация как на графиках ТС.
+
avatar
  • npp
  • 22 ноября 2018, 12:49
0
Вывод Вы сделали абсолютно верный. Периодическая очистка поверхностей теплообмена — обязательна. Тем более со стороны сырой воды.
Я не о том.
Если подобное снижение температуры ГВС, при пиковых нагрузках, не сказывается отрицательно на потребителях — значит оборудование подобрано правильно, с верным запасом мощности.
+
avatar
  • diaskzn
  • 22 ноября 2018, 15:26
0
Это, насколько я помню, прописано в инструкции/паспорте к теплообменнику.
+
avatar
  • genix
  • 22 ноября 2018, 13:34
0
Вчера включили дополнительный котел, температура поднялась. Перед этим, видимо, выключали, чтобы провести какое-то ТО. Но в час ночи, судя по графику, какой-то котел вырубился, который вчера запустили дополнительно, и тут уже можно только догадки строить… Вот уже третий день специалисты обслуживающей котельную организации что-то чинят и ломают голову.
+
avatar
  • genix
  • 22 ноября 2018, 13:31
+1
Вот именно из-за этих просадок я и заморочился с этим устройством. Скорее всего теплообменники действительно требуют промывки, займемся этим через неделю, как получим деньги от старой управляющей компании по суду.
+
avatar
  • Harwest
  • 22 ноября 2018, 12:27
0
Хм, а mqtt сервак и пуш-уведомления на сотик сильно сложнее?
+
avatar
  • myweb
  • 22 ноября 2018, 12:38
+4
Для себя использовал ESP32 + 1-Wire DS18b20 и MQTT+InfluxDB+Grafana. В скором времени переведу на ESP8266 — ESP32 слишком мощная для такой простой задачи.

Вот скриншот:


InfluxDB + Grafana нравится:
Полностью хранится изначальная точность измерений по сравнению с RRD Решениями. Поддержка Alerts, Plugins, и т.д.
+
avatar
0
Тоже пользуюсь InfluxDB+Grafana, для температур на даче. очень нравится!
+
avatar
  • robosku
  • 22 ноября 2018, 18:33
0
Красота! За графану отдельный плюс, прекрасный софт )
+
avatar
  • nochkin
  • 23 ноября 2018, 04:09
0
В чём будет бонус перевода на ESP8266 в данном случае?
+
avatar
  • Stress
  • 22 ноября 2018, 12:50
0
Прикольно сделано. Ссылка открывается.

Я бы краску ещё стёр на трубе под датчиком температуры для лучшего контакта.
+
avatar
  • genix
  • 22 ноября 2018, 13:40
0
Спасибо за отзыв! Стирать краску не хочется, потому что может возрасти вероятность коррозии в этом месте (большая влажность в помещении, конденсат и т.п.) А чинить трубу потом очень затратно(
+
avatar
  • ksiman
  • 22 ноября 2018, 14:03
+4
Стирать краску не хочется
Да и не нужно — прикройте датчик теплоизоляцией с отражающим слоем и будет он казать точно
+
avatar
0
вот да. тоже первая мысль была, что как-то утеплить надо внешне…
+
avatar
  • merlin7
  • 22 ноября 2018, 12:51
+5
Подобные всплески на графике прекрасно убираются медианным фильтром
У меня в проекте мониторинга воздушной среды один из датчиков (кислород) аналоговый. Он дает такие же выбросы. Усреднение результатов приводит к погрешности. Следующий код решил проблему.

Код
В основном цикле
// накапливаем данные для медианного фильтра аналогового входа
// период опроса 120мсек
if (millis()-timer3 > 120)
{
//выбираем 65 значений
if (median_count<65)
{
oxy_raw[median_count] = analogRead(pinAdc);
median_count++;
}
timer3=millis();
}

Функция фильтра
float readO2_median ()
{
// сортируем массив по возрастанию значений в ячейках
float temp = 0; // временная переменная
for (int i = 0; i < 65; i++){
for (int j = 0; j < 65 — 1; j++){
if (oxy_raw [j] > oxy_raw [j + 1]){
temp = oxy_raw [j];
raw[j] = oxy_raw [j + 1];
oxy_raw [j + 1] = temp;
}
}
}
// возвращаем значение средней ячейки массива

float MeasuredVout = oxy_raw [32] * (VRefer / 1023.0);
//Сбрасываем счетчик накопления
median_count=0;
return MeasuredVout;
}


При такой фильтрации случайные всплески датчика не будут влиять на результат.
+
avatar
  • genix
  • 22 ноября 2018, 13:41
0
Спасибо за дельный совет!
+
avatar
  • Sploder
  • 22 ноября 2018, 12:55
+1
А не проще бы выяснить в чем причина остановки котла? И соответственно решать эту проблему.
+
avatar
  • genix
  • 22 ноября 2018, 15:37
+1
Не проще, потому что если за проблему ответственны другие люди, то у вас есть уже две проблемы — сама проблема и проблема контроля этих людей, чтобы они ее исправили :)
Размещение этих датчиков как раз решает проблему контроля — оно позволило привлечь больше внимания к проблеме со стороны обслуживающей организации, сегодня директор этой организации лично пол дня лазил по подвалу и некоторые выводы уже сделаны, сформулированы методы решения.
+
avatar
+4
Никакой авторизации, можно отправлять показания всем желающим
+
avatar
  • genix
  • 22 ноября 2018, 13:43
+2
Спасибо, добрый молодец, что указали на недостаток %)
Добавил авторизацию, пока кто-нибудь член не нарисовал графиком. Честно говоря, не ожидал, что кто-то будет этим заниматься)
+
avatar
  • ambuddy
  • 22 ноября 2018, 13:59
0
del
+
avatar
+8
Сам прошел этим же путем: датчики DS18B20 снаружи на трубах.

Что я могу сказать.
1. Датчики надо теплоизолировать от окружающей среды, иначе получается «погода на Марсе, осложненная земным климатом». Сами же видите: датчик касается трубы мизерной площадью, а все остальное висит в окружающем холодном воздухе. И скотч — это плохая теплоизоляция (и крепеж плохой). Свои я крепил проволокой, и стоило замотать их в два слоя теплоизоляцией на ширине в полметра — как добавилось почти 10 градусов.

2. Датчики надо калибровать. Потому что метод измерения у вас — косвенный, и температура на поверхности трубы вовсе не равна температуре воды внутри. Я использую такую эмпирическую формулу: до +20 температуры равны, выше — прямая «истинной» температуры идет вверх круче температуры трубы, а угловой к-т получил калибровкой в рабочей точке: взял второй датчик, одел варежки чтобы не обвариться, приоткрыл кран слива трубы — и сунул датчик в поток. И подождал пять минут, а система все это время писала показания с обоих датчиков.

3. Показания датчиков надо фильтровать от ошибок. 1-wire — система, весьма чувствительная к наводкам, а у вас в ИТП наверняка есть насосы и прочие мощные потребители электричества. Так что сбои — будут. Можно вылавливать явные ошибки (те же -70 например), а можно сделать скажем медианный фильтр: берете 5 подряд результатов измерения, сортируете по возрастанию, и в качестве результата используете третье значение.

4. Показания датчиков надо фильтровать от шумов. Датчик неидеален, и конструкция измерительной системы неидеальна, а в итоге будет разброс показаний, не несущий никакой смысловой нагрузки. Используйте например экспоненциальное скользящее среднее — предельно просто реализуется, а результат радует глаз.

P.S. Как сделать экспоненциальное скользящее среднее. Определяемся с длиной… пусть скажем n=10

const float aEMA=2.0/(1.0+n);
float xEMA;

А дальше пусть x это очередные показания датчика
Тогда в самом начале, с первым показанием делаем так

xEMA=x;

А дальше в рабочем цикле, получив очередное значение x

xEMA= aEMA*x+(1.0-aEMA)*xEMA;

И используем xEMA как результат
+
avatar
  • Lvenok
  • 22 ноября 2018, 13:54
0
Есть такая теплоизоляционная лента-скотч K-flex. Стоит денег, но у холодильщиков расходник…
+
avatar
  • genix
  • 22 ноября 2018, 13:59
0
Спасибо за ценные советы!
На фото видны датчики теплосчетчика, стоящие неподалеку, они как раз по-правильному монтированы прямо в среду, внутрь трубы. И показывают тот же результат с разницей в 1 градус (при температуре 50 градусов) Возможно, для больших значений отклонение будет чуть больше. Теплоизолирую снаружи обязательно! Но 10 вряд ли добавится, конечно…
Про медианный фильтр уже кто-то выше советовал, попробую реализовать, спасибо)
С выводом графика прекрасно справляется ChartJS, если указывать период данных не слишком частый, конечно)
+
avatar
0
Еще раз: два разных фильтра, решающих две разные задачи.

Сперва фильтруем данные от ошибок — медианным фильтром, или «окном» (отбрасываем все значения выше и ниже ожидаемых), или еще как.

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

А данные я отправляю в Zabbix (видимо — у кого какая профессиональная деформация, тот на то и горазд :) )
+
avatar
  • freezl
  • 22 ноября 2018, 14:57
0
Показания в -70 — это скорее всего из-за неправильного подключения. 1-wire — это шина и датчики на ней должны крепиться последовательно, как гирлянда. 1-wire не любит ответвлений от основной шины более чем на метр (как раз то, что сделал автор). Вторая вероятная причина — не хватает питания, возможно стоит уйти от паразитной схемы.
+
avatar
  • genix
  • 22 ноября 2018, 15:40
0
Поясните пожалуйста, что значит «автор сделал ответвления от основной шины более чем на метр»? И про «паразитную схему» тоже, я что-то далек от электротехники, к сожалению.
+
avatar
  • Avacha
  • 22 ноября 2018, 16:02
0
Схема паразитного питания датчика ds18b20, описана в даташите.
+
avatar
  • freezl
  • 22 ноября 2018, 16:43
0
Автор соединил все провода в точки. Для питания это пойдёт, а вот для передачи данных в 1-wire не очень хорошо. Как бы объяснить… гирлянду представляете? Аналогия та же — основной провод является шиной и датчики должны подключаться максимально близко к ней, без ответвлений.
Паразитное питание, это когда датчик запитывается от сигнального провода.
+
avatar
  • Lvenok
  • 22 ноября 2018, 13:53
+1
а у каждого физического датчика свой индивидуальный адрес зашит с завода? Как контроллер их различает?
+
avatar
+1
Да, у каждого девайса на шине 1-wire адрес уникальный и зашит на заводе.
+
avatar
-1
Чёт я не понял, где люди говорящие «ethernet- прошлый век, купи wifi роутер 5 ГГц»?
+
avatar
  • kovax
  • 22 ноября 2018, 14:25
0
не мне одному «повезло» с датчиками такими — делал отопление у себя и прикупил 5 датчиков таких, все развел — работало, решил еще прикупить на будущее 6шт, купил и лежали… понадобились и какое было у меня чувство — девайс сдох или «лыжи не едут», когда при подключении дополнительных все стало валиться. на ардуинке собрал тестер — ВСЯ последняя партия МЕРТВЫЕ датчики((
нормальные датчики с проводами красный, оранжевый, черный, а мертвые красный, желтый, черный… почитал в инете — не мне одному так «везло»((((((((( купил отдельно чипы с хорошими отзывами — исполнение делать сам буду, потому как такой кусок трубки не всегда удобно можно пристроить (разбирал их — внутри просто на герметик вставлен чип без намека на термопасту)…
+
avatar
  • Avacha
  • 22 ноября 2018, 16:04
+2
Может, цвета у проводов перепутаны, попробуйте желтый и красный местами поменять.
+
avatar
+3
Большая медная луженая клемма под провод соответствующего сечения. Датчик в корпусе «как транзистор». Припаиваем провода, изолируем, выдавливаем каплю термопасты в клемму, вставляем туда датчик — и пассатижами слегка обжимаем низ клеммы, чтобы датчик не выскочил. И еще раз изолируем.
И крепить удобно, и теплопроводность хорошая.
+
avatar
0
Скажите, все «порядочные веб-программисты» располагают корпус отверстием вверх, без дренажных отверстий снизу?
+
avatar
  • genix
  • 22 ноября 2018, 15:13
+5
Специально подобранная банка сделана таким образом, что как только уровень воды внутри нее достигает половины банки, она автоматически отсоединяется от крышки и отваливается вниз под действием силы тяжести. А сама плата дополнительно герметизирована с помощью великого Скотча и полиэтилена, но провода, на которых она висит, дополнительно удерживают ее в самом верху банки, исключая контакт с внезапно образовавшейся внутри банки водой)
+
avatar
  • SiZE
  • 22 ноября 2018, 14:56
+3
Для уведомлений без прокси можно @bullhorn_bot подключить. Он принимает post запрос с json вида:
{"text":"So _advanced_\nMuch *innovations* "}
и выводит в телеге.
+
avatar
  • genix
  • 22 ноября 2018, 15:15
0
Отлично, спасибо, добавлю в пост
+
avatar
  • denM
  • 22 ноября 2018, 16:11
0
Котельная у вас в доме или обособленная? и долго пришлось судиться?

Вы на общественных началах программером/админом «работаете» или всё-таки за денежку ?, думаю немногие стали бы из альтруистических побуждении (пусть даже для себя) так стараться, расходуя личное время и нервы.
+
avatar
  • genix
  • 22 ноября 2018, 16:23
+2
Котельная у нас на крыше, но по странному стечению обстоятельств, она почему-то с момента сдачи дома была в собственности у организации, учредителем которой является гендиректор фирмы-застройщика. И горячая вода у нас в прошлом году стоила бывало по 400 рублей за куб (даже зимой). Судились чуть больше полугода…

Программером я работаю за денежку, а вот председательство в ТСЖ — скорее хобби, потому что даже 15 тысяч рублей в месяц, которые у меня были окладом первый год после создания ТСЖ, деньгами назвать сложно (с точки зрения веб-программиста, конечно). А с августа этого года уже управлением домом занимается нанятая посторонняя управляющая за оклад 20000 руб, на мой взгляд, самая профессиональная в нашем небольшом городке. А я продолжаю следить за всем за 2900 руб в месяц :)
Альтруизм — это моя слабость, да)
+
avatar
  • denM
  • 22 ноября 2018, 16:33
0
похвально — за альтруизм.

правда размещение котельной на крыше, напряжно как-то, имхо, ГИ хотя бы сделана — а то в случае чего — ой :(
+
avatar
  • genix
  • 22 ноября 2018, 16:53
+1
Зря, крышные котельные применяются повсеместно. Если они запитаны от ГРП газовой трубой низкого давления, то они даже не являются ОПО (опасный производственный объект). Стены там не несущие, в случае взрыва (не дай Бог) зданию даже ущерба не нанесется серьезного, кроме самого оборудования котельной. Да и автоматики там столько, что вероятность крайне мала. Иначе бы постоянно в новостях мелькало…
+
avatar
  • denM
  • 22 ноября 2018, 17:10
0
ну помимо газа, еще есть и вода и эл-во. я именно больше про воду.

ну как бы котельная располагается на плитах перекрытия крыши, т.е если что та самая плита может внутрь полететь с вытекающими, ну или если на краю — то всё равно будет как-то опираться на стену (плиту в случае плиты) или кирпич (если дом кирпичный) т.е вполне плиту дома на которую опирается крыша может сдвинут и край дома обвалится.…

автоматика — дело такое — может и не сработать вовремя, да и не от всего спасёт увы, должны быть предусмотреть и мех. задвижки и задвижки до задвижек и еще задвижки до задвижек задвижек.
+
avatar
  • Brs
  • 22 ноября 2018, 19:45
+1
По моим наблюдениям у нас на новых домах в 60-70 процентов случаев котельные на крыше. Если бы было запрещено, то не делали бы, а так явно всякие документы есть что можно так делать
+
avatar
  • arbatjc
  • 22 ноября 2018, 16:40
+2
Отличный проект, однозначно жирный плюс! Спасибо.
+
avatar
0
раз тут собрались спецы по 8266, может кто делал или встречал проект похожий, надо читать UART раз в секунду и отдавать по воздуху любым способом, при этом нужно минимальное энергопотребление, т.к батарейное питание. будить могу внешним МК.
+
avatar
0
«Будить раз в секунду» и «отдавать по wifi» — несовместимо, wifi стартует дольше секунды.

Либо накапливайте данные, а потом пакетом передавайте раз в несколько минут. Либо используйте не WiFi, а другой канал — провод, или скажем LoRa.
+
avatar
0
По-поводу прокси сервера, я прикупил себе виртуальный сервер за 1 евро в месяц на аруба .it, Подсмотрел на хабре, вот тут, надеюсь помог :)
habr.com/company/aladdinrd/blog/353738/
+
avatar
  • renat85
  • 22 ноября 2018, 21:20
0
Можно было вкатить tasmota и гнать данные по mqtt на тот же blynk или cloudmqtt. Если уж совсем заморочится то можно было бы поднять и сервер на homeassistant, openhab, majordomod и т.д. по вкусу. А там уже и диспетчеризация котельной и преферанс и дамы. По информированию присмотритесь к Slack.
+
avatar
  • rexen
  • 22 ноября 2018, 21:39
+18

— как-то вы сильно упростили «традицию» :)
+
avatar
+1
На сервере время правильное
В базе данных время правильное
На клиенте время правильное
В выдаче json время +1 час вперед — соответственно на странице тоже.

Это лечится?

Спасибо за статью. Подчерпнул так подчерпнул.
+
avatar
  • genix
  • 23 ноября 2018, 07:52
0
«Правильным» это время на сервере будет только для тех, кто живет по часовому поясу Москвы :)
А мы в глуши, в Саратове…
+
avatar
0
А если серьезно?
Кто портит картину?
+
avatar
  • genix
  • 23 ноября 2018, 10:00
0
Почему портит? При выводе специально добавляется час, чтобы выводилось по нашему Саратовскому времени, потому что устройство используется только тут. Мне показалось более правильным, что данные соответствуют правильному времени там, где они находятся. Сервер — в Москве, данные в базе поэтому по времени мск. Клиентская часть — в Саратове, поэтому прибавляется час в коде перед выводом.
+
avatar
0
Неправильно добавлять что-то при выводе. Правильно использовать в софте часовой пояс для которого он работает, либо, если у нас идет браузерная отдача клиенту вообще использовать время клиента.
+
avatar
0
Гляжу в книгу в код — вижу фигу. Разобрался :)
+
avatar
0
Кстати, в скетче не нашел (или опять плохо искал? :)) настройки разрешения датчиков.
Можно командой в 1-wire настроить точность 9,10,11 или 12бит для каждого датчика.
От этого сильно зависит время преобразования температуры.
Разрешение — Максимальное время конвертирования
9-bit — 93.75 ms (0,5 градуса)
10-bit — 187.5 ms (0,25)
11-bit — 375 ms (0,125)
12-bit — 750 ms (0,0625)
+
avatar
  • genix
  • 23 ноября 2018, 13:11
0
Где-то я слышал, что у них погрешность измерения то ли в 0.5 градуса, то ли в целый градус… При этом о разрешении в 9 или 12 бит говорить довольно смешно :)
Ну, по крайней мере 4 датчика, лежащие прям рядом с друг другом, всегда показывают относительно разные температуры в пределах погрешности, причем их линии пересекаются, а не движутся все синхронно) А про скорость считывания — не возникало такой проблемы, не подозревал даже о ней.
+
avatar
0
Да, есть такое. Причем чем больше температура — тем больше погрешность.
Просто вот эти 4 строчки:
float temp1 = sensors.getTempCByIndex(0);
float temp2 = sensors.getTempCByIndex(1);
float temp3 = sensors.getTempCByIndex(2);
float temp4 = sensors.getTempCByIndex(3);
Выполняются за 3 секунды, а могли бы за 0,375сек :) Вдруг пригодится в дальнейшем…

Период опроса в скетче 60сек. К ним каждый раз прибавляется еще 3 сек. минимум.
То есть реальный период 63 сек.
+
avatar
  • genix
  • 23 ноября 2018, 15:47
0
Интересное замечание) Что-то беглый осмотр библиотеки не дал мне понять, как это реализовать, но если в дальнейшем понадобится, буду иметь в виду, спасибо)
+
avatar
+1
sensors.SetResolution(от9до12);
По-умолчанию «с завода» оно 12бит
При инициализации датчиков есть строка bitResolution=9
А в sensors.begin есть такая строчка:
bitResolution = max(bitResolution, getResolution(deviceAddress));
То есть выберет то, что установлено в датчике.
+
avatar
  • genix
  • 23 ноября 2018, 20:53
0
Отлично, спасибо!
+
avatar
  • qwerty2
  • 23 ноября 2018, 00:50
0
А в чем профит использования еспешки, если все равно тянули кабель и ставили рутер рядом? По мне так лучше бы ардуинку с ланом + poe. И на рутере сэкономили бы.
+
avatar
  • genix
  • 23 ноября 2018, 07:55
0
Да, я так в тексте и написал)

Тут мне пришла в голову мысль, что вместо WiFi-платы можно было бы использовать сразу модуль с RJ-45 на борту, но было уже поздно :)
+
avatar
  • zack
  • 23 ноября 2018, 02:17
0
Подскажите, а можно ли отправлять данные не на телеграмм, а допустим в облако (icloud) и тому подобное. Как такое реализовать? или же можно ли сделать допустим отправку смс на определенный номер?
+
avatar
  • genix
  • 23 ноября 2018, 08:09
0
Используя указанный в посте сервис sms.ru это можно сделать элементарно, заменив в коде скетча (если совсем исключить из этого проекта сервер на PHP и отправлять СМС сразу с датчика)
sprintf (url, "http://адрес_вашего_сервера/?t1=%.2f&t2=%.2f&t3=%.2f&t4=%.2f", temp1, temp2, temp3, temp4);

на
sprintf (url, "https://sms.ru/sms/send?api_id=ВАШ_АПИ_КЛЮЧ&to=7ВАШ_НОМЕР_ТЕЛЕФОНА&json=1&msg=t1=%.2f&t2=%.2f&t3=%.2f&t4=%.2f", temp1, temp2, temp3, temp4);

Но в этом случае не обойтись без фильтрации данных, а то часто будут сбои приходить, и фиг просмотришь потом.

А если именно отправку на телеграм поменять, то в файле index.php поменять строки
include 'tele.php';
message_to_telegram("ГВС_П: $t4, ГВС_О: $t2, Котельная_П: $t1, Котельная_О: $t3");

на
file_get_contents("https://sms.ru/sms/send?api_id=ВАШ_АПИ_КЛЮЧ&to=7ВАШ_НОМЕР_ТЕЛЕФОНА&json=1&msg=t1=$t1,t2=$t2,t3=$t3,t4=$t3");


Сервис полезный, периодически пользуюсь им для целей ТСЖ.

Про «облака» — icloud например, это хранилище, типа флешки. Как отправить температурные данные на флешку? Ну, можно создавать каждый раз новый файл… Можно дописывать в какой-то определенный файл и сохранять… В зависимости от того, как вы придумаете хранить информацию в этом «облаке», можно и реализовать как угодно. Чаще всего подобные операции можно сделать с помощью HTTP-запроса, пример которого я и описал выше