Вот спасибо! Такое решение мне очень даже нравится. 5 копеек от меня. Добавил ограничение ожидания ответа в 1 секунду чтобы не подтормаживало циклы если сервак неживой. Есть задумка сделать частые опросы только если свойство Alive=1. Иначе только раз в минуту.
И еще у мня были пробелы на конце у Frequency, batVoltage и inTemp. Уменьшил длину до четырех. Но на счет температуры даже и не знаю что будет, если юпс будет холодный и температура ниже 10 градусов.
Код: Выделить всё
$cmdUrl = 'http://10.10.3.43:8080';
$ctx = stream_context_create(array(
'http' => array('timeout'=>1)
)
);
$state = file_get_contents($cmdUrl, 0, $ctx);
$value = explode('</br>',$state);
// Report - 04.01.2015 14:02:18
$value[0] = substr($value[0],17,18);
// I/P Voltage = 217.5 V
$value[2] = substr($value[2],16,5);
// I/P Fault Voltage = 217.5 V
$value[3] = substr($value[3],22,5);
// O/P Voltage = 217.5 V
$value[4] = substr($value[4],16,5);
// O/P Current = 015 %
$value[5] = substr($value[5],16,3);
// I/P Frequency = 50.0 Hz
$value[6] = substr($value[6],18,4);
// Battery Voltage = 0108 V
$value[7] = substr($value[7],20,4);
// Temperature = 53.2 °C
$value[8] = trim(substr($value[8],16,4));
// UPS Status = 00001001
$value[9] = substr($value[9],15,8);
/*
battery.voltage - battery.voltage.low
battery.charge = ------------------------------------------ x 100 %
battery.voltage.high - battery.voltage.low
*/
$bh = gg('UPS.batVoltHigh');
$bl = gg('UPS.batVoltLow');
$bc = round( ($value[7] - $bl) / ($bh - $bl) *100 );
sg('UPS.measurTime',$value[0]);
sg('UPS.inVoltage',$value[2]);
sg('UPS.faultVoltage',$value[3]);
sg('UPS.outVoltage',$value[4]);
sg('UPS.load',$value[5]);
sg('UPS.Frequency',$value[6]);
sg('UPS.batVoltage',$value[7]);
sg('UPS.inTemp',$value[8]);
sg('UPS.status',$value[9]);
sg('UPS.batCharge',$bc);
sg("UPS.updatedTime",date("H:i",time()));
Пробовал на регулярных выражениях. Работает, но я в них пока мало чего понимаю.
- <b>Report</b> - 04.01.2015 5:01:13</br>
VID: 0x06DA PID: 0x0003 Product: USB UPS</br>
I/P Voltage = 218.7 V</br>
I/P Fault Voltage = 218.7 V</br>
O/P Voltage = 218.7 V</br>
O/P Current = 020 %</br>
I/P Frequency = 50.0 Hz</br>
Battery Voltage = 0108 V</br>
Temperature = 53.2 °C</br>
UPS Status = 00001001</br>
Код: Выделить всё
preg_match('|<b>Report</b> - (.*)</br>|', $state, $matches);
sg('UPS.measurTime',$matches[1]);
preg_match('|I?P Fault Voltage = (.*) |', $state, $matches);
sg('UPS.inVoltage',$matches[1]);
preg_match('|I?P Fault Voltage = (.*) |', $state, $matches);
sg('UPS.faultVoltage',$matches[1]);
preg_match('|O?P Voltage = (.*) |', $state, $matches);
sg('UPS.outVoltage',$matches[1]);
preg_match('|O?P Current = (.*) |', $state, $matches);
sg('UPS.load',$matches[1]);
preg_match('|I?P Frequency = (.*) |', $state, $matches);
sg('UPS.Frequency',$matches[1]);
preg_match('|Battery Voltage = (.*) |', $state, $matches);
sg('UPS.batVoltage',$matches[1]);
preg_match('|Temperature = (.*) |', $state, $matches);
sg('UPS.inTemp',$matches[1]);
preg_match('|UPS Status = (.*)</br>|', $state, $matches);
sg('UPS.status',$matches[1]);
Осталось все таки придумать, как прицепить свой Ippon к серверу. Ippon в гараже, а сервер на втором этаже. Между ними есть LAN, 1-Wire и две запасные витые пары например для RS485. У Ippon есть USB и Rs232.
Вижу три варианта:
1.
TCP/IP Ethernet to Serial DB9 RS232. Весьма удобно и должно работать, но цена сильно кусучая. Даже на Али больше четырех килорублей. Можно конечно собрать что то подобное самому на базе бюджетного роутера.
2. На стороне Ippon перевести
Rs232 to RS485, а на стороне сервера
RS485 to USB. Весьма бюджетно, но вот будет ли работать.
3. Собрать комп из утиля и поставить рядом с Ippon. Работать будет полюбому, но это как из пушки по воробьям.