Умный дом на Entware

Используем пакеты, расширяющие возможности оборудования
yuoras
Сообщения: 33
Зарегистрирован: 21 сен 2015, 18:22

Сообщение yuoras » 19 окт 2015, 15:18

Добрый день.

Порылся на просторах интернета и нашёл хороший модуль для дистанционного сьёма показаний с счётчика Меркурий 200 на CyberWrt.
http://cyber-place.ru/showthread.php?t=1307 и http://cyberwrt.ru/demo/index.php?categories=SmartHome#
Кто то пробовал прикрутить к Entware ?.

Пока Благодарность
Белый-Белый ZyXEL Keenetic I серии Zyxware перешёл на Entware

yuoras
Сообщения: 33
Зарегистрирован: 21 сен 2015, 18:22

Сообщение yuoras » 23 окт 2015, 13:00

погуглив нарыл тему на PHP.
Есть одна проблема ,используется Direct IO (dio).
Дело в том, что в версиях PHP выше 5.0.5 эти функции не поддерживаются и модули расширения в дистрибутивные пакеты не входят.

Как выкрутиться ?
Кусок кода
 

Код: Выделить всё

<?
// BUS Type: RS485 or CAN
define('BUS', 'CAN');
FOR LINUX BOX

//dio_fcntl($fd, F_SETFL, O_SYNC);


dio_tcsetattr($fd, array(
  'baud' => 9600,
  'bits' => 8,
  'stop'  => 1,
  'parity' => 0
)); 


##############

function merc_gd($cmd, $factor = 1, $total = 0)
{
	global $fd;
	global $sleep_time;

	usleep_win(50);
	flush();
	dio_write($fd, $cmd, 6);
	usleep_win($sleep_time);
	$result = dio_read($fd, 64);

	$ret = array();
	
	if ( BUS == "CAN" )
	$start_byte = 7;
	else
	$start_byte = 1;
	
	if ( $total != 1 )
	{
		for ( $i = 0; $i < 4; $i++ )
		{
			if ( dechex(ord($result[$start_byte + $i * 3])) >= 40 )
			$result[$start_byte + $i * 3] = chr(dechex(ord($result[$start_byte + $i * 3])) - 40);
			if ( strlen($result) > $start_byte + 2 + $i * 3 )
			$ret[$i] = hexdec(dd($result[$start_byte + $i * 3]).dd($result[$start_byte + $i * 3 + 2]).dd($result[$start_byte + $i * 3 + 1]))*$factor;
		}
	}
	else
	$ret[0] = hexdec(dd($result[$start_byte+1]).dd($result[$start_byte]).dd($result[$start_byte+3]).dd($result[$start_byte+2]))*$factor;


	return $ret;
}

$sleep_time = 200;

function dd($data = "")
{
	$result = "";
	$data2 = "";
	for ( $j = 0; $j < count($data); $j++ )
	{
		$data2 = dechex(ord($data[0]));
		if ( strlen($data2) == 1  )
		$result = "0".$data2;
		else
		$result .= $data2;

	}
	return $result;
}

# Инициализация соединения, передача пароля
dio_write($fd, "x00x01x01x01x01x01x01x01x01x77x81", 11);
usleep_win($sleep_time);
$result = dio_read($fd, 15);

$n = 0;
$total_cnt = 90;
$total_cnt1 = 1080;
while ( $n == 0 )
{

	# Сила тока по фазам
	# =====================================================
	$Ia = merc_gd("x00x08x16x21x4Fx9E", 0.001);
	echo "Ia: $Ia[0] - $Ia[1] - $Ia[2]";
	$It = $Ia[0] + $Ia[1] + $Ia[2];
	# Мощность по фазам
	# =====================================================
	$Pv = merc_gd("x00x08x16x00x8Fx86", 0.01);
	if ( round($Pv[0], 2) != round($Pv[1] + $Pv[2] + $Pv[3], 2) )
	$error = "error"; else $error = "";
	echo "Pv: $Pv[0] - $Pv[1] - $Pv[2] - $Pv[3] $error";
	# Cosf по фазам
	# =====================================================
	$Cos = merc_gd("x00x08x16x30x8Fx92", 0.001);
	echo "Cos: $Cos[0] - $Cos[1] - $Cos[2] - $Cos[3]";

	# Напряжение по фазам
	# =====================================================
	$Uv = merc_gd("x00x08x16x11x4Fx8A", 0.01);
	echo "Uv: $Uv[0] - $Uv[1] - $Uv[2]";

	$total_cnt++;
	if ( $total_cnt >= 90 )
	{
		// Общее потребление
		$Tot = merc_gd("x00x05x00x00x10x25", 0.001, 1);
		echo "Total: $Tot[0]";

		$Tot = merc_gd("x00x05x00x01xD1xE5", 0.001, 1);
		echo "Total T1: $Tot[0]";

		$Tot = merc_gd("x00x05x00x02x91xE4", 0.001, 1);
		echo "Total T2: $Tot[0]";

		// За текущие сутки
		$Tot = merc_gd("x00x05x40x00x21xE5", 0.001, 1);
		echo "Total cur: $Tot[0]";

		// За текущие сутки (Тариф 1)
		$Tot = merc_gd("x00x05x40x01xE0x25", 0.001, 1);
		echo "Total cur T1: $Tot[0]";

		// За текущие сутки (Тариф 2)
		$Tot = merc_gd("x00x05x40x02xA0x24", 0.001, 1);
		echo "Total cur T2: $Tot[0]";

		$total_cnt = 0;
	}

	$total_cnt1++;
	if ( $total_cnt1 >= 1080 )
	{
		// За предыдущие сутки
		$Tot = merc_gd("x00x05x50x00x2Cx25", 0.001, 1);
		echo "Total prev: $Tot[0]";

		// За предыдущие сутки (Тариф 1)
		$Tot = merc_gd("x00x05x50x01xEDxE5", 0.001, 1);
		echo "Total prev T1: $Tot[0]";

		// За предыдущие сутки (Тариф 2)
		$Tot = merc_gd("x00x05x50x02xADxE4", 0.001, 1);
		echo "Total prev T2: $Tot[0]";

		$total_cnt1 = 0;
	}

	sleep(10);
}

# Завершение соединения
dio_write($fd, "x00x02x80x71", 4);
usleep_win($sleep_time);
$result = dio_read($fd, 8);
dio_close($fd);

?>
Свернуть
Белый-Белый ZyXEL Keenetic I серии Zyxware перешёл на Entware


Вернуться в «Entware/Qnapware/Optware/Zyxware - обсуждаем репозитории пакетов»

Кто сейчас на конференции

Всего 1 посетитель :: 0 зарегистрированных, 0 скрытых и 1 гость (основано на активности пользователей за последние 5 минут)
Больше всего посетителей (121) здесь было 18 май 2016, 18:19

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость