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.
    • 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

                        673
                        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