Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Русский
    3. ioBroker
    4. ioBroker драйвера
    5. Драйвер Mqtt + Arduino

    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

    Драйвер Mqtt + Arduino

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

      @electric69:

      Для этого в брокере есть ack.. По умолчанию, всё что приходит от клиента имеет ack=true. Всё, что уходит от брокера ack=false. Таким образом можно различать команды и статусы.

      Эээ, все равно чот не понял как это работает))

      Можно чуть подробнее для особо-одаренных? :oops: `
      На ардуине есть 3 переменные:

      • arduino/out/temperature - актуальная температура

      • arduino/in/light - вкл/выкл света. Причем управляться может, как локально (на ардуине), так и чз ioBroker.

      • arduino/in/interval - как часто надо слать температуру

      Так вот при соединении ардуина всегда шлёт все свои данные, как in, так и out, кроме настроек (interval). Они все в брокере помечаются флагом ack=true. То есть статус подтверждён конечным устройством. Эти данные обратно к ардуине не отсылаются, т.к. флаг true. Да даже если перешлются, то ничего не случится, кроме как включится включенный свет.

      Потом ардуина подписывается на все команды in, то есть````
      subscribe("arduino/in/#")

      subscribe("arduino/in/interval")

      
      Как только в ioBroker в vis нажали кнопку, записывается статус с ack=false. mqtt сервер видит, что пришел статус с ack=false, значит это команда, а не статус и надо отослать это клиенту. Клиент тупо исполняет всё, что приходит от брокера и не надо in и out.
      
      Теперь в игру вступает установка "Выдавать собственные значения при старте:". Т.к клиент подписался в течении 2х секунд после соединения на "arduino/in/#" и "arduino/in/interval", то он получит свои собственные значения обратно и "arduino/in/interval" тоже. Причем если "arduino/in/interval" не существовал раньше на брокере, то придёт значение "null" и его нужно проигнорировать, а если существовал, то придёт нормальное значение, которое нужно принять к сведению и использовать.
      
      ~~@electric69:~~ 
      
      > Я имел ввиду сам, т.е. без участия клиетов (ардуин)… `  
      А вот здесь уже не понял я.. Я так понимаю загвоздка в слове "публиковать".
      
      Что ты подразумеваешь под этим словом?
      
      Я понимаю - "publish", то есть отсылать данные клиентам… А если это так, то как можно отсылать данные клиентам без клиентов (ардуин) ? :)
      1 Reply Last reply Reply Quote 0
      • Bluefox
        Bluefox last edited by

        @electric69:

        Самое интересное, что начинает слать "все" только при рестарте ардуины (при коннекте).

        Следующие паблиши идут нормально: `
        Настройка "Выдавать собственные значения при старте:".

        Это сделано для того, что бы клиент имел возможность получить список переменных.

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

          @Bluefox:

          Теперь в игру вступает установка "Выдавать собственные значения при старте:". Т.к клиент подписался в течении 2х секунд после соединения на "arduino/in/#" и "arduino/in/interval", то он получит свои собственные значения обратно и "arduino/in/interval" тоже. Причем если "arduino/in/interval" не существовал раньше на брокере, то придёт значение "null" и его нужно проигнорировать, а если существовал, то придёт нормальное значение, которое нужно принять к сведению и использовать. `
          Так, вот тут еще немного подробнее.

          Я понимаю так. Ардуина подписывается на переменную интервал опроса - она получит эту переменную только в случае её изменения в ioBroker, т.е. делаем на работающей системе рестарт ардуины, в её программе этот интервал сбрасывается на "по-умолчанию" - на ноль (переинициализируется) и все - труба… В зависимости от кода в ардуине - она может начать DDOS на ioBroker)))

          Если в настройках адаптера поставить галочку "Выдавать собственные значения при старте", то при рестарте ардуины, кроме сброса интервала, будет реконнект к MQTT-брокеру, который перешлет данные, на которые подписана ардуина (интервал), даже если они не поменялись - так? И интервал станет нормальным и будут все счастливы...

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

            Добавить в настройки Настройка времени квантования, если тебе нужен этот интервал

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

              @instalator:

              Добавить в настройки Настройка времени квантования, если тебе нужен этот интервал `
              Ммм, сам протокол MQTT не подразумевает такой настройки вроде, тем более это время может быть разное для разных клиентов, для каких то вообще нет необходимости в этой настройке…

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

                @electric69:

                @instalator:

                Добавить в настройки Настройка времени квантования, если тебе нужен этот интервал Ммм, сам протокол MQTT не подразумевает такой настройки вроде, тем более это время может быть разное для разных клиентов, для каких то вообще нет необходимости в этой настройке…

                А причем тут протокол? Речь про драйвер, можнос делать визуальную настройку для каких id задать время квантования (опроса)

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

                  @instalator:

                  А причем тут протокол? Речь про драйвер `
                  Эээ, драйвер именно который адаптер MQTT в среде ioBroker?

                  Действительно, причем тут MQTT :?
                  @instalator:

                  можнос делать визуальную настройку для каких id задать время квантования (опроса) `
                  В каком смысле id? В MQTT есть топики, паблиши и подписки.

                  З.Ы. Я маленько не понял вашу идею))

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

                    @electric69:

                    @instalator:

                    можнос делать визуальную настройку для каких id задать время квантования (опроса) `
                    В каком смысле id? В MQTT есть топики, паблиши и подписки.

                    З.Ы. Я маленько не понял вашу идею)) `
                    Ну варианты разные есть, например брокер будет слать строку клинету с переменной задержки, думаю получить клиенту ее и распарсить нет проблем…

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

                      Меня вот больше беспокоит, при подключении клиента как данные актуальные передать, чтоб брокер не скидывал их в "0"

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

                        Сделал вот так себе:
                        266_44444.png
                        При перезагрузке ардуино переменные сбрасываются, надо либо с кодом помудрить либо как то отсекать такие сбросы при инициализации на стороне брокера чтобы в историю эти данные не попадали.

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

                          @instalator:

                          Ну варианты разные есть, например брокер будет слать строку клинету с переменной задержки, думаю получить клиенту ее и распарсить нет проблем… `
                          Если ioBroker как MQTT-брокер, но он отправит только в 2 вариантах:

                          1. клиент подключен, подписан на переменную и она изменилась (и при условии ack=false),

                          2. клиент только что подключился и подписан на эту переменную - брокер отправит её значение (если установлена в настройках галочка "Выдавать собственные значения при старте")

                          Если я правильно все понял. :oops:
                          @instalator:

                          При перезагрузке ардуино переменные сбрасываются, надо либо с кодом помудрить либо как то отсекать такие сбросы при инициализации на стороне брокера чтобы в историю эти данные не попадали. `
                          В скетче надо составлять условия и публиковать только достоверные данные.

                          Я сейчас занимаюсь отладкой скетча, скоро выложу…

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

                            @electric69:

                            В скетче надо составлять условия и публиковать только достоверные данные.

                            Я сейчас занимаюсь отладкой скетча, скоро выложу… `
                            Посмотрим на твое решение) Я уже два клиента практически допилил
                            1547_wohnung.jpg

                            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? переменные удалил а папки немогу `
                                Хмм, я удаляю все топики из папки и она сама исчезает)

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

                                  @electric69:

                                  @instalator:

                                  Как бы удалить левые данные из объектов mqtt? переменные удалил а папки немогу Хмм, я удаляю все топики из папки и она сама исчезает)
                                  Точно! Спасибо.

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

                                    Погонял у себя систему пару ночей, вроде больше не сбоит.

                                    Датчики реальные не стал подключать, просто передавал данные АЦП по портам А0, А1, А2. Вставил в них проводочки (антеннки) чтобы показания "прыгали".

                                    Настройки адаптера прикрепил.

                                    Скетч прикрепил, данные в ioBroker появятся автоматически, надо только поменять настройки в тексте программы.

                                    BlueFox, немцам там тоже закинь удочку, пускай протестируют…

                                    Сейчас хочу попробовать поуправлять дискреткой.
                                    50_pic_121.jpg
                                    50_pic_120.jpg
                                    50_plc1_sendvaluesensors.7z
                                    50_plc1_sendvaluesensors_eng.7z

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

                                      @instalator:

                                      Меня вот больше беспокоит, при подключении клиента как данные актуальные передать, чтоб брокер не скидывал их в "0" `
                                      Можешь привести лог, когда переменные сбрасываются… Не могут они сбрасываться. Если переменная уже существует, то в неё запишется принятое от клиента значение (значит клиент сам сбрасывает на ноль). Если переменная не существует и значение клиент не передал, но подписаться на неё хочет, то создаться переменная со значением "null" как строка.

                                      Но это произойдёт только один раз и только если клиент никакого значения не предоставил.

                                      "null" можно элементарно отсечь на клиенте.

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

                                        @Bluefox:

                                        @instalator:

                                        Меня вот больше беспокоит, при подключении клиента как данные актуальные передать, чтоб брокер не скидывал их в "0" `
                                        Можешь привести лог, когда переменные сбрасываются… Не могут они сбрасываться. Если переменная уже существует, то в неё запишется принятое от клиента значение (значит клиент сам сбрасывает на ноль). Если переменная не существует и значение клиент не передал, но подписаться на неё хочет, то создаться переменная со значением "null" как строка.

                                        Но это произойдёт только один раз и только если клиент никакого значения не предоставил.

                                        "null" можно элементарно отсечь на клиенте. `
                                        Ниже сообщение юзера instalator (15.05.2015, 19:09) что сбрасываются переменные при рестарте ардуины.

                                        Предположу что при инициализации переменных в скетче они устанавливаются в ноль и публикуются не первой итерации (цикле), затем цикл проходит место актуализации переменных и данные идут нормальные.

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

                                          @electric69:

                                          Погонял у себя систему пару ночей, вроде больше не сбоит.

                                          Датчики реальные не стал подключать, просто передавал данные АЦП по портам А0, А1, А2. Вставил в них проводочки (антеннки) чтобы показания "прыгали".

                                          Настройки адаптера прикрепил.

                                          Скетч прикрепил, данные в ioBroker появятся автоматически, надо только поменять настройки в тексте программы.

                                          BlueFox, немцам там тоже закинь удочку, пускай протестируют…

                                          Сейчас хочу попробовать поуправлять дискреткой. `
                                          Супер. Только можно подправить две вещи:
                                          ! ````
                                          /*
                                          Arduino controller, MQTT-client for ioBroker. Use MQTT Adapter as server in ioBroker (at least 0.2.4)
                                          IP address: 192.168.69.71
                                          Platform: Arduino UNO R3 + EthernetShield W5100
                                          IDE: 1.0.5-r2
                                          Date: 15.05.2015
                                          Version: 0.1
                                          License: MIT, Copyright 2015 electric69


                                          It is test sketch. Following analog inputs will be polled: pinA0, pinA1, pinA2. Values have type int (Analog from 0...1023).
                                          Client ID, and root name "arduinoPLC71".
                                          Following topics will be created automatically in ioBorker by start:
                                          1. "arduinoPLC71/status" - status of arduino controller (online, error)
                                          2. "arduinoPLC71/pollTimer" - send/publish intervall (client is subscribed on this value)
                                          3. "arduinoPLC71/sensorA0/value" - group sensorA0, measurement result
                                          4. "arduinoPLC71/sensorA0/status" - group sensorA0, sensor state (ОК, error)
                                          5. analogically for groups sensorA1 and sensorA2.

                                          ! After the controller is started following happens:

                                          • Set the MAC and static IP of own ethernet driver
                                            При старте настраивается сетевое соединение (MAC-адрес и статический IP адрес),
                                          • Init of serial port for output of debug information

                                          ! During main loop:

                                          • If not connected, try to connect to MQTT Broker
                                          • If connected poll every X seconds the analog ports and publish them after that
                                          • If the analog port data was read with errors, it (or error code) will be reported in the topic "arduinoPLC71/sensorA0/status" for group sensorA0. Accordingly for other groups.
                                            **/
                                            //------------------------------------------ Libraries ------------------------------------------//
                                            //Use libraries
                                            #include <spi.h>#include <ethernet.h>#include <pubsubclient.h>//https://github.com/knolleary/pubsubclient
                                            //---------------------------------------- End libraries ----------------------------------------//

                                          ! //------------------------------------------- Ethernet ------------------------------------------//
                                          //Global constants for network connection: MAC, Own IP, MQTT Broker IP
                                          byte mac[] = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0x71 };
                                          byte mqttserver[] = { 192, 168, 69, 51 };
                                          byte ip[] = { 192, 168, 69, 71 };
                                          EthernetClient ethClient;
                                          PubSubClient client(mqttserver, 1883, callback, ethClient);
                                          //----------------------------------------- End ethernet ----------------------------------------//
                                          ! //------------------------------------------- Sensors -------------------------------------------//
                                          int analogPinA0 = 0;
                                          int analogPinA1 = 1;
                                          int analogPinA2 = 2;
                                          int SensorA0 = 0;
                                          int SensorA1 = 0;
                                          int SensorA2 = 0;
                                          char buff[20];
                                          unsigned long lastTime = 0;
                                          unsigned long poolTime = 5; // Values publish interval: by default 5 seconds
                                          //----------------------------------------- End Sensors -----------------------------------------//
                                          ! //###############################################################################################//
                                          //########################################## Functions ##########################################//
                                          //###############################################################################################//
                                          ! //------------------------------------------- Callback -----------------------------------------//
                                          // process publishes from MQTT broker
                                          void callback(char* topic, byte* payload, unsigned int length) {
                                          Serial.println ("");
                                          Serial.println ("-------");
                                          Serial.println ("New callback of MQTT-broker");
                                          // Convert name(topic) and value (payload) to string
                                          payload[length] = '\0';
                                          String strTopic = String(topic);
                                          String strPayload = String((char*)payload);
                                          // Ignore "null" values from broker
                                          if (strPayload == "null") return;
                                          //Convert string to integer
                                          poolTime = strPayload.toInt();
                                          Serial.print (strTopic);
                                          Serial.print (" ");
                                          Serial.println (poolTime);
                                          Serial.println ("-------");
                                          Serial.println ("");
                                          }
                                          //----------------------------------------- End callback ---------------------------------------//
                                          ! //------------------------------------------ Void setup ----------------------------------------//
                                          void setup() {
                                          Serial.begin(9600);
                                          Serial.println("Start mqtt-client controller arduinoPLC7...");
                                          //стартуем сетевое подключение
                                          Ethernet.begin(mac, ip);
                                          Serial.print("PLC's IP: ");
                                          Serial.println(Ethernet.localIP());
                                          }
                                          //---------------------------------------- End void setup --------------------------------------//
                                          ! //------------------------------------------ Void loop -----------------------------------------//
                                          void loop() {
                                          client.loop(); //check publishes from broker
                                          // If no connection
                                          if (!client.connected()) {
                                          Serial.print("Connect to MQTT-boker... ");
                                          //Try to connect
                                          if (client.connect("arduinoPLC71")) {
                                          Serial.println("success");
                                          client.publish("arduinoPLC71/status","online");
                                          client.subscribe("arduinoPLC71/pollTimer");
                                          // ------------------------ CHANGED START -------------------------
                                          // Force send of values to broker
                                          lastTime = 0;
                                          // ------------------------ CHANGED END ---------------------------
                                          }
                                          else {
                                          Serial.println("failed!");
                                          }
                                          } else
                                          //If connected
                                          //Read every "poolTime" seconds the values and send to broker
                                          if(!lastTime || millis() > (lastTime + poolTime*1000)) {
                                          lastTime = millis();
                                          Serial.println(" ");
                                          //read the data and publish it
                                          SensorA0 = analogRead(analogPinA0);
                                          sprintf(buff,"%d",SensorA0); //if float dtostrf(SensorA0, 5, 2, buff);
                                          Serial.print("Publish to MQTT-broker value sensor A0 is: ");
                                          Serial.println(buff);
                                          client.publish("arduinoPLC71/sensorA0/value",buff);
                                          client.publish("arduinoPLC71/sensorA0/status","OK");
                                          SensorA1 = analogRead(analogPinA1);
                                          sprintf(buff,"%d",SensorA1); //if float dtostrf(SensorA0, 5, 2, buff);
                                          Serial.print("Publish to MQTT-broker value sensor A1 is: ");
                                          Serial.println(buff);
                                          client.publish("arduinoPLC71/sensorA1/value",buff);
                                          client.publish("arduinoPLC71/sensorA1/status","OK");
                                          SensorA2 = analogRead(analogPinA2);
                                          sprintf(buff,"%d",SensorA2); //if float dtostrf(SensorA0, 5, 2, buff);
                                          Serial.print("Publish to MQTT-broker value sensor A2 is: ");
                                          Serial.println(buff);
                                          client.publish("arduinoPLC71/sensorA2/value",buff);
                                          client.publish("arduinoPLC71/sensorA2/status","OK");
                                          //--------
                                          }
                                          }
                                          //---------------------------------------- End void loop ---------------------------------------//</pubsubclient.h></ethernet.h></spi.h>

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

                                            @electric69:

                                            Погонял у себя систему пару ночей, вроде больше не сбоит.

                                            Датчики реальные не стал подключать, просто передавал данные АЦП по портам А0, А1, А2. Вставил в них проводочки (антеннки) чтобы показания "прыгали".

                                            Настройки адаптера прикрепил.

                                            Скетч прикрепил, данные в ioBroker появятся автоматически, надо только поменять настройки в тексте программы.

                                            BlueFox, немцам там тоже закинь удочку, пускай протестируют…

                                            Сейчас хочу попробовать поуправлять дискреткой. `
                                            У меня с аналоговых тоже отдаются нормальные показания, только вот с датчика DHT22 при первой отправке улетают "0"

                                            Дискретка у меня вроде работает норм, управление сервоприводом наладил. Перепрошил свой контроллер света вроде работает даже постабильнее и с меньшими задержками.

                                            Спасибо что подтолкнули в сторону этого протокола

                                            Пожайлуй тоже выкладу свой г…код))
                                            266_bedroom_mqtt.rar

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            634
                                            Online

                                            31.8k
                                            Users

                                            80.0k
                                            Topics

                                            1.3m
                                            Posts

                                            18
                                            244
                                            65717
                                            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