Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • 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

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

  1. ioBroker Community Home
  2. Русский
  3. ioBroker
  4. ioBroker драйвера
  5. Драйвер ioBroker MySensors

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.3k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.0k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.4k

Драйвер ioBroker MySensors

Geplant Angeheftet Gesperrt Verschoben ioBroker драйвера
106 Beiträge 13 Kommentatoren 32.6k Aufrufe
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • H Offline
    H Offline
    Haba
    schrieb am zuletzt editiert von
    #46

    Подскажите пожалуйста, из-за чего криво может ставится этот драйвер?

    саму ioBroker поставил и запустил раза с пятого :)

    Железо Raspberry Pi B, шлюз Arduino Serial. Подключаю на GPIO, т.е. будет использоваться ttyAMA0

    Установку делаю с админ панели

    вот лог установки драйвера:

    ! ````
    $ ./iobroker add mysensors
    npm install iobroker.mysensors --production --prefix "/opt/iobroker" (System call)
    In file included from ../src/serialport.h:5:0, from ../src/serialport.cpp:3:
    ../node_modules/nan/nan.h:316:47: error: ‘REPLACE_INVALID_UTF8’ is not a member of ‘v8::String’
    static const unsigned kReplaceInvalidUtf8 = v8::String::REPLACE_INVALID_UTF8;
    ^
    ! make: *** [Release/obj.target/serialport/src/serialport.o] Ошибка 1
    gyp

    ERR! build error
    gyp
    ERR!
    stack Error: make failed with exit code: 2gyp ERR! stack at ChildProcess.onExit (/usr/share/node-gyp/lib/build.js:267:23)
    gyp ERR! stack at ChildProcess.emit (events.js:98:17)
    gyp ERR! stack
    at Process.ChildProcess._handle.onexit (child_process.js:809:12)
    gyp
    ERR! System Linux 4.1.19+gyp ERR! command "nodejs" "/usr/bin/node-gyp" "build" "--fallback-to-build" "--module=/opt/iobroker/node_modules/iobroker.mysensors/node_modules/serialport/build/Release/node-v11-linux-arm/serialport.node" "--module_name=serialport" "--module_path=/opt/iobroker/node_modules/iobroker.mysensors/node_modules/serialport/build/Release/node-v11-linux-arm"

    ! gyp ERR! cwd /opt/iobroker/node_modules/iobroker.mysensors/node_modules/serialportgyp ERR! node -v v0.10.29
    gyp ERR! node-gyp -v v0.12.2
    ! gyp ERR! not ok
    node-pre-gyp ERR! build error
    node-pre-gyp
    ERR! stack Error: Failed to execute 'node-gyp build --fallback-to-build --module=/opt/iobroker/node_modules/iobroker.mysensors/node_modules/serialport/build/Release/node-v11-linux-arm/serialport.node --module_name=serialport --module_path=/opt/iobroker/node_modules/iobroker.mysensors/node_modules/serialport/build/Release/node-v11-linux-arm' (1)node-pre-gyp
    ERR! stack at ChildProcess. <anonymous>(/opt/iobroker/node_modules/iobroker.mysensors/node_modules/serialport/node_modules/node-pre-gyp/lib/util/compile.js:83:29)node-pre-gyp ERR! stack at ChildProcess.emit (events.js:98:17)
    node-pre-gyp ERR! stack at maybeClose (child_process.js:755:16)
    node-pre-gyp ERR! stack at Process.ChildProcess._handle.onexit (child_process.js:822:5)
    ! node-pre-gyp
    ERR! System Linux 4.1.19+node-pre-gyp ERR! command "node" "/opt/iobroker/node_modules/iobroker.mysensors/node_modules/serialport/node_modules/.bin/node-pre-gyp" "install" "--fallback-to-build"
    node-pre-gyp ERR! cwd /opt/iobroker/node_modules/iobroker.mysensors/node_modules/serialport
    node-pre-gyp ERR! node -v v0.10.29
    node-pre-gyp ERR! node-pre-gyp -v v0.6.18
    node-pre-gyp
    ERR! not ok
    npm

    WARN This failure might be due to the use of legacy binary "node"
    npm WARN For further explanations, please read/usr/share/doc/nodejs/README.Debian

    ! npm
    WARN optional dep failed, continuing serialport@2.0.6</anonymous>

    1 Antwort Letzte Antwort
    0
    • M Offline
      M Offline
      Maxtox
      schrieb am zuletzt editiert von
      #47

      Ты мой видео на YouTube смотрел? Там всё показано

      Arduino MEGA 2560 R3 / ioBroker / DOino Sketch

      1 Antwort Letzte Antwort
      0
      • BluefoxB Offline
        BluefoxB Offline
        Bluefox
        schrieb am zuletzt editiert von
        #48

        @Haba:

        Подскажите пожалуйста, из-за чего криво может ставится этот драйвер?

        саму ioBroker поставил и запустил раза с пятого :)

        Железо Raspberry Pi B, шлюз Arduino Serial. Подключаю на GPIO, т.е. будет использоваться ttyAMA0

        Установку делаю с админ панели

        вот лог установки драйвера:

        ! ````
        $ ./iobroker add mysensors
        npm install iobroker.mysensors --production --prefix "/opt/iobroker" (System call)
        In file included from ../src/serialport.h:5:0, from ../src/serialport.cpp:3:
        ../node_modules/nan/nan.h:316:47: error: ‘REPLACE_INVALID_UTF8’ is not a member of ‘v8::String’
        static const unsigned kReplaceInvalidUtf8 = v8::String::REPLACE_INVALID_UTF8;
        ^
        ! make: *** [Release/obj.target/serialport/src/serialport.o] Ошибка 1
        gyp

        ERR! build error
        gyp
        ERR!
        stack Error: make failed with exit code: 2gyp ERR! stack at ChildProcess.onExit (/usr/share/node-gyp/lib/build.js:267:23)
        gyp ERR! stack at ChildProcess.emit (events.js:98:17)
        gyp ERR! stack
        at Process.ChildProcess._handle.onexit (child_process.js:809:12)
        gyp
        ERR! System Linux 4.1.19+gyp ERR! command "nodejs" "/usr/bin/node-gyp" "build" "--fallback-to-build" "--module=/opt/iobroker/node_modules/iobroker.mysensors/node_modules/serialport/build/Release/node-v11-linux-arm/serialport.node" "--module_name=serialport" "--module_path=/opt/iobroker/node_modules/iobroker.mysensors/node_modules/serialport/build/Release/node-v11-linux-arm"

        ! gyp ERR! cwd /opt/iobroker/node_modules/iobroker.mysensors/node_modules/serialportgyp ERR! node -v v0.10.29
        gyp ERR! node-gyp -v v0.12.2
        ! gyp ERR! not ok
        node-pre-gyp ERR! build error
        node-pre-gyp
        ERR! stack Error: Failed to execute 'node-gyp build --fallback-to-build --module=/opt/iobroker/node_modules/iobroker.mysensors/node_modules/serialport/build/Release/node-v11-linux-arm/serialport.node --module_name=serialport --module_path=/opt/iobroker/node_modules/iobroker.mysensors/node_modules/serialport/build/Release/node-v11-linux-arm' (1)node-pre-gyp
        ERR! stack at ChildProcess. <anonymous>(/opt/iobroker/node_modules/iobroker.mysensors/node_modules/serialport/node_modules/node-pre-gyp/lib/util/compile.js:83:29)node-pre-gyp ERR! stack at ChildProcess.emit (events.js:98:17)
        node-pre-gyp ERR! stack at maybeClose (child_process.js:755:16)
        node-pre-gyp ERR! stack at Process.ChildProcess._handle.onexit (child_process.js:822:5)
        ! node-pre-gyp
        ERR! System Linux 4.1.19+node-pre-gyp ERR! command "node" "/opt/iobroker/node_modules/iobroker.mysensors/node_modules/serialport/node_modules/.bin/node-pre-gyp" "install" "--fallback-to-build"
        node-pre-gyp ERR! cwd /opt/iobroker/node_modules/iobroker.mysensors/node_modules/serialport
        node-pre-gyp ERR! node -v v0.10.29
        node-pre-gyp ERR! node-pre-gyp -v v0.6.18
        node-pre-gyp
        ERR! not ok
        npm

        WARN This failure might be due to the use of legacy binary "node"
        npm WARN For further explanations, please read/usr/share/doc/nodejs/README.Debian

        ! npm
        WARN optional dep failed, continuing serialport@2.0.6</anonymous>
        ```` `
        Не хватает питона и build-essential

        1 Antwort Letzte Antwort
        0
        • H Offline
          H Offline
          Haba
          schrieb am zuletzt editiert von
          #49

          Maxtox видео смотрел, но посмотрел еще раз :) действитвельно упустил один момент. У меня почему то даже на качестве 720р текст плохо был виден. только при втором просмотре увидел версию nodejs 12.6.

          Все переустановил еще разок, заработало! Через USB шлюз уже подключил, через GPIO пока еще не успел. Ругается Serial error: Error: Serialport not open, буду настройки проверять.

          Bluefox , в последнем образе Raspbian уже последние версии стоят, проверял.

          Кстати, подскажите еще такой момент. При установке уже самого ioBroker вылазит следующее (хотя ставил под рутом):

          ! Write "./iobroker start" to start the ioBroker
          ! Cannot create file /usr/bin/iobroker!. Non critical
          ! –---------------------------------------------------
          ! You can manually copy file into /usr/bin/. Just write:
          ! sudo cp /opt/iobroker/node_modules/iobroker/install/iobroker /usr/bin/
          ! sudo chmod 777 /usr/bin/iobroker
          ! -----------------------------------------------------
          ! Cannot copy file to /etc/init.d/iobroker.sh: Error: EACCES: permission denied, open '/etc/init.d/iobroker.sh'
          ! -----------------------------------------------------
          ! You can manually copy file and install autostart:
          ! sudo cp /opt/iobroker/node_modules/iobroker/install/linux/iobroker.sh /etc/init.d/
          ! sudo chmod 777 /etc/init.d/iobroker.sh
          ! sudo bash /opt/iobroker/node_modules/iobroker/install/linux/install.sh
          ! -----------------------------------------------------
          ! or just start "sudo bash /opt/iobroker/install.sh"
          ! -----------------------------------------------------

          Как и написано, ручками эти команды выполняю и запускаю брокера.

          1 Antwort Letzte Antwort
          0
          • fishka18rusF Offline
            fishka18rusF Offline
            fishka18rus
            schrieb am zuletzt editiert von
            #50

            @Vlad_k:

            Драйвер предназначен для работы с беспроводными устройствами (arduino+nrf24), использующими библиотеку с http://www.mysensors.org/…

            драйвер в обкатке, предложения(пожелания) не игнорируются :D `

            Привет!

            Адаптер для mysensors это действительно круто. Я давно лелеял надежду что кто-нибудь напишет подобную штуку, так как сам совсем не программист. Но, как я понял, данный адаптер в режиме tcp или udp выступает в качестве шлюза для устрйств mysensensors, т.е. работает как сервер и ждет подключений на порт 5003? Разве не логичнее ему получать данные от mysensors gateway запущенном на какой-нибудь esp8266? И есть ли в планах такой режим?

            1 Antwort Letzte Antwort
            0
            • H Offline
              H Offline
              Haba
              schrieb am zuletzt editiert von
              #51

              fishka18rus Не совсем так. Данный драйвер принимает данные (посылает команды) через физический шлюз, выполненный на одном из вариантов Serial, MQTT или Ethernet. Соответственно на чем сделан шлюз (ардуина + usb или esp8266 или сетевой модуль) не важно для ioBroker, будет работать с любой железкой либо через uart, либо через сеть

              1 Antwort Letzte Antwort
              0
              • H Offline
                H Offline
                Haba
                schrieb am zuletzt editiert von
                #52

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

                1 Antwort Letzte Antwort
                0
                • M Offline
                  M Offline
                  Maxtox
                  schrieb am zuletzt editiert von
                  #53

                  da… v planax est

                  Arduino MEGA 2560 R3 / ioBroker / DOino Sketch

                  1 Antwort Letzte Antwort
                  0
                  • H Offline
                    H Offline
                    Haba
                    schrieb am zuletzt editiert von
                    #54

                    Кто может подказать по такой штуке…

                    в скетче описал датчики, они появились в Объектах в таком виде:

                    ~~![](</s><URL url=)http://s019.radikal.ru/i634/1604/fe/567a3f1240f8.png" />

                    В скетче датчики описаны так:

                    MyMessage AlmStatus(MyAlm, V_VAR1);  
                    MyMessage BatStatus(MyBat, V_WATT);
                    MyMessage NetStatus(MyNet, V_VAR2);
                    
                     gw.present(MyAlm, S_CUSTOM, "123", false);
                     gw.present(MyBat, S_POWER, "123", false);
                     gw.present(MyNet, S_CUSTOM, "123", false);
                    
                    

                    По картинке видно, что V_VAR1 и V_VAR2 показываются пустыми полями, и по началу не подтягивались и данные.

                    А для S_POWER добавилась лишняя переменная, которая не была описана.

                    Чтобы данные с переменных V_VAR1 и V_VAR2 тоже было видно, прописал ручками так:

                    ~~![](</s><URL url=)http://s017.radikal.ru/i409/1604/d3/89954a1243f8.png" />

                    Но по идее этот подход не соответсвуют идее разработчика. Как вообще правильно надо описывать датчики в MySensors?

                    Я предполагал, что драйвер брокера из gw.present вытягивает переменные S_…, а потом уже из сообщений тянет типы переменных V_…. При таком подходе в Объектах было бы только то, что описанно в скетче и ничего лишнего.~~~~

                    1 Antwort Letzte Antwort
                    0
                    • M Offline
                      M Offline
                      Maxtox
                      schrieb am zuletzt editiert von
                      #55

                      @Haba:

                      Но по идее этот подход не соответсвуют идее разработчика. Как вообще правильно надо описывать датчики в MySensors?

                      Я предполагал, что драйвер брокера из gw.present вытягивает переменные S_…, а потом уже из сообщений тянет типы переменных V_…. При таком подходе в Объектах было бы только то, что описанно в скетче и ничего лишнего. `

                      а как вытащить тип переменной из V… ?

                      пример S_Custom :D

                      Arduino MEGA 2560 R3 / ioBroker / DOino Sketch

                      1 Antwort Letzte Antwort
                      0
                      • H Offline
                        H Offline
                        Haba
                        schrieb am zuletzt editiert von
                        #56

                        По идее все просто…

                        gw.present(2, S_CUSTOM, "text", false);

                        в шлюз придет:

                        30;2;0;0;23;text

                        где:

                        __30 - адрес узла

                        2 - child-sensor-id - адрес датчика

                        0 - message-type "presentation"

                        0 - ack

                        23 - sub-type "S_CUSTOM"__

                        т.е. переменную S_… получили из презентации

                        –--------------------------

                        теперь будем получать код переменной V…

                        __MyMessage AlmStatus(2, V_VAR2);

                        gw.send(AlmStatus.set(-84));__

                        в шлюз получим:

                        2016-04-05 11:43:04 warn Serial data received: 30;2;1;0;25;-84

                        где:

                        __30 - адрес узла

                        2 - child-sensor-id - адрес датчика

                        1 - message-type "set"

                        0 - ack__

                        25 - sub-type "V_VAR2"

                        -84 - значение

                        В результате дерево объектов можно построить следующим образом:

                        1. с узла при презентации получаем: арес узла, адреса датчиков, их тип S_… и комментарий, название скетча, версия скетча

                        2. При отправке сообщений gw.send(MyMessage.set(x)); добавляем в дерево объектов подобъекты типов V_…, к каким добавить объектам S_… определяем по адресу датчика.

                        1 Antwort Letzte Antwort
                        0
                        • BluefoxB Offline
                          BluefoxB Offline
                          Bluefox
                          schrieb am zuletzt editiert von
                          #57

                          @Haba:

                          По идее все просто…

                          gw.present(2, S_CUSTOM, "text", false);

                          в шлюз придет:

                          30;2;0;0;23;text

                          где:

                          __30 - адрес узла

                          2 - child-sensor-id - адрес датчика

                          0 - message-type "presentation"

                          0 - ack

                          23 - sub-type "S_CUSTOM"__

                          т.е. переменную S_… получили из презентации

                          –--------------------------

                          теперь будем получать код переменной V…

                          __MyMessage AlmStatus(2, V_VAR2);

                          gw.send(AlmStatus.set(-84));__

                          в шлюз получим:

                          2016-04-05 11:43:04 warn Serial data received: 30;2;1;0;25;-84

                          где:

                          __30 - адрес узла

                          2 - child-sensor-id - адрес датчика

                          1 - message-type "set"

                          0 - ack__

                          25 - sub-type "V_VAR2"

                          -84 - значение

                          В результате дерево объектов можно построить следующим образом:

                          1. с узла при презентации получаем: арес узла, адреса датчиков, их тип S_… и комментарий, название скетча, версия скетча

                          2. При отправке сообщений gw.send(MyMessage.set(x)); добавляем в дерево объектов подобъекты типов V_…, к каким добавить объектам S_… определяем по адресу датчика. `
                          Это означает, что пока сенсоры не пошлют данные, объекты не создадутся. А если это output? И данные никогда не придут? Или температура, которая каждые 30 мин обновляется?

                          1 Antwort Letzte Antwort
                          0
                          • H Offline
                            H Offline
                            Haba
                            schrieb am zuletzt editiert von
                            #58

                            если output, то правильно использовать вот эту штуку:

                            The ack parameter has the following meaning:

                            Outgoing: 0 = unacknowledged message, 1 = request ack from destination node

                            Incoming: 0 = normal message, 1 = this is an ack message

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

                            > Или температура, которая каждые 30 мин обновляется?
                            Можно проверять есть ли в дереве объектов уже такая переменная у датчика №х, если нет, то добавляем в дерево. Если есть просто обновляем значение у нее.

                            И потом, можно сделать гибрид :roll:

                            т.е. оставить все как сейчас + добавить это:
                            > Можно проверять есть ли уже в дереве объектов такая переменная у датчика, если нет, то добавляем в дерево. Если есть просто обновляем значение у нее.

                            1 Antwort Letzte Antwort
                            0
                            • H Offline
                              H Offline
                              Haba
                              schrieb am zuletzt editiert von
                              #59

                              По идее что-то типа такого должно выходить для сенсоров S_CUSTOM

                              ~~![](</s><URL url=)http://s020.radikal.ru/i710/1604/3f/3fb04f1da99b.png" />

                              1-й адрес уже работает, данные видны

                              2-й еще скетч не додлелал, поэтому пока false~~

                              1 Antwort Letzte Antwort
                              0
                              • H Offline
                                H Offline
                                Haba
                                schrieb am zuletzt editiert von
                                #60

                                как отправить команду на узел mySensors?

                                …

                                скриптом так sendTo ('mysensors.0', 'send', '30;1;1;0;24;3\n');

                                кнопкой из vis можно как то послать команду не используя скрипты?

                                1 Antwort Letzte Antwort
                                0
                                • H Offline
                                  H Offline
                                  Haba
                                  schrieb am zuletzt editiert von
                                  #61

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

                                  файл main.js

                                  ! ```
                                  /* jshint -W097 */// jshint strict:false /*jslint node: true */ "use strict"; ! // you have to require the utils module and call adapter function var utils = require(__dirname + '/lib/utils'); // Get common adapter utils var serialport; var Parses = require('sensors'); var MySensors = require(__dirname + '/lib/mysensors'); var getMeta = require(__dirname + '/lib/getmeta').getMetaInfo; var getMeta2 = require(__dirname + '/lib/getmeta').getMetaInfo2; ! var adapter = utils.adapter('mysensors'); var devices = {}; var mySensorsInterface; var floatRegEx = /^[+-]?\d+(\.\d*)$/; var inclusionOn = false; var inclusionTimeout = false; ! var config = {}; ! try { serialport = require('serialport');//.SerialPort; } catch (e) { console.warn('Serial port is not available'); } ! //принимаем и обрабатываем сообщения adapter.on('message', function (obj) { if (obj) { switch (obj.command) { case 'listUart': if (obj.callback) { if (serialport) { // read all found serial ports serialport.list(function (err, ports) { adapter.log.info('List of port: ' + JSON.stringify(ports)); adapter.sendTo(obj.from, obj.command, ports, obj.callback); }); } else { adapter.log.warn('Module serialport is not available'); adapter.sendTo(obj.from, obj.command, [{comName: 'Not available'}], obj.callback); } } ! break; } } }); ! // is called when adapter shuts down - callback has to be called under any circumstances! adapter.on('unload', function (callback) { adapter.setState('info.connection', false, true); try { if (mySensorsInterface) mySensorsInterface.destroy(); mySensorsInterface = null; callback(); } catch (e) { callback(); } }); ! // is called if a subscribed state changes adapter.on('stateChange', function (id, state) { if (!state || state.ack || !mySensorsInterface) return; ! // Warning, state can be null if it was deleted adapter.log.debug('stateChange ' + id + ' ' + JSON.stringify(state)); ! if (id === adapter.namespace + '.inclusionOn') { setInclusionState(state.val); } else // output to mysensors if (devices[id] && devices[id].type == 'state') { if (typeof state.val === 'boolean') state.val = state.val ? 1 : 0; if (state.val === 'true') state.val = 1; if (state.val === 'false') state.val = 0; ! mySensorsInterface.write( devices[id].native.id + ';' + devices[id].native.childId + ';1;0;' + devices[id].native.varTypeNum + ';' + state.val, devices[id].native.ip); } }); ! adapter.on('objectChange', function (id, obj) { if (!obj) { if (devices[id]) delete devices[id]; } else { if (obj.native.id !== undefined && obj.native.childId !== undefined && obj.native.subType !== undefined) { devices[id] = obj; } } }); ! // is called when databases are connected and adapter received configuration. // start here! adapter.on('ready', function () { main(); }); ! // start here! adapter.on('unload', function () { adapter.setState('inclusionOn', false, true); }); ! var presentationDone = false; ! function setInclusionState(val) { val = val === 'true' || val === true || val === 1 || val === '1'; inclusionOn = val; ! if (inclusionTimeout) clearTimeout(inclusionTimeout); inclusionTimeout = null; ! if (inclusionOn && adapter.config.inclusionTimeout) { inclusionTimeout = setTimeout(function () { inclusionOn = false; adapter.setState('inclusionOn', false, true); }, adapter.config.inclusionTimeout); } } ! function processPresentation(data, ip, port) { var result = Parses.parse(data.toString()); ! //var result = [{ // id: lineParts[0], // childId: lineParts[1], // type: Values.types[lineParts[2]], // ack: lineParts[3] === '1', // payload: lineParts[5] // subType: Values.subTypes[result.type][lineParts[4]]; //}]; ! if (!result || !result.length) { adapter.log.warn('Cannot parse data: ' + data); return null; } ! for (var i = 0; i < result.length; i++) { adapter.log.debug('Got: ' + JSON.stringify(result[i])); if (result[i].type === 'presentation' && result[i].subType) { adapter.log.debug('Сообщение Презетация'); presentationDone = true; var found = false; for (var id in devices) { adapter.log.debug('id = ' + id); if ((!ip || ip === devices[id].native.ip) && devices[id].native.id == result[i].id && devices[id].native.childId == result[i].childId && devices[id].native.subType == result[i].subType) { found = true; adapter.log.debug('Найден id = ' + id); break; } } ! // Add new node if (!found) { adapter.log.debug('Не найден id. Добавляем новый узел'); var objs = getMeta(result[i], ip, port, config[ip || 'serial']); for (var j = 0; j < objs.length; j++) { adapter.log.debug('Проверка ' + devices[adapter.namespace + '.' + objs[j]._id]); if (!devices[adapter.namespace + '.' + objs[j]._id]) { devices[adapter.namespace + '.' + objs[j]._id] = objs[j]; adapter.log.info('Add new object: ' + objs[j]._id + ' - ' + objs[j].common.name); adapter.setObject(objs[j]._id, objs[j], function (err) { if (err) adapter.log.error(err); }); } } } // проверяем, есть ли принятая переменная в объектах } else if (result[i].type === 'set' && result[i].subType) { adapter.log.debug('Тип "set". Ищем переменную в базе...'); var found = false; var id_found; // сюда сохраним id совпавший по параметрам id и childId for (var id in devices) { if ((!ip || ip === devices[id].native.ip) && devices[id].native.id == result[i].id && devices[id].native.childId == result[i].childId && devices[id].native.varType == result[i].subType) { found = true; adapter.log.debug('Найден id = ' + id); break; } if (devices[id].native.id == result[i].id && devices[id].native.childId == result[i].childId){ id_found = id; adapter.log.debug('Сохранили id_found с совпавшими id и childId'); adapter.log.debug('devices[id_found].native.id = ' + devices[id_found].native.id); adapter.log.debug('devices[id_found].native.childId = ' + devices[id_found].native.childId); } adapter.log.debug('Объект не найден!!!'); } // Добавляем новую переменную в существующий узел if (!found) { adapter.log.debug('Не найден id. Добавляем новую переменную'); var common_name = devices[id_found].common.name.split('.'); var objs = getMeta2(result[i], ip, port, config[ip || 'serial'],devices[id_found].native.subType,common_name[0]); if (!devices[adapter.namespace + '.' + objs[0]._id]) { devices[adapter.namespace + '.' + objs[0]._id] = objs[0]; adapter.log.info('Add new object: ' + objs[0]._id + ' - ' + objs[0].common.name); adapter.setObject(objs[0]._id, objs[0], function (err) { if (err) adapter.log.error(err); }); } } } else { // try to convert value var val = result[i].payload; if (floatRegEx.test(val)) val = parseFloat(val); if (val === 'true') val = true; if (val === 'false') val = false; result[i].payload = val; } } return result; } /* function syncObjects(index, cb) { if (typeof index === 'function') { cb = index; index = 0; } ! index = index || 0; ! if (!adapter.config.devices || index >= adapter.config.devices.length) { cb && cb(); return; } ! var id = adapter.config.devices[index].name.replace(/[.\s]+/g, '_'); ! adapter.getObject(id, function (err, obj) { if (err) adapter.log.error(err); ! // if new or changed if (!obj || JSON.stringify(obj.native) !== JSON.stringify(adapter.config.devices[index])) { adapter.setObject(id, { common: { name: adapter.config.devices[index].name, def: false, type: 'boolean', // нужный тип надо подставить read: 'true', write: 'true', // нужный режим надо подставить role: 'state', desc: obj ? obj.common.desc : 'Variable from mySensors' }, type: 'state', native: adapter.config.devices[index] }, function (err) { // Sync Rooms adapter.deleteStateFromEnum('rooms', '', '', id, function () { if (adapter.config.devices[index].room) { adapter.addStateToEnum('rooms', adapter.config.devices[index].room, '', '', id); } }); ! if (err) adapter.log.error(err); if (!obj) { adapter.log.debug('Create state ' + id); ! // if new object => create state adapter.setState(id, null, true, function () { setTimeout(function () { syncObjects(index + 1, cb); }, 0); }); } else { adapter.log.debug('Update state ' + id); setTimeout(function () { syncObjects(index + 1, cb); }, 0); } }); } else { setTimeout(function () { syncObjects(index + 1, cb); }, 0); } }); } ! function deleteStates(states, cb) { if (!states || !states.length) { cb && cb(); return; } var id = states.pop(); adapter.log.debug('Delete state ' + id); adapter.delForeignObject(id, function (err) { adapter.deleteStateFromEnum('rooms', '', '', id); ! if (err) adapter.log.error(err); ! adapter.delForeignState(id, function (err) { if (err) adapter.log.error(err); ! setTimeout(function () { deleteStates(states, cb); }, 0); }) }); } */ function main() { adapter.getState('inclusionOn', function (err, state) { setInclusionState(state ? state.val : false); }); ! // read current existing objects (прочитать текущие существующие объекты) adapter.getForeignObjects(adapter.namespace + '.*', 'state', function (err, states) { // subscribe on changes adapter.subscribeStates('*'); adapter.subscribeObjects('*'); devices = states; ! if (!devices[adapter.namespace + '.info.connection'] || !devices[adapter.namespace + '.info.connection'].common || (devices[adapter.namespace + '.info.connection'].common.type === 'boolean' && adapter.config.type !== 'serial') || (devices[adapter.namespace + '.info.connection'].common.type !== 'boolean' && adapter.config.type === 'serial')) { adapter.setForeignObject(adapter.namespace + '.info.connection', { "_id": "info.connection", "type": "state", "common": { "role": "indicator.connected", "name": adapter.config.type === 'serial' ? 'If connected to my sensors' : 'List of connected gateways', "type": adapter.config.type === 'serial' ? 'boolean' : 'string', "read": true, "write": false, "def": false }, "native": { ! } }, function (err) { if (err) adapter.log.error(err); }); } ! mySensorsInterface = new MySensors(adapter.config, adapter.log, function (error) { // if object created mySensorsInterface.write('0;0;3;0;14;Gateway startup complete'); ! // process received data mySensorsInterface.on('data', function (data, ip, port) { var result = processPresentation(data, ip, port); // update configuration if presentation received ! if (!result) return; ! for (var i = 0; i < result.length; i++) { if (result[i].type === 'set') { adapter.log.debug('Тип сообщения: set'); // If set quality if (result[i].subType == 77) { adapter.log.debug('subType = 77'); for (var id in devices) { if (devices[id].native && (!ip || ip == devices[id].native.ip) && devices[id].native.id == result[i].id && devices[id].native.childId == result[i].childId) { adapter.log.debug('Set quality of ' + (devices[id].common.name || id) + ' ' + result[i].childId + ': ' + result[i].payload + ' ' + typeof result[i].payload); adapter.setState(id, {q: typeof result[i].payload}, true); } } } else { if (result[i].subType === 'V_LIGHT') result[i].subType = 'V_STATUS'; if (result[i].subType === 'V_DIMMER') result[i].subType = 'V_PERCENTAGE'; ! for (var id in devices) { adapter.log.debug(devices[id].native.varType + ' /// ' + result[i].subType); if (devices[id].native && (!ip || ip == devices[id].native.ip) && devices[id].native.id == result[i].id && devices[id].native.childId == result[i].childId && devices[id].native.varType == result[i].subType) { ! if (devices[id].common.type == 'boolean') { result[i].payload = result[i].payload === 'true' || result[i].payload === true || result[i].payload === '1' || result[i].payload === 1; } adapter.log.debug('Set value ' + (devices[id].common.name || id) + ' ' + result[i].childId + ': ' + result[i].payload + ' ' + typeof result[i].payload); adapter.setState(id, result[i].payload, true); break; } } } } else if(result[i].type === 'internal') { var saveValue = false; adapter.log.debug('Внутреннее сообщение'); switch (result[i].subType) { case 'I_BATTERY_LEVEL': // 0 Use this to report the battery level (in percent 0-100). adapter.log.info('Battery level ' + (ip ? ' from ' + ip + ' ': '') + ':' + result[i].payload); saveValue = true; break; ! case 'I_TIME': // 1 Sensors can request the current time from the Controller using this message. The time will be reported as the seconds since 1970 adapter.log.info('Time ' + (ip ? ' from ' + ip + ' ': '') + ':' + result[i].payload); if (!result[i].ack) { // send response: internal, ack=1 mySensorsInterface.write(result[i].id + ';' + result[i].childId + ';3;1;' + result[i].subType + ';' + Math.round(new Date().getTime() / 1000), ip); } break; ! case 'I_VERSION': // 2 Used to request gateway version from controller. adapter.log.info('Version ' + (ip ? ' from ' + ip + ' ': '') + ':' + result[i].payload); saveValue = true; if (!result[i].ack) { // send response: internal, ack=1 mySensorsInterface.write(result[i].id + ';' + result[i].childId + ';3;1;' + result[i].subType + ';' + (adapter.version || 0), ip); } break; ! case 'I_SKETCH_NAME': // 2 Used to request gateway version from controller. adapter.log.info('Name ' + (ip ? ' from ' + ip + ' ': '') + ':' + result[i].payload); saveValue = true; break; ! case 'I_INCLUSION_MODE': // 5 Start/stop inclusion mode of the Controller (1=start, 0=stop). adapter.log.info('inclusion mode ' + (ip ? ' from ' + ip + ' ': '') + ':' + result[i].payload ? 'STARTED' : 'STOPPED'); break; ! case 'I_CONFIG': // 6 Config request from node. Reply with (M)etric or (I)mperal back to sensor. result[i].payload = (result[i].payload == 'I') ? 'Imperial' : 'Metric'; adapter.log.info('Config ' + (ip ? ' from ' + ip + ' ': '') + ':' + result[i].payload); config[ip || 'serial'] = config[ip || 'serial'] || {}; config[ip || 'serial'].metric = result[i].payload; saveValue = true; break; ! case 'I_LOG_MESSAGE': // 9 Sent by the gateway to the Controller to trace-log a message adapter.log.info('Log ' + (ip ? ' from ' + ip + ' ': '') + ':' + result[i].payload); break; ! case 'I_ID_REQUEST': if (inclusionOn) { // find maximal index var maxId = 0; for (var id in devices) { if (devices[id].native && (!ip || ip == devices[id].native.ip) && devices[id].native.id > maxId) { maxId = devices[id].native.id; } } maxId++; if (!result[i].ack) { // send response: internal, ack=0, I_ID_RESPONSE mySensorsInterface.write(result[i].id + ';' + result[i].childId + ';3;0;4;' + maxId, ip); } } else { adapter.log.warn('Received I_ID_REQUEST, but inclusion mode is disabled'); } break; ! default: adapter.log.info('Received INTERNAL message: ' + result[i].subType + ': ' + result[i].payload); } ! if (saveValue) { for (var id in devices) { adapter.log.debug('2 ' + devices[id].native.varType + ' /// ' + result[i].subType); if (devices[id].native && (!ip || ip == devices[id].native.ip) && devices[id].native.id == result[i].id && devices[id].native.childId == result[i].childId && devices[id].native.varType == result[i].subType) { ! if (devices[id].common.type == 'boolean') result[i].payload = !!result[i].payload; if (devices[id].common.type == 'number') result[i].payload = parseFloat(result[i].payload); ! adapter.log.info('Set value ' + (devices[id].common.name || id) + ' ' + result[i].childId + ': ' + result[i].payload + ' ' + typeof result[i].payload); adapter.setState(id, result[i].payload, true); break; } } } ! } } }); ! mySensorsInterface.on('connectionChange', function (isConn, ip, port) { adapter.setState('info.connection', isConn, true); // try soft request if (!presentationDone && isConn) { // request metric system mySensorsInterface.write('0;0;3;0;6;get metric', ip, port); mySensorsInterface.write('0;0;3;0;19;force presentation', ip, port); setTimeout(function () { // send reboot command if still no presentation if (!presentationDone) { mySensorsInterface.write('0;0;3;0;13;force restart', ip, port); } }, 1500); } }); }); }); }
                                  файл getmeta.js (добавил функцию)
                                  ! >! [spoiler]`~~[code]~~function getMetaInfo2(packet, ip, port, config, subType, common_name) {
                                  ! config = config || {};
                                  var type = presentation[subType];
                                  if (!type) {
                                  type = {
                                  type: 'string',
                                  role: 'state',
                                  vars: ['V_VAR1', 'V_VAR2', 'V_VAR3', 'V_VAR4', 'V_VAR5'],
                                  index: packet.subType
                                  };
                                  }
                                  var varType = packet.subType;
                                  var variable = vars[varType];
                                  var id = (ip ? ip.replace(/./g, '') + '.' : '') + packet.id + '.' + packet.childId + '' + subType.replace('S_', '') + /*'.' + packet.subType + */ '.' + varType;

                                  var result = [
                                      {
                                              _id:            (ip ? ip.replace(/\./g, '_') + '.'  : '') + packet.id + '.' + packet.childId + '_' + subType.replace('S_', '') + '.' + varType,
                                              common: {
                                                  name:       common_name ? (common_name + '.' + varType) : id,
                                                  type:       variable.type,
                                                  role:       variable.role + (type.role ? '.' + type.role : ''),
                                                  min:        variable.min,
                                                  max:        variable.max,
                                                  unit:       variable.unit,
                                                  def:        variable.def,
                                                  read:       variable.read,
                                                  write:      variable.write
                                              },
                                              native: {
                                                  ip:         ip,
                                                  id:         packet.id,
                                                  childId:    packet.childId,
                                                  subType:    packet.subType,
                                                  subTypeNum: type.index,
                                                  varType:    varType,
                                                  varTypeNum: variable.index
                                              },
                                              type: 'state'
                                          }
                                      ]; 
                                  

                                  ! return result;
                                  }
                                  ! module.exports.getMetaInfo = getMetaInfo;
                                  module.exports.getMetaInfo2 = getMetaInfo2;[/code]`[/spoiler][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]

                                  1 Antwort Letzte Antwort
                                  0
                                  • S Offline
                                    S Offline
                                    sanich2908
                                    schrieb am zuletzt editiert von
                                    #62

                                    Почему не видит сом порт на Raspi ???

                                    evice converter now attached to ttyUSB0

                                    root@raspberrypi:~# dmesg

                                    Нажмите Ctrl+A и Ctrl+C, что бы скопировать в буфер обмена и после этого нажмите мышкой в любом месте.

                                    mysensors-0 2016-09-24 21:32:56.957 warn Module serialport is not available

                                    mysensors-0 2016-09-24 21:32:55.643 info starting. Version 1.0.2 in /opt/iobroker/node_modules/iobroker.mysensors

                                    host-raspberrypi 2016-09-24 21:32:53.436 info instance system.adapter.mysensors.0 started with pid 2654

                                    host-raspberrypi 2016-09-24 21:32:51.029 info instance system.adapter.mysensors.0 terminated with code 0 (OK)

                                    mysensors-0 2016-09-24 21:32:51.000 info terminating

                                    host-raspberrypi 2016-09-24 21:32:50.916 info stopInstance system.adapter.mysensors.0 killing pid 2648

                                    host-raspberrypi 2016-09-24 21:32:50.915 info stopInstance system.adapter.mysensors.0

                                    1 Antwort Letzte Antwort
                                    0
                                    • H Offline
                                      H Offline
                                      Haus
                                      schrieb am zuletzt editiert von
                                      #63

                                      @sanich2908:

                                      Почему не видит сом порт на Raspi ???

                                      evice converter now attached to ttyUSB0

                                      root@raspberrypi:~# dmesg

                                      Нажмите Ctrl+A и Ctrl+C, что бы скопировать в буфер обмена и после этого нажмите мышкой в любом месте.

                                      mysensors-0 2016-09-24 21:32:56.957 warn Module serialport is not available

                                      mysensors-0 2016-09-24 21:32:55.643 info starting. Version 1.0.2 in /opt/iobroker/node_modules/iobroker.mysensors

                                      host-raspberrypi 2016-09-24 21:32:53.436 info instance system.adapter.mysensors.0 started with pid 2654

                                      host-raspberrypi 2016-09-24 21:32:51.029 info instance system.adapter.mysensors.0 terminated with code 0 (OK)

                                      mysensors-0 2016-09-24 21:32:51.000 info terminating

                                      host-raspberrypi 2016-09-24 21:32:50.916 info stopInstance system.adapter.mysensors.0 killing pid 2648

                                      host-raspberrypi 2016-09-24 21:32:50.915 info stopInstance system.adapter.mysensors.0 `

                                      sudo apt-get update

                                      sudo apt-get install build-essential

                                      sudo apt-get install python2.7

                                      js-controller: 1.5.7 / node.js: v8.15.1/ npm: 6.4.1

                                      admin: 3.6.0

                                      javascript: 4.1.10

                                      web: 2.4.1 vis: 1.1.10

                                      cloud: 2.6.2

                                      Server: DELL FX170 / linux: Debian 9.5 Stretch

                                      Adapter: MegaD-2561, Mega-ES…

                                      1 Antwort Letzte Antwort
                                      0
                                      • S Offline
                                        S Offline
                                        sanich2908
                                        schrieb am zuletzt editiert von
                                        #64

                                        Да установлено всё это, а СОМ порт не видит :oops:

                                        1 Antwort Letzte Antwort
                                        0
                                        • BluefoxB Offline
                                          BluefoxB Offline
                                          Bluefox
                                          schrieb am zuletzt editiert von
                                          #65

                                          @sanich2908:

                                          Да установлено всё это, а СОМ порт не видит :oops: `
                                          Ruf mal noch mal:

                                          cd /opt/iobroker
                                          iobroker stop mysensors
                                          npm install iobroker.mysensors --production --force
                                          iobroker upload mysensors
                                          iobroker start mysensors
                                          
                                          

                                          Danach sollten die Ports in der Konfig drin sein.

                                          1 Antwort Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          722

                                          Online

                                          32.4k

                                          Benutzer

                                          81.4k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Home
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe