Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Русский
    3. ioBroker
    4. ioBroker драйвера
    5. Как подключить устройство, включающееся внешним скрипт (php)?

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Как подключить устройство, включающееся внешним скрипт (php)?

    This topic has been deleted. Only users with topic management privileges can see it.
    • A
      andrey99986 last edited by

      Есть устройство, которое включается-выключается php-скриптом.

      Можно ли создать это устройство в iobroker подключив через драйвер javascript?

      Покажите пример пожалуйста.

      Какие есть другие варианты? (При условии что внешний скрипт это "черный ящик",- исходный код не доступен).

      1 Reply Last reply Reply Quote 0
      • V
        Vlad_k last edited by

        вопрос не о чем, что за устройство, как подключено?

        1 Reply Last reply Reply Quote 0
        • A
          andrey99986 last edited by

          @Vlad_k:

          вопрос не о чем, что за устройство, как подключено? `
          Не важно какое устройство - цель не заменить код (php), а просто вызывать внешнюю программу php.

          Само устройство 7 -канальная розетка, работающая через COM-порт.

          Понятно, что можно переписать код действующего скрипта, но пока хватит вызова внешней программы с обработкой стандартного вывода.

          1 Reply Last reply Reply Quote 0
          • I
            instalator last edited by

            @andrey99986:

            @Vlad_k:

            вопрос не о чем, что за устройство, как подключено? `
            Не важно какое устройство - цель не заменить код (php), а просто вызывать внешнюю программу php.

            Само устройство 7 -канальная розетка, работающая через COM-порт.

            Понятно, что можно переписать код действующего скрипта, но пока хватит вызова внешней программы с обработкой стандартного вывода. `
            Php скрипт то как данные принимает?

            1 Reply Last reply Reply Quote 0
            • H
              Haus last edited by

              @andrey99986:

              Есть устройство, которое включается-выключается 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 );
                      }
              });
              
              
              1 Reply Last reply Reply Quote 0
              • A
                andrey99986 last edited by

                @instalator:

                @andrey99986:

                @Vlad_k:

                вопрос не о чем, что за устройство, как подключено? `
                Не важно какое устройство - цель не заменить код (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"; `

                1 Reply Last reply Reply Quote 0
                • H
                  Haus last edited by

                  @andrey99986:

                  @instalator:

                  @andrey99986:

                  Не важно какое устройство - цель не заменить код (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);
                  
                  
                  1 Reply Last reply Reply Quote 0
                  • V
                    Vlad_k last edited by

                    $cmd="#PWD123456#"."OUT".$port."=".$act."\r";

                    ну вот хоть какая то информация. просто выводи в ком порт команды из своего js скрипта

                    1 Reply Last reply Reply Quote 0
                    • Bluefox
                      Bluefox last edited by

                      @andrey99986:

                      Есть устройство, которое включается-выключается 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
                      
                      1 Reply Last reply Reply Quote 0
                      • V
                        vtec last edited by

                        А не проще?

                        exec - execute some OS command, like "cp file1 file2"
                        exec (cmd, callback)
                        

                        Пример:

                        exec ('/home/smarthome/scripts/com_port.php');

                        1 Reply Last reply Reply Quote 0
                        • A
                          andrey99986 last edited by

                          @vtec:

                          А не проще?

                          exec - execute some OS command, like "cp file1 file2"
                          exec (cmd, callback)
                          

                          Пример:

                          exec ('/home/smarthome/scripts/com_port.php'); `

                          Отлично! Этот вариант работает.

                          Следующий вопрос - зная как включать-выключать устройство через вызов внешней программы - как создать устройство

                          чтобы его можно было подключить в vis-е к элементу "Bulb on/off"?

                          1 Reply Last reply Reply Quote 0
                          • Bluefox
                            Bluefox last edited by

                            @andrey99986:

                            @vtec:

                            А не проще?

                            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);
                            
                            
                            1 Reply Last reply Reply Quote 0
                            • A
                              andrey99986 last edited by

                              Простой вызов 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);
                              
                              1 Reply Last reply Reply Quote 0
                              • A
                                andrey99986 last edited by

                                Рабочий код:

                                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);
                                
                                1 Reply Last reply Reply Quote 0
                                • First post
                                  Last post

                                Support us

                                ioBroker
                                Community Adapters
                                Donate

                                885
                                Online

                                31.8k
                                Users

                                80.0k
                                Topics

                                1.3m
                                Posts

                                6
                                14
                                2066
                                Loading More Posts
                                • Oldest to Newest
                                • Newest to Oldest
                                • Most Votes
                                Reply
                                • Reply as topic
                                Log in to reply
                                Community
                                Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                The ioBroker Community 2014-2023
                                logo