NEWS
Как подключить устройство, включающееся внешним скрипт (php)?
-
Есть устройство, которое включается-выключается php-скриптом.
Можно ли создать это устройство в iobroker подключив через драйвер javascript?
Покажите пример пожалуйста.
Какие есть другие варианты? (При условии что внешний скрипт это "черный ящик",- исходный код не доступен).
-
вопрос не о чем, что за устройство, как подключено?
-
вопрос не о чем, что за устройство, как подключено? `
Не важно какое устройство - цель не заменить код (php), а просто вызывать внешнюю программу php.Само устройство 7 -канальная розетка, работающая через COM-порт.
Понятно, что можно переписать код действующего скрипта, но пока хватит вызова внешней программы с обработкой стандартного вывода.
-
вопрос не о чем, что за устройство, как подключено? `
Не важно какое устройство - цель не заменить код (php), а просто вызывать внешнюю программу php.Само устройство 7 -канальная розетка, работающая через COM-порт.
Понятно, что можно переписать код действующего скрипта, но пока хватит вызова внешней программы с обработкой стандартного вывода. `
Php скрипт то как данные принимает? -
Есть устройство, которое включается-выключается php-скриптом.
Можно ли создать это устройство в iobroker подключив через драйвер javascript?
Покажите пример пожалуйста.
Какие есть другие варианты? (При условии что внешний скрипт это "черный ящик",- исходный код не доступен). `
Если скрипт отдает какое то одно значениеcreateState ( 'blabla','' ); var request = require ( 'request' ); request ('http://192.168.1.11/script.php', function ( error, response, body ) { if ( !error && response.statusCode == 200 ) { setState ( blabla, body ); } });
-
вопрос не о чем, что за устройство, как подключено? `
Не важно какое устройство - цель не заменить код (php), а просто вызывать внешнюю программу php.Само устройство 7 -канальная розетка, работающая через COM-порт.
Понятно, что можно переписать код действующего скрипта, но пока хватит вызова внешней программы с обработкой стандартного вывода.
Php скрипт то как данные принимает?
Всё таки толкаете меня по пути перезаписи кода?` > $port=$argv[1];
$act=$argv[2];
if ($act == 1)
$act = "ON";
else
$act = "OFF" ;
$device="/dev/ttyUSB1";
exec('/bin/stty -F '.$device.' cs8 9600 -crtscts -parenb -cstopb');
// Open port
$fp = fopen($device, "r+");
if (!$fp) {
echo "Error opening port, try attempt 2";
sleep(1000);
$fp = fopen($device, "r+");
if (!$fp) {
echo "Error opening port, try attemp 3";
sleep(1000);
$fp = fopen($device, "r+");
if (!$fp) {
echo "Error opening port. Contact admin";
die();
}
}
}
function myread_port() {
$myresult = '';
$myc = '';
global $fp;
stream_set_blocking($fp,0);
$timeout=microtime(1)+0.5;
while (microtime(1)<$timeout) {
$myc=fgetc($fp);
if($myc === false){
usleep(5);
continue;
}
$myresult .= $myc;
}
return $myresult;
}
$cmd="#PWD123456#"."OUT".$port."=".$act."\r";
echo "\n$cmd\n";
fwrite($fp, $cmd);
$result = myread_port();
echo "$result"; `
-
Не важно какое устройство - цель не заменить код (php), а просто вызывать внешнюю программу php.
Само устройство 7 -канальная розетка, работающая через COM-порт.
Понятно, что можно переписать код действующего скрипта, но пока хватит вызова внешней программы с обработкой стандартного вывода.
Php скрипт то как данные принимает?
Всё таки толкаете меня по пути перезаписи кода? `
Костылей можно наделать, но все ровно придётся скрипт а ещё лучше драйвер если устройств несколько делать. Это устройство серийное?Вот так я временно дергал данные из базы и отправлял их в ioBroker(предварительно создаём переменную createState ( 'temp_in_bathroom2','' );) через драйвер simple-api
$result = $ab->select_line("SELECT dev_value temp_bathroom2 FROM tmp_".$temp_bathroom2['ListID']." WHERE ContID=".$temp_bathroom2['ContID']." ORDER BY dev_date DESC LIMIT 1"); $temp_bathroom2 = $result['temp_bathroom2']; $fp=fopen("http://192.168.1.11:8087/set/javascript.0.temp_in_bathroom2?value=$temp_bathroom2","r"); fclose($fp);
-
$cmd="#PWD123456#"."OUT".$port."=".$act."\r";
ну вот хоть какая то информация. просто выводи в ком порт команды из своего js скрипта
-
Есть устройство, которое включается-выключается php-скриптом.
Можно ли создать это устройство в iobroker подключив через драйвер javascript?
Покажите пример пожалуйста.
Какие есть другие варианты? (При условии что внешний скрипт это "черный ящик",- исходный код не доступен). `
Допустим есть два php скриптаhttp://someip/set.php?state=VALUE , где VALUE может быть "on" и "off"
и
http://someip/get.php который возвращает состояние устройства
Тогда скрипт будет выглядеть так:
var request = require('request'); var getURL = 'http://someip/get.php'; var setURL = 'http://someip/set.php?state='; // function for control blackbox function setBlackBox(value) { value = (value === 'on' || value === '1' || value === 1 || value === 'true' || value === true) ? 'on' : 'off'; request(setURL + value); } // function for read state of blackbox function pollValue() { request(getURL, function (error, response, body) { if (!error && response.statusCode == 200) { setState('blackBox', (body.indexOf('1') !== -1 || body.indexOf('on') !== -1), true); } }); } // after that the state is created function start() { // poll every 10 seconds the state schedule('*/10 * * * * *'/* every 10 seconds */, function () { pollValue(); }); // or just // setInterval(pollValue, 10000); // subscribe to detect control actions on({id: 'blackBox', change: 'any'}, function (obj) { if (!obj.state.ack) { setBlackBox(obj.state.val); } }); } // simple way to create createState('blackBox', start); // OR // createState( // 'blackBox', // ID of variable. In this case ID will be javascript.0.blackBox // false, // Initial value // false, // Force creation, even if exist (to overwrite description) // { // name: 'My black box', // Full text name of variable // type: 'boolean', // type of variable: number, string, boolean, array, object, mixed, file // role: 'switch' // you can see possible roles here https://github.com/ioBroker/ioBroker/blob/master/doc/SCHEMA.md#state-commonrole // }, // null, // you can define here user specific object // start); // go after creation
-
А не проще?
exec - execute some OS command, like "cp file1 file2" exec (cmd, callback)
Пример:
exec ('/home/smarthome/scripts/com_port.php');
-
А не проще?
exec - execute some OS command, like "cp file1 file2" exec (cmd, callback)
Пример:
exec ('/home/smarthome/scripts/com_port.php'); `
Отлично! Этот вариант работает.
Следующий вопрос - зная как включать-выключать устройство через вызов внешней программы - как создать устройство
чтобы его можно было подключить в vis-е к элементу "Bulb on/off"?
-
А не проще?
exec - execute some OS command, like "cp file1 file2" exec (cmd, callback)
Пример:
exec ('/home/smarthome/scripts/com_port.php'); `
Отлично! Этот вариант работает.
Следующий вопрос - зная как включать-выключать устройство через вызов внешней программы - как создать устройство
чтобы его можно было подключить в vis-е к элементу "Bulb on/off"? `
Я же написал. Тебе только надо подправить функцию setBlackBox и выбросить поллинг// function for control blackbox function setBlackBox(value) { exec ('/home/smarthome/scripts/com_port.php'); } // after that the state is created function start() { // subscribe to detect control actions on({id: 'blackBox', change: 'any'}, function (obj) { if (!obj.state.ack) { setBlackBox(obj.state.val); } }); } // simple way to create createState('blackBox', start);
-
Простой вызов exec отрабатывается, скрипт запускается (без функций и логики).
К элементу bulb назначил javascript.0.gsm7_1. В vis-e при клике статус меняется, но скрипты не запускаются.
Код:
function set_gsm_7_1_Off(value) { exec ('/usr/bin/php -f /var/www/scripts/roz.php 1 0'); } function set_gsm_7_1_On(value) { exec ('/usr/bin/php -f /var/www/scripts/roz.php 1 1'); } // after that the state is created function start() { // subscribe to detect control actions on({id: 'gsm7_1', change: 'any'}, function (obj) { if (obj.state.ack === true) { set_gsm_7_1_On(obj.state.val); } if (obj.state.ack === false) { set_gsm_7_1_Off(obj.state.val); } }); } // simple way to create createState('gsm7_1', start);
-
Рабочий код:
function set_gsm_7_1(value) { if (value === true) { exec ('/usr/bin/php -f /var/www/scripts/roz.php 1 1'); } if (value === false) { exec ('/usr/bin/php -f /var/www/scripts/roz.php 1 0'); } } // after that the state is created function start() { // subscribe to detect control actions on({id: 'gsm7_1', change: 'any'}, function (obj) { if (!obj.state.ack ) { console.log('Val: ' + obj.state.val); set_gsm_7_1(obj.state.val); } }); } // simple way to create createState('gsm7_1', start);