Re: Модуль Энергомера
Добавлено: Ср дек 21, 2016 10:14 pm
Поэкспериментировал ещё. Похоже, что происходит зависание в функции readPort.
SPOILERSPOILER_SHOW
Внёс это изменение. Что-то разницы никакой не заметил. Вроде всё так жеIvan писал(а):Нашёл 1 ошибку. Получилась потому что в MySensor не нужно ждать ответа
В файле /modules/energomera/PhpSerial.php : 166 = stream_set_blocking($this->_dHandle, 1);
Код: Выделить всё
#!/usr/bin/env php
<?php
// Read answer from device with 500ms timeout
function rd($fp)
{
$result = '';
$c = '';
stream_set_blocking($fp,0);
$timeout=microtime(1)+0.5;
while (microtime(1)<$timeout) {
$c=fgetc($fp);
if($c === false){
usleep(5);
continue;
}
$result .= $c;
}
return $result;
}
// Parameters for port
#======================================================
exec('/bin/stty -F /dev/ttyACM0 cs8 9600 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts -parenb -cstopb -clocal');
#======================================================*
# Open port *
#======================================================*
$fp = fopen("/dev/ttyACM0", "r+");
if (!$fp) {
echo "Error opening port";
die();
}
#========================================================*
# Инициализация соединения, передача пароля *
# 0x5e,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xc7,0xe2 *
#========================================================*
stream_set_blocking($fp,1);
fwrite($fp, "\x5e\x01\x01\x01\x01\x01\x01\x01\x01\xc7\xe2");
$result = rd($fp);
echo "Init:".$result;
#======================================================*
# Частота, Гц *
# 0x5e,0x08,0x16,0x40,0x9d,0x9e *
#======================================================*
stream_set_blocking($fp,1);
fwrite($fp, "\x5e\x08\x16\x40\x9d\x9e");
$result = rd($fp);
echo "F:".$result;
#======================================================*
# Завершение соединения //0x5e,0x02,0xb8,0x11 *
#======================================================*
stream_set_blocking($fp,1);
fwrite($fp, "\x5e\x02\xb8\x11");
$result = rd($fp);
echo "Close:".$result;
fclose($fp);
?>
А если написать php-скрипт не посредственно в МД и в конце скрипта его перезапускать с помощью SetTimeout. В качестве команды указать runScript [указать имя текущего скрпита] и выставить необходимое время перезапуска. А для первоначального старта скрипта дополнить OnNewMinut командой на запуск runScript [указать имя скрпита].Victor_S писал(а):Ivan, подскажи, пожалуйста, по параметрам настройки порта под линукс.
"Костыли" в том, что во-первых мне не удалось запустить опрос из-под МД, Опрос идет через php скрипт запускаемый из планировщика, а он уже читает - пишет данные в базу МД.
Вроде как на этой апельсине уже есть UART?Victor_S писал(а):Для этих целей решил попробовать Orange Pi Zero 512M. Поставил на него armbian и LAMP. Пытаюсь организовать связь со счетчиками через USB "свисток". Их у меня парочка. Один сейчас работает(т.е. с работоспособностью и подключением все ок), он видимо FTDI, т.к. в линуксе определяется как /dev/ttyACM0. Другой на ch341, его нигде не проверял, он в линуксе определяется как /dev/ttyUSB0.