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.
    • 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
                                • I
                                  instalator last edited by

                                  После обновлнеия ничего не работает. Верните прошлую версия все отлично работало

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

                                    @instalator:

                                    После обновлнеия ничего не работает. Верните прошлую версия все отлично работало `
                                    Не может ВСЁ не работать. Я поменял всего 2 строчки.

                                    • Если маска не задана, то выдавать все состояния

                                    • Поменял имена топиков

                                    Можно посмотреть здесь: https://github.com/ioBroker/ioBroker.mq … 631839fa1a

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

                                      @Bluefox:

                                      @instalator:

                                      После обновлнеия ничего не работает. Верните прошлую версия все отлично работало `
                                      Не может ВСЁ не работать. Я поменял всего 2 строчки.

                                      • Если маска не задана, то выдавать все состояния

                                      • Поменял имена топиков

                                      Можно посмотреть здесь: https://github.com/ioBroker/ioBroker.mq … 631839fa1a `
                                      Раньше такая строка отправлялась от брокера: myhome/Bedroom/Servo

                                      Сейчас: mqtt/0/myhome/Bedroom/Servo

                                      Предлагаю вернуть как было

                                      Я так понял префикс добавили, може предусмтореть настройку без префикса)

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

                                        Попробуй снова

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

                                          @Bluefox:

                                          Попробуй снова `
                                          Работает.

                                          Получается сейчас если префикс не указан то без него шлется?

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

                                            Да. Так и есть.

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            772
                                            Online

                                            31.8k
                                            Users

                                            80.0k
                                            Topics

                                            1.3m
                                            Posts

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