Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Русский
    3. ioBroker
    4. Скрипты
    5. ioBroker скрипты
    6. GSM модем + gammu + MYSQL + IOBroker

    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

    GSM модем + gammu + MYSQL + IOBroker

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

      Отправка работает

      Но входящие сообщения не показывает, вернее показывает только первое, а не последнее пришедшее 😞

      1 Reply Last reply Reply Quote 0
      • S
        spectrekr last edited by

        Он по порядку перебирает от объекта sms.in.id до текущего полученного id с базы данных.

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

          2689_screenshot_5.jpg
          "'sms.in.count' - Количество пришедших СМС" - всегда 1

          посмотрел базу, сравнил… скрипт выдает предпоследнее сообщение, если попытаться изменить sms.in.count

          1 Reply Last reply Reply Quote 0
          • S
            spectrekr last edited by

            Он у тебя почему-то не целиком отрабатывает, так как после прочтения смс 'sms.in.count' изменяется на количество блоков смс. Поэтому у тебя постоянно первую смс и читает.

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

              помоги настроить, плз..

              насколько я понял, короткое сообщение читается так:

              connection.query('SELECT SenderNumber, ReceivingDateTime, TextDecoded FROM inbox WHERE  ID = ?', [id], function(err, res, fields) {
                                  if (err) throw err;
                                  setState('sms.in.phone', res[0].SenderNumber);
                                  setState('sms.in.time', res[0].ReceivingDateTime);
                                  setState('sms.in.text', res[0].TextDecoded);
                  });
              

              где id - номер сообщения в базе

              правильно?

              а как прочитать длинное?

              1 Reply Last reply Reply Quote 0
              • S
                spectrekr last edited by

                Правильно, а длинное

                connection.query('SELECT UDH, UpdatedInDB FROM inbox WHERE  ID = ?', [id], function(err, res_udh, fields) {
                            if (err) throw err;
                            if(res_udh[0].UDH !== ''){
                                udh = res_udh[0].UDH.substring(0, res_udh[0].UDH.length - 1);
                                date = res_udh[0].UpdatedInDB;
                                connection.query('SELECT SenderNumber, ReceivingDateTime, GROUP_CONCAT(TextDecoded SEPARATOR "") as TextDecoded FROM inbox WHERE UDH LIKE ? AND UpdatedInDB = ?',  ['%'+udh+'%', date], function(err, res, fields) {
                                        if (err) throw err;
                                        setState('sms.in.phone', res[0].SenderNumber);
                                        setState('sms.in.time', res[0].ReceivingDateTime);
                                        setState('sms.in.text', res[0].TextDecoded);
                                        })
                                 }
                           }
                })
                
                1 Reply Last reply Reply Quote 0
                • P
                  Pooh last edited by

                  а как определить, что пришло длинное?

                  1 Reply Last reply Reply Quote 0
                  • S
                    spectrekr last edited by

                    @Pooh:

                    а как определить, что пришло длинное? `

                    Самый первый запрос из приведенного кода. Если поле UDH в базе не пустое, то СМС длинное и собирается по этому полю, последняя цифра это номер СМС по порядку, в составном. Но надо учитывать, что поле UDH может быть не уникальным в большом промежутке времени, по-этому я сделал выборку по этому полю и дате получения сообщения.

                    connection.query('SELECT UDH, UpdatedInDB FROM inbox WHERE  ID = ?', [id], function(err, res_udh, fields) {
                                if (err) throw err;
                                if(res_udh[0].UDH !== ''){}
                    
                    
                    1 Reply Last reply Reply Quote 0
                    • P
                      Pooh last edited by

                      как получить конкретное сообщение?

                      как получить количество всех целых сообщений (включая собранных из кусков), а не общее количество кусков?

                      Помоги, плз,

                      Хотелось бы получить:

                      'sms.in.id' - номер последней пришедшей собранной СМС (а не номер последнего куска)

                      'sms.in.count' - Общее Количество пришедших СМС в базе (целых, а не общее количество кусков)

                      'sms.in.text' - Текст последней пришедшей СМС (у меня сейчас предпоследняя, так и не поборол)

                      И самое главное:

                      'sms.in.requesID' - Если тут ввести номер существующей СМС в базе…

                      'sms.in.requestTEXT' - ...то здесь увидим собственно текст запрошенной СМС

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

                        Большинство вопросов решил

                        Хотелось бы иметь возможность выборочно читать конкретное сообщение, сейчас только по ID… помогите, плз

                        Пока сделал так:

                        createState('sms.in.requesID',0);
                        createState('sms.in.requestTEXT',0);
                        createState('sms.in.requestPHONE',0);
                        createState('sms.in.requestTIME',0);
                        
                        createState('sms.in.lastID',0);
                        createState('sms.in.lastTEXT',0);
                        createState('sms.in.lastPHONE',0);
                        createState('sms.in.lastTIME',0);
                        
                        //createState('sms.in.quantity',0);
                        
                        createState('sms.phone.signal',0);
                        createState('sms.phone.imei',0);
                        
                        var mysql = require('mysql');
                        
                        var connection = mysql.createConnection ({
                            host: 'localhost',
                            user: 'gammu_user',
                            password: 'ХХХХХХХХХ',
                            database: 'db_gammu',
                            socketPath: '/var/run/mysqld/mysqld.sock'
                        });
                        
                        var count, udh, ud_c, date;
                        
                        // создаем подключение к базе
                        connection.connect(function(err) {
                        if (err) {
                            log('error connecting: ' + err.stack);
                            return;
                            }
                            log('connected as id ' + connection.threadId);
                        });
                        
                        // по расписанию проверяем наличие новых смс
                        schedule("*/20 * * * * *", function () {
                            connection.query('SELECT max(id) AS id FROM inbox', function(err, res_id, fields) {
                                if (err) throw err;
                                setState("javascript.0.sms.in.lastID", res_id[0].id);
                            });
                        });
                        
                        // выводим крайнюю смс
                        on("javascript.0.sms.in.lastID", function (obj) {
                            connection.query('SELECT UDH, UpdatedInDB FROM inbox WHERE  ID = ?', [obj.state.val], function(err, res_udh, fields) {
                                    if (err) throw err;
                                    if(res_udh[0].UDH !== '') {
                                        udh = res_udh[0].UDH.substring(0, res_udh[0].UDH.length - 1);
                                        date = res_udh[0].UpdatedInDB;
                                        connection.query('SELECT SenderNumber, ReceivingDateTime, GROUP_CONCAT(TextDecoded SEPARATOR "") as TextDecoded FROM inbox WHERE UDH LIKE ? AND UpdatedInDB = ?',  ['%'+udh+'%', date], function(err, res, fields) {
                                                if (err) throw err;
                                                setState("javascript.0.sms.in.lastPHONE", res[0].SenderNumber);
                                                setState("javascript.0.sms.in.lastTIME", res[0].ReceivingDateTime);
                                                setState("javascript.0.sms.in.lastTEXT", res[0].TextDecoded);
                                        });
                                    }
                                    if(res_udh[0].UDH === '') { 
                                        connection.query('SELECT SenderNumber, ReceivingDateTime, TextDecoded FROM inbox WHERE  ID = ?', [obj.state.val], function(err, res, fields) {
                                            if (err) throw err;
                                            setState("javascript.0.sms.in.lastPHONE", res[0].SenderNumber);
                                            setState("javascript.0.sms.in.lastTIME", res[0].ReceivingDateTime);
                                            setState("javascript.0.sms.in.lastTEXT", res[0].TextDecoded);
                                        });
                                    }
                            });
                        });
                        
                        // выдаем смс по запросу
                        on("javascript.0.sms.in.requesID", function (obj) {
                            connection.query('SELECT UDH, UpdatedInDB FROM inbox WHERE  ID = ?', [obj.state.val], function(err, res_udh, fields) {
                                    if (err) throw err;
                                    if(res_udh[0].UDH !== ''){
                                        udh = res_udh[0].UDH.substring(0, res_udh[0].UDH.length - 1);
                                        date = res_udh[0].UpdatedInDB;
                                        connection.query('SELECT SenderNumber, ReceivingDateTime, GROUP_CONCAT(TextDecoded SEPARATOR "") as TextDecoded FROM inbox WHERE UDH LIKE ? AND UpdatedInDB = ?',  ['%'+udh+'%', date], function(err, res, fields) {
                                                if (err) throw err;
                                                setState("javascript.0.sms.in.requestPHONE", res[0].SenderNumber);
                                                setState("javascript.0.sms.in.requestTIME", res[0].ReceivingDateTime);
                                                setState("javascript.0.sms.in.requestTEXT", res[0].TextDecoded);
                                        });
                                    }
                                    if(res_udh[0].UDH === ''){ 
                                        connection.query('SELECT SenderNumber, ReceivingDateTime, TextDecoded FROM inbox WHERE  ID = ?', [obj.state.val], function(err, res, fields) {
                                            if (err) throw err;
                                            setState("javascript.0.sms.in.requestPHONE", res[0].SenderNumber);
                                            setState("javascript.0.sms.in.requestTIME", res[0].ReceivingDateTime);
                                            setState("javascript.0.sms.in.requestTEXT", res[0].TextDecoded);
                                        });
                                    }
                          });
                        });
                        
                        // ОТПРАВКА. Отслеживает изменение в переменной и отправляет текст на русском языке, если необходимо использовать латиницу то заменяем Unicode_No_Compression на Default_No_Compression.
                        on("javascript.0.sms.out.text", function (obj) {
                            connection.query('INSERT INTO outbox (DestinationNumber, TextDecoded, CreatorID, Coding) VALUES (' + "'" + getState("javascript.0.sms.out.phone").val + "','" + getState("javascript.0.sms.out.text").val + "','IOBroker'," + "'Unicode_No_Compression');", function(err, res, fields) {
                            if (err) throw err;
                            });
                        });
                        
                        // получаем сведения о подключенном модеме, IMEI, уровень сигнала (по расписанию)
                        schedule("*/20 * * * *", function () {
                            connection.query('SELECT * FROM phones', function(err, res, fields) {
                                if (err) throw err;
                                setState("javascript.0.sms.phone.signal", res[0].Signal);
                                setState("javascript.0.sms.phone.imei", res[0].IMEI);
                            });
                        });
                        
                        
                        1 Reply Last reply Reply Quote 0
                        • S
                          spectrekr last edited by

                          Так а что ты подразумеваешь под выборочным чтением, у тебя же по ID читает, ты хочешь по другому признаку? Подробней опиши что ты под этим понимаешь.

                          Еще бы я сделал по другому, убрал бы mysql пакет из js. Поставил драйвер SQL, настройки сохранил бы в нем, и через него запросы делал. Чуть безопаснее. Да и пакет в актуальном состоянии будет. Имхо.

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

                            да, читает четко по ID, но количество ID - это количество кусков, а не реальных сообщений. т.е. я отправил 3 сообщения, одно короткое, другое длинное (из 3 допустим кусков), третье опять короткое. следовательно количество ID будет 5, а количество сообщений - 3.

                            если выбирать по ID то 1 - это первое сообщение, 2, 3 или 4 - это второе, а 5 - это третье

                            а хотелось бы выбирать по Номеру сообщений, 1 - первое короткое, 2 - второе длинное из 3 частей, 3 - третье…

                            и да, mysql я бы убрал, если бы знал как 🙂

                            1 Reply Last reply Reply Quote 0
                            • S
                              spectrekr last edited by

                              Убрать, я описал как.

                              Запросы после установки sql драйвера и настройки подключения к БД, будут вида

                              //по расписанию проверяем наличие новых смс
                              schedule("* * * * *", function () {
                                  sendTo('sql.0', 'query','SELECT max(id) AS id FROM smsd.inbox', function(res) {
                                      if (res.error) {
                                          console.error(res.error);
                                      };
                                      setState('sms.in.id', res.result[0].id);
                                  });
                              });
                              

                              По аналогии думаю разберешься. По поводу того как ты хочешь СМС удобно читать, мне приходит мысль создать дополнительную таблицу с 2 столбцами, ID СМС и IDs из текущей таблицы. Как раз у тебя и получится, что в первом столбце будет нужные тебе номера, а во втором список ID из которых состоит СМС.

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

                                с базой не понял, надо новый инстанцию sql создавать? можно, если не затруднит, расписать чуть подробнее и по шагам?

                                1 Reply Last reply Reply Quote 0
                                • S
                                  spectrekr last edited by

                                  База где хранится история объектов и входящие sms на одном сервере? Если да, то просто используете запросы, только в поле где указывали таблицу откуда делать выборку указываете через точку база.таблица. Если пользователи баз разные, то пользователю указанному в настройках драйвера для хранения истории необходимо дать права на чтение с базы SMS.

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

                                    Не работает 😞

                                    Подскажите, плз, где ошибка?:

                                    // () выдаем смс по запросу
                                    on("javascript.0.sms.in.requesIDtest", function (obj) {
                                        sendTo('sql.0', 'query','SELECT UDH, UpdatedInDB FROM db_gammu.inbox WHERE  ID = ?', [obj.state.val], function(err, res_udh, fields) {
                                                if (res.error) {
                                                console.error(res.error);
                                            }
                                                if(res_udh.result[0].UDH !== ''){
                                                    udh = res_udh.result[0].UDH.substring(0, res_udh.result[0].UDH.length - 1);
                                                    date = res_udh.result[0].UpdatedInDB;
                                                    sendTo('sql.0', 'query','SELECT SenderNumber, ReceivingDateTime, GROUP_CONCAT(TextDecoded SEPARATOR "") as TextDecoded FROM db_gammu.inbox WHERE UDH LIKE ? AND UpdatedInDB = ?',  ['%'+udh+'%', date], function(err, res, fields) {
                                                            if (err) throw err;
                                                            setState("javascript.0.sms.in.requestPHONEtest", res.result[0].SenderNumber);
                                                            setState("javascript.0.sms.in.requestTIMEtest", res.result[0].ReceivingDateTime);
                                                            setState("javascript.0.sms.in.requestTEXTtest", res.result[0].TextDecoded);
                                                    });
                                                }
                                                if(res_udh.result[0].UDH === ''){ 
                                                    sendTo('sql.0', 'query','SELECT SenderNumber, ReceivingDateTime, TextDecoded FROM db_gammu.inbox WHERE  ID = ?', [obj.state.val], function(err, res, fields) {
                                                       if (res.error) {
                                                console.error(res.error);
                                            }
                                                        setState("javascript.0.sms.in.requestPHONEtest", res.result[0].SenderNumber);
                                                        setState("javascript.0.sms.in.requestTIMEtest", res.result[0].ReceivingDateTime);
                                                        setState("javascript.0.sms.in.requestTEXTtest", res.result[0].TextDecoded);
                                                    });
                                                }
                                      });
                                    });
                                    
                                    

                                    ЗЫ а отправка работает:

                                    // () ОТПРАВКА. Отслеживает изменение в переменной и отправляет текст на русском языке, если необходимо использовать латиницу то заменяем Unicode_No_Compression на Default_No_Compression.
                                    on("javascript.0.sms.out.text", function (obj) {
                                        sendTo('sql.0', 'query', 'INSERT INTO db_gammu.outbox (DestinationNumber, TextDecoded, CreatorID, Coding) VALUES (' + "'" + getState("javascript.0.sms.out.phone").val + "','" + getState("javascript.0.sms.out.text").val + "','IOBroker'," + "'Unicode_No_Compression');", function(res) {
                                        if (res.error) {
                                                console.error(res.error);
                                            }
                                        });
                                    });
                                    
                                    1 Reply Last reply Reply Quote 0
                                    • S
                                      spectrekr last edited by

                                      Пробуй так.

                                      // () выдаем смс по запросу
                                      on("javascript.0.sms.in.requesIDtest", function (obj) {
                                          sendTo('sql.0', 'query','SELECT UDH, UpdatedInDB FROM db_gammu.inbox WHERE  ID = ' + obj.state.val, function(err, res_udh, fields) {
                                                  if (res.error) {
                                                  console.error(res.error);
                                              }
                                                  if(res_udh.result[0].UDH !== ''){
                                                      udh = res_udh.result[0].UDH.substring(0, res_udh.result[0].UDH.length - 1);
                                                      date = res_udh.result[0].UpdatedInDB;
                                                      sendTo('sql.0', 'query','SELECT SenderNumber, ReceivingDateTime, GROUP_CONCAT(TextDecoded SEPARATOR "") as TextDecoded FROM db_gammu.inbox WHERE UDH LIKE %'+udh+'% AND UpdatedInDB = ' +date, function(err, res, fields) {
                                                              if (err) throw err;
                                                              setState("javascript.0.sms.in.requestPHONEtest", res.result[0].SenderNumber);
                                                              setState("javascript.0.sms.in.requestTIMEtest", res.result[0].ReceivingDateTime);
                                                              setState("javascript.0.sms.in.requestTEXTtest", res.result[0].TextDecoded);
                                                      });
                                                  }
                                                  if(res_udh.result[0].UDH === ''){
                                                      sendTo('sql.0', 'query','SELECT SenderNumber, ReceivingDateTime, TextDecoded FROM db_gammu.inbox WHERE  ID = ' + obj.state.val, function(err, res, fields) {
                                                         if (res.error) {
                                                  console.error(res.error);
                                              }
                                                          setState("javascript.0.sms.in.requestPHONEtest", res.result[0].SenderNumber);
                                                          setState("javascript.0.sms.in.requestTIMEtest", res.result[0].ReceivingDateTime);
                                                          setState("javascript.0.sms.in.requestTEXTtest", res.result[0].TextDecoded);
                                                      });
                                                  }
                                        });
                                      });
                                      

                                      Мне кажется он неправильно формирует запрос с подстановкой данных.

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

                                        не работает 😞

                                        1 Reply Last reply Reply Quote 0
                                        • S
                                          spectrekr last edited by

                                          Переведи драйвер sql в debug режим и посмотри какой формируется запрос, возможно где-то ошибку допускаем. Раз отправка работает, значит ошибка именно в запросе.

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

                                            длинное не выводится:

                                            ! sql.0 2018-02-12 08:36:40.914 debug sendTo "query" to system.adapter.javascript.0 from system.adapter.sql.0
                                            ! sql.0 2018-02-12 08:36:40.884 debug SELECT max(id) AS id FROM db_gammu.inbox
                                            ! sql.0 2018-02-12 08:36:39.688 debug sendTo "query" to system.adapter.javascript.0 from system.adapter.sql.0
                                            ! sql.0 2018-02-12 08:36:39.677 debug SELECT SenderNumber, ReceivingDateTime, GROUP_CONCAT(TextDecoded SEPARATOR "") as TextDecoded FROM inbox WHERE UDH LIKE ? AND UpdatedInDB = ?
                                            ! sql.0 2018-02-12 08:36:39.662 debug sendTo "query" to system.adapter.javascript.0 from system.adapter.sql.0
                                            ! sql.0 2018-02-12 08:36:39.652 debug SELECT UDH, UpdatedInDB FROM db_gammu.inbox WHERE ID = 3 <-третье сообщение (длинное)
                                            ! javascript.0 2018-02-12 08:36:39.642 info script.js.Test.SMS_SQL: NEW Request START with sql.0 <-начало запроса
                                            короткое выводится:

                                            ! sql.0 2018-02-12 08:40:55.516 debug sendTo "query" to system.adapter.javascript.0 from system.adapter.sql.0
                                            ! sql.0 2018-02-12 08:40:55.504 debug SELECT SenderNumber, ReceivingDateTime, TextDecoded FROM db_gammu.inbox WHERE ID = 2
                                            ! sql.0 2018-02-12 08:40:55.482 debug sendTo "query" to system.adapter.javascript.0 from system.adapter.sql.0
                                            ! sql.0 2018-02-12 08:40:55.468 debug SELECT UDH, UpdatedInDB FROM db_gammu.inbox WHERE ID = 2 <-второе сообщение (короткое)
                                            ! javascript.0 2018-02-12 08:40:55.458 info script.js.Test.SMS_SQL: NEW Request START with sql.0 <-начало запроса

                                            кусок скрипта:

                                            ! // () выдаем смс по запросу
                                            ! on("javascript.0.sms.in.requesIDtest", function (obj) {
                                            ! console.log("NEW Request START with sql.0");
                                            ! sendTo('sql.0', 'query','SELECT UDH, UpdatedInDB FROM db_gammu.inbox WHERE ID = ' + obj.state.val, function(res) {
                                            ! if (res.error) {
                                            ! console.error(res.error);
                                            ! }
                                            ! if(res.result[0].UDH !== ''){
                                            ! udh = res.result[0].UDH.substring(0, res.result[0].UDH.length - 1);
                                            ! date = res.result[0].UpdatedInDB;
                                            ! sendTo('sql.0', 'query','SELECT SenderNumber, ReceivingDateTime, GROUP_CONCAT(TextDecoded SEPARATOR "") as TextDecoded FROM inbox WHERE UDH LIKE ? AND UpdatedInDB = ?', ['%'+udh+'%', date], function(res) {
                                            ! if (res.error) {
                                            ! console.error(res.error);
                                            ! }
                                            ! setState("javascript.0.sms.in.requestPHONEtest", res.result[0].SenderNumber);
                                            ! setState("javascript.0.sms.in.requestTIMEtest", res.result[0].ReceivingDateTime);
                                            ! setState("javascript.0.sms.in.requestTEXTtest", res.result[0].TextDecoded);
                                            ! });
                                            ! }
                                            ! if(res.result[0].UDH === ''){
                                            ! sendTo('sql.0', 'query','SELECT SenderNumber, ReceivingDateTime, TextDecoded FROM db_gammu.inbox WHERE ID = ' + obj.state.val, function(res) {
                                            ! if (res.error) {
                                            ! console.error(res.error);
                                            ! }
                                            ! setState("javascript.0.sms.in.requestPHONEtest", res.result[0].SenderNumber);
                                            ! setState("javascript.0.sms.in.requestTIMEtest", res.result[0].ReceivingDateTime);
                                            ! setState("javascript.0.sms.in.requestTEXTtest", res.result[0].TextDecoded);
                                            ! });
                                            ! }
                                            ! });
                                            ! //console.log("NEW Request STOP");
                                            ! });

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            889
                                            Online

                                            31.8k
                                            Users

                                            80.0k
                                            Topics

                                            1.3m
                                            Posts

                                            2
                                            30
                                            6996
                                            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