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); -
Есть устройство, которое включается-выключается 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'); `
Отлично! Этот вариант работает.
Следующий вопрос - зная как включать-выключать устройство через вызов внешней программы - как создать устройство
чтобы его можно было подключить в 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);
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden