Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Русский
    3. аппаратные средства
    4. Железо
    5. Интеграция Arduino по сети Ethernet в ioBroker через адаптер simple-api

    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

    Интеграция Arduino по сети Ethernet в ioBroker через адаптер simple-api

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

      Привет всем.

      Можно интегрировать контроллер на базе платформы Arduino в ioBroker с помощью MQTT и адаптера Node-red…

      Если эти варианты вас не устраивают, читаем дальше))

      В составе ioBroker имеется драйвер https://github.com/ioBroker/ioBroker.simple-api, с его помощью можно получить информацию о состоянии оборудования/переменных сервера и даже управлять, передавать данные.

      Для примера приведу описание системы: имеется контроллер Arduino (UNO/Mega/etc) с шилдом ethernet.

      На цифровой pin-9 подключена кнопка с программной подтяжкой к +5В. На цифровой pin-8 реле или другой механизм.

      Нажатием кнопки (при переходе 1->0) в программе изменяется состояние реле на противоположное. Нажали один раз - свет включился, нажали еще раз - выключился, еще раз - включился и т.д.

      Так же состоянием реле можно управлять из визуализации (адаптер VIS) где отображается состояние и реле и кнопки.

      На сервере крутится скрипт, который создает переменные кнопки и реле. При нажатии кнопки на ардуине, контроллер отправляет новое состояние в ioBrooker GET-запросом.

      Если состояние реле поменялось по нажатию кнопки, ардуина так же отправляет GET-запрос. Если в VIS-адаптере переключили состояние реле, то скрипт, подписанный на изменение переменной только из VIS, отправляет GET-запрос на ардуину и состояние реле меняется.

      Надеюсь не слишком сложно объяснил))

      Прошу протестировать…
      50_test02.zip

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

        Но зачем если есть mqtt? В чем преимущество?

        1 Reply Last reply Reply Quote 0
        • E
          electric69 last edited by

          @instalator:

          Но зачем если есть mqtt? В чем преимущество? `
          У меня возникли проблемы с отправкой большого объема данных в короткое время, ардуина начинала отваливаться и при этом данные терялись. При этом система очень динамична и потерянные данные уже через пару секунд могли оказаться не актуальными.

          Во-вторых, MQTT подразумевает постоянное соединение, HTTP - отправил и забыл…

          В третьих, у меня нет навыков/знаний чтобы искать глюки и разбираться в коде библиотек для ардуины и адаптера MQTT для ioBroker. HTTP в этом плане гораздо проще))

          ИМХО.

          Плюс к тому, не хотел бы чтобы пользователи смотрели на эту реализацию как "почему не MQTT?" - лучше как "О_о, нормальная альтернатива, запасной вариант, надо потренироваться и т.д."

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

            @electric69:

            @instalator:

            Но зачем если есть mqtt? В чем преимущество? `
            У меня возникли проблемы с отправкой большого объема данных в короткое время, ардуина начинала отваливаться и при этом данные терялись. При этом система очень динамична и потерянные данные уже через пару секунд могли оказаться не актуальными.

            Во-вторых, MQTT подразумевает постоянное соединение, HTTP - отправил и забыл…

            В третьих, у меня нет навыков/знаний чтобы искать глюки и разбираться в коде библиотек для ардуины и адаптера MQTT для ioBroker. HTTP в этом плане гораздо проще))

            ИМХО.

            Плюс к тому, не хотел бы чтобы пользователи смотрели на эту реализацию как "почему не MQTT?" - лучше как "О_о, нормальная альтернатива, запасной вариант, надо потренироваться и т.д." `
            Если мне память не изменяет в протоколе MQTT есть уровень важности (QoS). Надо почитать про MQTT, у меня небыло такой цели поэтому не заморачивался.

            BlueFox драйвер MQTT поддерживает QoS?

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

              Доброго времени суток. Судя по дате последнего сообщения эта тема никого не заинтересовала. Ну а мне хотелось-бы разобраться как осуществить предложенное в первом сообщении.

              В общем есть сабж http://majordomo.smartliving.ru/forum/v … 53f1cd99ba

              Работает без нареканий уже давно и необходимости на что то менять не вижу. Никакого mqtt в нем нет, обычные get запросы http.

              В мажордоме это работало хорошо. Но пришло время перехода на ioBroker. Так вот немного поковырявшись я научился ним управлять.

              Но как организовать обратную связь от устройства пока не пойму. Чувствую что надо через адаптер simple-api но как именно это сделать не соображу. Может кто подскажет какой скрипт нужен. Апи устройства прилагаю ниже.

              ! Протокол взаимодействия по HTTP
              ! Получение состояния реле
              ! HTTP-GET запрос вида
              ! http://megalight/state?c=get&n=1
              ! n - ID нужного реле (обязательный)
              ! Ответ: text/plain в виде
              ! 1;255
              ! где первое число - состояние (1 - вкл), второе - значение диммера
              ! Установка состояния реле
              ! HTTP-GET запрос вида
              ! http://megalight/state?c=set&n=1&o=1&v=200&t=30000
              ! http://megalight/state?c=set&n=1&i=10
              ! n - ID нужного реле (обязательный)
              ! o - состояние (1 - вкл, 0 - выкл)
              ! v - значение диммера (0-255)
              ! i - инкремент/декремент значения диммера (-255 по 255)
              ! t - таймаут в миллисекундах
              ! Ответ: пусто
              ! Получение состояния кнопки
              ! HTTP-GET запрос вида
              ! http://megalight/state?c=button&n=1
              ! n - ID нужной кнопки/выключателя (обязательный)
              ! Ответ: text/plain в виде
              ! 1
              ! состояние (1 - нажата, 0 - не нажата)

              ps. Я тут уточнил. Девайс сам отправляет get на сервер при изменении состояния выходов. Так вот как мне послушать этот ответ и сопоставить с моей переменной?

              Сейчас управление работает на вот таком скрипте:

              var url = 'http://192.168.0.89';
              var request = require('request');
              var options = {
                      	url: ''
                      };
              on({id: 'javascript.0.test', change: 'any'}, function (obj) {
                  if(obj.newState.val === 0){
              	options.url = url+'/state?c=set&n=7&o=1';
                  } else {
                  	options.url = url+'/state?c=set&n=7&o=0';
                  }
                  request(options, function (error, response, body) {
                      log('Ответ' + body);
                  });
              });
              
              

              И такой скрипт проверял тоже работает:

              on({id: 'javascript.0.Arduino1.DO', change: 'any'}, function (obj) {
                  if((obj.newState.from == 'web.0' || obj.newState.from == 'system.adapter.web.0' ) && obj.newState.val == '0'){
                      request ('http://192.168.0.89/state?c=set&n=7&o=0');
                  }
                  if((obj.newState.from == 'web.0' || obj.newState.from == 'system.adapter.web.0' ) && obj.newState.val == '1'){
                      request ('http://192.168.0.89/state?c=set&n=7&o=1');
                  }
              });
              

              Чувствую что в эти скрипты надо что-то добавить, но вот что?

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

                Добрый день. Апну темку. Вдруг поможет. Я сам пока не справился.

                1 Reply Last reply Reply Quote 0
                • P
                  Pooh last edited by

                  мегалайт нужно перешивать, ибо у simpleAPIдругой формат команд

                  либо поднимать сервер на скрипте

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

                    Ух ну тут я совсем не программист.

                    То есть Вы хотите сказать что без кардинальных вмешательств не получится полноценно подружить железку с сервером?

                    Или это можно сделать как то по другому?

                    1 Reply Last reply Reply Quote 0
                    • P
                      Pooh last edited by

                      Чисто скриптом делать

                      как-то так:

                      var http = require('http');
                      var server = http.createServer().listen(8091); // на каком порту слушаем?
                      
                      server.on('request', function (req, res) {
                          res.writeHead(200);
                          if (req.method == 'POST') { // или GET?
                              var body = '';
                          }
                      
                          req.on('data', function (data) {
                              body += data;
                              console.log(body);
                          });
                      
                          req.on('end', function () {
                      
                          });
                      
                      });
                      
                      

                      …и парсить полученную переменную

                      вопрос чисто программерский

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

                        @Pooh:

                        Чисто скриптом делать

                        как-то так: `
                        Спасибо за пинок в нужном направлении.

                        Итого инструкция получилась такая:

                        • 1. В скетче MegaLight указываем порт по которому контроллер будет отправлять запросы на сервер.
                        В итоге он слушает команды на стандартном 80-м порту а отправляет на том который укажем. 
                        
                        • 2. Создаём папку в модуле JavaScript с понятным именем (например MegaLight1).
                        • 3. В этой папке создаём скрипт для каждого канала реле. Обозвать можно как угодно чтоб понятно было к какому каналу он имеет отношение.
                        createState('MegaLight1.lightcenter', '');
                        on({id: 'javascript.0.MegaLight1.lightcenter', change: 'any'}, function (obj) {
                            if((obj.newState.from == 'web.0' || obj.newState.from == 'system.adapter.web.0' ) && obj.newState.val == '0'){
                                request ('http://192.168.120.25/state?c=set&n=3&o=0');
                            }
                            if((obj.newState.from == 'web.0' || obj.newState.from == 'system.adapter.web.0' ) && obj.newState.val == '1'){
                                request ('http://192.168.120.25/state?c=set&n=3&o=1');
                            }
                        });
                        
                        • 4. Там же создаём ещё один скрипт для получения обратной связи от контроллера.
                        var http = require('http');
                        var server = http.createServer().listen(8083); // на каком порту слушаем?
                        server.on('request', function(req, res) {
                             res.writeHead(200);
                             var getback = req.url;
                             var vars = getback.split("&"); 
                                for (var i=0;i<vars.length;i++) { 
                                   var pair = vars[i].split("="); 
                                }
                                if (vars[4] == 'on=1') {
                                    var state = 1;
                                     } else {
                                    var state = 0;
                                     }
                             if (vars[3] == 'id=1') {
                                 setState ('javascript.0.MegaLight1.braright', state);
                               } else if (vars[3] == 'id=2') {
                                 setState ('javascript.0.MegaLight1.braleft', state);
                               } else if (vars[3] == 'id=3') {
                                 setState ('javascript.0.MegaLight1.lightcenter', state);
                               } else if (vars[3] == 'id=4') {
                                 setState ('javascript.0.MegaLight1.lightdop', state);
                               }
                        log('Канал ' + vars[3] + ' Состояние-' +state)        
                        });
                        P 1 Reply Last reply Reply Quote 0
                        • P
                          Pooh @rw6miu last edited by

                          Участник @rw6miu написал в Интеграция Arduino по сети Ethernet в ioBroker через адаптер simple-api:

                          • 3. В этой папке создаём скрипт для каждого канала реле.
                          • 4. Там же создаём ещё один скрипт

                          Можно все реле/каналы и сервера в одном скрипте описать...

                          rw6miu 1 Reply Last reply Reply Quote 0
                          • rw6miu
                            rw6miu @Pooh last edited by

                            Участник @Pooh написал
                            Можно все реле/каналы и сервера в одном скрипте описать...

                            Можно конечно, но тогда чуток сложнее отлаживать и отслеживать работу скриптов. Исчезает возможность оперативно отключать их.
                            У меня сейчас другая проблема вылезла. Старая система благополучно умерла и была полностью переустановлена без возможности восстановления всего включая скрипты. Сейчас собираю обратно всё по крупицам. В итоге раньше у меня работали эти скрипты а теперь первый из них не работает. Причём если я из строки

                            if((obj.newState.from == 'web.0' || obj.newState.from == 'system.adapter.web.0' ) && obj.newState.val == '0'){
                            

                            выкидываю упоминание о web драйвере и оставляю

                            if(obj.newState.val == '0'){
                            

                            то скрипт начинает работать но происходит какая-то обратная связь со вторым скриптом и из за этого хаотичное включение и выключение света с очень быстрой скоростью.
                            Не пойму в чём проблема. Может в каких то настройках драйвера web.0. Раньше ведь всё работало.

                            1 Reply Last reply Reply Quote 0
                            • First post
                              Last post

                            Support us

                            ioBroker
                            Community Adapters
                            Donate

                            928
                            Online

                            31.8k
                            Users

                            80.0k
                            Topics

                            1.3m
                            Posts

                            4
                            12
                            3988
                            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