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

Вопросы и информация о скриптах для ioBroker
spectrekr
professional
Beiträge: 255
Registriert: 26.12.2014, 09:40

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

Beitrag von spectrekr » 12.04.2016, 11:14

Надо было настроить информирование о важных событиях на телефон, до написания драйвера сил и ума, пока, не хватает по-этому было решено написать скрипт.
Теперь все по порядку. Настраивалось все на debian, думаю в остальных система аналогично и проблем не должно составить, так как gammu давно включен в стандартный репозитарий.
Настройки:
Spoiler: Show hidden text
Для начала usb модем переводим в режим только модем, этой информации через поиск полно, так что каждый для своего модема посмотрит самостоятельно.
Далее устанавливаем и настраиваем gammu

Code: Alles auswählen

sudo apt-get install gammu
Конфиг gammu: /etc/gammurc
Модем обычно определяется как /dev/ttyUSB0, ttyUSB1, ttyUSB2. Нам нужен ttyUSB0
Для начала в конфиге указываем

Code: Alles auswählen

[gammu]
port= /dev/ttyUSB0
connection = at
Проверяем:

Code: Alles auswählen

sudo gammu  --identify
Далее автоматизируем, должен быть установлен mysql, описывать не стану, информации полно.

Code: Alles auswählen

sudo apt-get install gammu-smsd
Конфиг /etc/gammu-smsdrc

Code: Alles auswählen

gammu]
port = /dev/ttyUSB0
connection = at
[smsd]
#Сервер базы данных
service = MYSQL
host = localhost
logfile = /var/log/gammu-smsd
#Пользователь базы
user = smsd
password = password
#Адрес сервера базы данных
pc = localhost
#Имя базы
database = smsd
Настраиваем mysql

Code: Alles auswählen

mysql -u root -p
GRANT USAGE ON *.* TO 'smsd'@'localhost' IDENTIFIED BY 'password';
GRANT SELECT, INSERT, UPDATE, DELETE ON `smsd`.* TO 'smsd'@'localhost';
CREATE DATABASE smsd;
Далее переходим

Code: Alles auswählen

cd /usr/share/doc/gammu/examples/sql
sudo gunzip mysql.sql.gz
mysql -u root -p smsd < mysql.sql
На этом настройки закончены. Ошибки смотреть в логах:

Code: Alles auswählen

cat /var/log/gammu.log
cat /var/log/gammu-smsd.log
В скрипте используется драйвер mysql, соответственно, необходимо установить, или переустановить после каждого обновления драйвера javascript.

Code: Alles auswählen

cd /opt/iobroker/node_modules/iobroker.javascript/
npm install mysql
Сам скрипт:
Spoiler: Show hidden text
createState('sms.in.id','',{type:'number',role:'value',read:true});
createState('sms.in.phone','',{type:'number',role:'number',read:true});
createState('sms.in.count','',{type:'number',role:'count',read:true});
createState('sms.in.text','',{type:'string',role:'text',read:true});
createState('sms.in.time','',{type:'string',role:'date',read:true});
createState('sms.phone.signal','',{type:'number',role:'level',read:true});
createState('sms.phone.imei','',{type:'string',role:'value',read:true});
createState('sms.phone.battery','',{type:'number',role:'level',read:true});
createState('sms.out.phone','',{type:'number',role:'number',read:true});
createState('sms.out.text','',{type:'string',role:'text',read:true});

var mysql = require('mysql');

var connection = mysql.createConnection({
host: 'localhost',
user: 'smsd',
password: 'password',
database: 'smsd',
socketPath: '/var/run/mysqld/mysqld.sock'
});

var count, udh, ud_c, date;
var java_id = 'javascript.0.';

//создаем подключение к базе
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('sms.in.id', res_id[0].id);
});
});

on({id: java_id + 'sms.in.id', change: 'any'}, function (obj) {
if (obj.oldState.val < obj.newState.val){
setState('sms.in.count', obj.newState.val - obj.oldState.val);
}
});

//обрабатываем пришедшие смс, если смс длинное то собираем текст из нескольких частей в единый.
//И записываем в переменные номер отправителя, текст сообщения, дату получения.
on({id: java_id + 'sms.in.count', change: 'any'}, function (obj) {
count = obj.newState.val;
if (count > 1){
id = getState('sms.in.id').val - count + 1;
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 UDH FROM inbox WHERE UDH LIKE ? AND UpdatedInDB = ?', ['%'+udh+'%', date], function(err, res, fields) {
if (err) throw err;
ud_c = res.length;
});
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);
if(id+ud_c < getState('sms.in.id').val){
setState('sms.in.count', count - ud_c);
}
});
}else{
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);
if(id+1 <= getState('sms.in.id').val){
setState('sms.in.count', count - 1);
}
// setState('sms.id', id);
});
}
});

}
});

//получаем сведения о подключенном модеме, IMEI, уровень сигнала и заряд батарее(при наличии)
schedule("*/10 * * * *", function () {
connection.query('SELECT * FROM phones', function(err, res, fields) {
if (err) throw err;
setState('sms.phone.signal', res[0].Signal);
setState('sms.phone.imei', res[0].IMEI);
setState('sms.phone.battery', res[0].Battery);
});
});

//Отслеживает изменение в переменной и отправляет текст на русском языке, если необходимо использовать латиницу то заменяем Unicode_No_Compression на Default_No_Compression.
on({id: java_id + 'sms.out.text', change: 'any'}, function (obj) {
connection.query('INSERT INTO outbox (DestinationNumber, TextDecoded, CreatorID, Coding) VALUES (' + "'" + getState('sms.out.phone').val + "','" + getState('sms.out.text').val + "','IOBroker'," + "'Unicode_No_Compression');", function(err, res, fields) {
if (err) throw err;
});
});
По скрипту:
Переменные:
'sms.in.id' - ID последней пришедшей СМС
'sms.in.phone' - Номер телефона отправителя
'sms.in.count' - Количество пришедших СМС
'sms.in.text' - Текст пришедшей СМС
'sms.in.time' - Время получения
'sms.phone.signal' - Уровень сигнала
'sms.phone.imei' - IMEI модема
'sms.phone.battery' - Уровень батареи
'sms.out.phone' - Номер телефона на который будет отсылаться СМС, можно изменять и при отправке но соблюдая последовательность, сначала выставляем номер телефона, потом отправляем текст.
'sms.out.text' - Текст отправляемой СМС.
Если у кого-то используется несколько драйверов javascripts, то в скрипте в переменную java_id заменить на соответствующую.
Принимаю предложения, правки ))

За русский язык простите, тяжко у меня с орфографией и грамматикой.

spectrekr
professional
Beiträge: 255
Registriert: 26.12.2014, 09:40

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

Beitrag von spectrekr » 05.05.2016, 09:41

Как и обещал, вторая версия скрипта, с получением баланса. Здесь будет больше нюансов, так что скорей всего придется поправлять.
Подготовка:
Spoiler: Show hidden text
Начнем, для отправки USSD запросов нам понадобится приложение gsm-ussd, берется тут.
После установки, надо подправить файл, выполняем

Code: Alles auswählen

sudo vi /usr/bin/gsm-ussd
Исправляем на

Code: Alles auswählen

my $modemport           = '/dev/ttyUSB2';
my @ussd_queries        = ( '*101#' ); #тут указать код USSD вашего оператора
Проверяем работу приложения

Code: Alles auswählen

 sudo gsm-ussd -m /dev/ttyUSB2 --no-cleartext '*100#' 
Если получили баланс или получили сообщение от оператора, то все работает правильно.
Теперь сам скрипт.
Spoiler: Show hidden text

Code: Alles auswählen

createState('sms.in.id','',{type:'number',role:'value',read:true});
createState('sms.in.phone','',{type:'number',role:'number',read:true});
createState('sms.in.count','',{type:'number',role:'count',read:true});
createState('sms.in.text','',{type:'string',role:'text',read:true});
createState('sms.in.time','',{type:'string',role:'date',read:true});
createState('sms.phone.signal','',{type:'number',role:'level',read:true});
createState('sms.phone.imei','',{type:'string',role:'value',read:true});
createState('sms.phone.battery','',{type:'number',role:'level',read:true});
createState('sms.phone.balance','',{type:'number',role:'level',read:true});
createState('sms.out.phone','',{type:'number',role:'number',read:true});
createState('sms.out.text','',{type:'string',role:'text',read:true});

var mysql = require('mysql');

var connection = mysql.createConnection({
    host:     'localhost',
    user:     'sms',
    password: 'sms_spkr12al',
    database: 'smsd',
    socketPath: '/var/run/mysqld/mysqld.sock'
});

var count, udh, ud_c, date;
var java_id = 'javascript.0.';

//создаем подключение к базе
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('sms.in.id', res_id[0].id);
    });
});


on({id: java_id + 'sms.in.id', change: 'any'}, function (obj) {
    if (obj.oldState.val < obj.newState.val){
        setState('sms.in.count', obj.newState.val - obj.oldState.val);
    }
});

//обрабатываем пришедшие смс, если смс длинное то собираем текст из нескольких частей в единый.
//И записываем в переменные номер отправителя, текст сообщения, дату получения.
on({id: java_id + 'sms.in.count', change: 'any'}, function (obj) {
    count = obj.newState.val;
    if (count > 1){
        id = getState('sms.in.id').val - count + 1;
        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 UDH FROM inbox WHERE  UDH LIKE ? AND UpdatedInDB = ?', ['%'+udh+'%', date], function(err, res, fields) {
                    if (err) throw err;
                    ud_c = res.length;
                });
                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);
                        if(id+ud_c < getState('sms.in.id').val){
                            setState('sms.in.count', count - ud_c);
                        }
                });
            }else{
                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);
                    if(id+1 <= getState('sms.in.id').val){
                        setState('sms.in.count', count - 1);
                    }
    //                    setState('sms.id', id);
                });
            }
        });
    }
});


//получаем сведения о подключенном модеме, IMEI, уровень сигнала и заряд батарее(при наличии)
schedule("*/10 * * * *", function () {
    connection.query('SELECT * FROM phones', function(err, res, fields) {
        if (err) throw err;
        setState('sms.phone.signal', res[0].Signal);
        setState('sms.phone.imei', res[0].IMEI);
        setState('sms.phone.battery', res[0].Battery);
    });
});


//Выполняем запрос баланса, при выдаче в консоль обрабатываем и пишем баланс в переменную, нет - ждем смс
schedule("0 10-20 * * *", function () {
    var exec = require('child_process').exec;
    var child = exec ("sudo /usr/bin/gsm-ussd -m /dev/ttyUSB2 --no-cleartext '*100#'",
        function (error, stdout){
            log(stdout);
            if(stdout.indexOf('Баланс:') >= 0){
                var str = stdout.substring(stdout.indexOf('Баланс:')+7,stdout.indexOf('р,'));
                setState(java_id + 'sms.phone.balance', str);
            }
        });
});

//Отслеживает изменение в переменной и отправляет текст на русском языке, если необходимо использовать латиницу то заменяем Unicode_No_Compression на Default_No_Compression.
on({id: java_id + 'sms.out.text', change: 'any'}, function (obj) {
    connection.query('INSERT INTO outbox (DestinationNumber, TextDecoded, CreatorID, Coding) VALUES (' + "'" + getState('sms.out.phone').val + "','" + getState('sms.out.text').val + "','IOBroker'," + "'Unicode_No_Compression');", function(err, res, fields) {
        if (err) throw err;
    });
});

//Проверяем если у входящей СМС отправитель Balance, то обрабатыаем и пишем баланс в переменную
on({id: java_id + 'sms.in.text', change: 'any'}, function (obj) {
    if(getState(java_id + 'sms.in.phone').val == 'Balance\r'){
        //  && getState(java_id + 'sms.in.text').ts === getState(java_id + 'sms.in.phone').ts
        var str = getState(java_id + 'sms.in.text').val + '';
        str = str.substring(str.indexOf('Баланс:')+7,str.indexOf('р,'));
        setState(java_id + 'sms.phone.balance', str);
    }
});

В отличии от первой версии добавилась переменная 'sms.phone.balance' отвечающая за хранение текущего баланса.
Что может понадобится подправить:
Spoiler: Show hidden text
//Проверяем если у входящей СМС отправитель Balance, то обрабатыаем и пишем баланс в переменную
on({id: java_id + 'sms.in.text', change: 'any'}, function (obj) {
if(getState(java_id + 'sms.in.phone').val == 'Balance\r'){ //здесь проверить имя отправителя баланса
// && getState(java_id + 'sms.in.text').ts === getState(java_id + 'sms.in.phone').ts
var str = getState(java_id + 'sms.in.text').val + '';
str = str.substring(str.indexOf('Баланс:')+7,str.indexOf('р,')); //Если в смс слово баланс: отсутствует, то подправить на свою строку, чтоб определялась только сумма.
setState(java_id + 'sms.phone.balance', str);
}
});
Аналогичные изменения в данном куске
//Выполняем запрос баланса, при выдаче в консоль обрабатываем и пишем баланс в переменную, нет - ждем смс
schedule("0 10-20 * * *", function () {
var exec = require('child_process').exec;
var child = exec ("sudo /usr/bin/gsm-ussd -m /dev/ttyUSB2 --no-cleartext '*100#'", //здесь указать код USSD вашего оператора.
function (error, stdout){
log(stdout);
if(stdout.indexOf('Баланс:') >= 0){
var str = stdout.substring(stdout.indexOf('Баланс:')+7,stdout.indexOf('р,'));
setState(java_id + 'sms.phone.balance', str);
}
});
});
Ну вроде все указал, описал.

Pooh
professional
Beiträge: 125
Registriert: 11.05.2017, 05:15
Wohnort: Самара
Kontaktdaten:

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

Beitrag von Pooh » 22.12.2017, 05:34

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

spectrekr
professional
Beiträge: 255
Registriert: 26.12.2014, 09:40

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

Beitrag von spectrekr » 22.12.2017, 06:39

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

Pooh
professional
Beiträge: 125
Registriert: 11.05.2017, 05:15
Wohnort: Самара
Kontaktdaten:

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

Beitrag von Pooh » 22.12.2017, 07:34

Screenshot_5.jpg
"'sms.in.count' - Количество пришедших СМС" - всегда 1
посмотрел базу, сравнил... скрипт выдает предпоследнее сообщение, если попытаться изменить sms.in.count

spectrekr
professional
Beiträge: 255
Registriert: 26.12.2014, 09:40

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

Beitrag von spectrekr » 22.12.2017, 08:15

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

Pooh
professional
Beiträge: 125
Registriert: 11.05.2017, 05:15
Wohnort: Самара
Kontaktdaten:

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

Beitrag von Pooh » 22.12.2017, 09:09

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

Code: Alles auswählen

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 - номер сообщения в базе
правильно?
а как прочитать длинное?

spectrekr
professional
Beiträge: 255
Registriert: 26.12.2014, 09:40

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

Beitrag von spectrekr » 22.12.2017, 12:43

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

Code: Alles auswählen

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

Pooh
professional
Beiträge: 125
Registriert: 11.05.2017, 05:15
Wohnort: Самара
Kontaktdaten:

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

Beitrag von Pooh » 25.12.2017, 09:42

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

spectrekr
professional
Beiträge: 255
Registriert: 26.12.2014, 09:40

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

Beitrag von spectrekr » 25.12.2017, 10:06

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

Code: Alles auswählen

connection.query('SELECT UDH, UpdatedInDB FROM inbox WHERE  ID = ?', [id], function(err, res_udh, fields) {
            if (err) throw err;
            if(res_udh[0].UDH !== ''){}

Pooh
professional
Beiträge: 125
Registriert: 11.05.2017, 05:15
Wohnort: Самара
Kontaktdaten:

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

Beitrag von Pooh » 31.01.2018, 07:13

как получить конкретное сообщение?
как получить количество всех целых сообщений (включая собранных из кусков), а не общее количество кусков?
Помоги, плз,
Хотелось бы получить:
'sms.in.id' - номер последней пришедшей собранной СМС (а не номер последнего куска)
'sms.in.count' - Общее Количество пришедших СМС в базе (целых, а не общее количество кусков)
'sms.in.text' - Текст последней пришедшей СМС (у меня сейчас предпоследняя, так и не поборол)
И самое главное:
'sms.in.requesID' - Если тут ввести номер существующей СМС в базе...
'sms.in.requestTEXT' - ...то здесь увидим собственно текст запрошенной СМС

Pooh
professional
Beiträge: 125
Registriert: 11.05.2017, 05:15
Wohnort: Самара
Kontaktdaten:

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

Beitrag von Pooh » 01.02.2018, 05:32

Большинство вопросов решил
Хотелось бы иметь возможность выборочно читать конкретное сообщение, сейчас только по ID... помогите, плз
Пока сделал так:

Code: Alles auswählen

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


spectrekr
professional
Beiträge: 255
Registriert: 26.12.2014, 09:40

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

Beitrag von spectrekr » 02.02.2018, 07:32

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

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

Pooh
professional
Beiträge: 125
Registriert: 11.05.2017, 05:15
Wohnort: Самара
Kontaktdaten:

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

Beitrag von Pooh » 02.02.2018, 12:31

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

spectrekr
professional
Beiträge: 255
Registriert: 26.12.2014, 09:40

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

Beitrag von spectrekr » 02.02.2018, 13:58

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

Code: Alles auswählen

//по расписанию проверяем наличие новых смс
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 из которых состоит СМС.

Pooh
professional
Beiträge: 125
Registriert: 11.05.2017, 05:15
Wohnort: Самара
Kontaktdaten:

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

Beitrag von Pooh » 05.02.2018, 03:25

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

spectrekr
professional
Beiträge: 255
Registriert: 26.12.2014, 09:40

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

Beitrag von spectrekr » 06.02.2018, 07:29

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

Pooh
professional
Beiträge: 125
Registriert: 11.05.2017, 05:15
Wohnort: Самара
Kontaktdaten:

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

Beitrag von Pooh » 08.02.2018, 05:41

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

Code: Alles auswählen

// () выдаем смс по запросу
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);
                });
            }
  });
});
ЗЫ а отправка работает:

Code: Alles auswählen

// () ОТПРАВКА. Отслеживает изменение в переменной и отправляет текст на русском языке, если необходимо использовать латиницу то заменяем 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);
        }
    });
});

spectrekr
professional
Beiträge: 255
Registriert: 26.12.2014, 09:40

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

Beitrag von spectrekr » 08.02.2018, 15:15

Пробуй так.

Code: Alles auswählen

// () выдаем смс по запросу
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);
                });
            }
  });
});
Мне кажется он неправильно формирует запрос с подстановкой данных.


Antworten