Skip to content
  • Home
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Русский
  3. аппаратные средства
  4. Железо
  5. Интеграция Arduino по сети Ethernet в ioBroker через адаптер simple-api

NEWS

  • Monatsrückblick Januar/Februar 2026 ist online!
    BluefoxB
    Bluefox
    18
    1
    680

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    18
    1
    5.7k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    1.5k

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

Scheduled Pinned Locked Moved Железо
12 Posts 4 Posters 4.6k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • E Offline
    E Offline
    electric69
    wrote on last edited by
    #1

    Привет всем.

    Можно интегрировать контроллер на базе платформы 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
    0
    • I Offline
      I Offline
      instalator
      wrote on last edited by
      #2

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

      Высокий уровень Децибел вреден для здоровья!

      http://blog.instalator.ru/

      1 Reply Last reply
      0
      • E Offline
        E Offline
        electric69
        wrote on last edited by
        #3

        @instalator:

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

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

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

        ИМХО.

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

        1 Reply Last reply
        0
        • I Offline
          I Offline
          instalator
          wrote on last edited by
          #4

          @electric69:

          @instalator:

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

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

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

          ИМХО.

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

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

          Высокий уровень Децибел вреден для здоровья!

          http://blog.instalator.ru/

          1 Reply Last reply
          0
          • rw6miuR Offline
            rw6miuR Offline
            rw6miu
            wrote on last edited by
            #5

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

            В общем есть сабж 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
            0
            • rw6miuR Offline
              rw6miuR Offline
              rw6miu
              wrote on last edited by
              #6

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

              Если что-то хочешь, бери и делай! Сомневаться некогда.

              1 Reply Last reply
              0
              • P Offline
                P Offline
                Pooh
                wrote on last edited by
                #7

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

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

                https://play.google.com/store/apps/details?id=com.roy.royclub - код: UMI201155
                https://play.google.com/store/apps/details?id=com.blockchainvault - код приглашения: Freepooh
                https://play.google.com/store/apps/details?id=games.bee.app - код приглашения: freepooh
                https://www.timestope.com/freepooh - witness code: freepooh

                1 Reply Last reply
                0
                • rw6miuR Offline
                  rw6miuR Offline
                  rw6miu
                  wrote on last edited by
                  #8

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

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

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

                  Если что-то хочешь, бери и делай! Сомневаться некогда.

                  1 Reply Last reply
                  0
                  • P Offline
                    P Offline
                    Pooh
                    wrote on last edited by
                    #9

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

                    как-то так:

                    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 () {
                    
                        });
                    
                    });
                    
                    

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

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

                    https://play.google.com/store/apps/details?id=com.roy.royclub - код: UMI201155
                    https://play.google.com/store/apps/details?id=com.blockchainvault - код приглашения: Freepooh
                    https://play.google.com/store/apps/details?id=games.bee.app - код приглашения: freepooh
                    https://www.timestope.com/freepooh - witness code: freepooh

                    1 Reply Last reply
                    0
                    • rw6miuR Offline
                      rw6miuR Offline
                      rw6miu
                      wrote on last edited by rw6miu
                      #10

                      @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
                      0
                      • rw6miuR 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 Offline
                        P Offline
                        Pooh
                        wrote on last edited by
                        #11

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

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

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

                        https://play.google.com/store/apps/details?id=com.roy.royclub - код: UMI201155
                        https://play.google.com/store/apps/details?id=com.blockchainvault - код приглашения: Freepooh
                        https://play.google.com/store/apps/details?id=games.bee.app - код приглашения: freepooh
                        https://www.timestope.com/freepooh - witness code: freepooh

                        rw6miuR 1 Reply Last reply
                        0
                        • P Pooh

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

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

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

                          rw6miuR Offline
                          rw6miuR Offline
                          rw6miu
                          wrote on last edited by
                          #12

                          Участник @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
                          0

                          Hello! It looks like you're interested in this conversation, but you don't have an account yet.

                          Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

                          With your input, this post could be even better 💗

                          Register Login
                          Reply
                          • Reply as topic
                          Log in to reply
                          • Oldest to Newest
                          • Newest to Oldest
                          • Most Votes


                          Support us

                          ioBroker
                          Community Adapters
                          Donate

                          229

                          Online

                          32.7k

                          Users

                          82.6k

                          Topics

                          1.3m

                          Posts
                          Community
                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                          ioBroker Community 2014-2025
                          logo
                          • Login

                          • Don't have an account? Register

                          • Login or register to search.
                          • First post
                            Last post
                          0
                          • Home
                          • Recent
                          • Tags
                          • Unread 0
                          • Categories
                          • Unreplied
                          • Popular
                          • GitHub
                          • Docu
                          • Hilfe