NEWS
GSM модем + gammu + MYSQL + IOBroker
-
Надо было настроить информирование о важных событиях на телефон, до написания драйвера сил и ума, пока, не хватает по-этому было решено написать скрипт.
Теперь все по порядку. Настраивалось все на debian, думаю в остальных система аналогично и проблем не должно составить, так как gammu давно включен в стандартный репозитарий.
Настройки:
! Для начала usb модем переводим в режим только модем, этой информации через поиск полно, так что каждый для своего модема посмотрит самостоятельно.
! Далее устанавливаем и настраиваем gammusudo apt-get install gammu
Конфиг gammu: /etc/gammurc
! Модем обычно определяется как /dev/ttyUSB0, ttyUSB1, ttyUSB2. Нам нужен ttyUSB0
! Для начала в конфиге указываем[gammu] port= /dev/ttyUSB0 connection = at
Проверяем:
sudo gammu --identify
Далее автоматизируем, должен быть установлен mysql, описывать не стану, информации полно.
sudo apt-get install gammu-smsd
Конфиг /etc/gammu-smsdrc
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
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; >! ```` Далее переходим
cd /usr/share/doc/gammu/examples/sql
sudo gunzip mysql.sql.gz
mysql -u root -p smsd < mysql.sql! ````
На этом настройки закончены. Ошибки смотреть в логах:cat /var/log/gammu.log cat /var/log/gammu-smsd.log >! ```` В скрипте используется драйвер mysql, соответственно, необходимо установить, или переустановить после каждого обновления драйвера javascript.
cd /opt/iobroker/node_modules/iobroker.javascript/
npm install mysqlСам скрипт: >! 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 заменить на соответствующую. Принимаю предложения, правки )) <size size="50">За русский язык простите, тяжко у меня с орфографией и грамматикой.</size>
-
Как и обещал, вторая версия скрипта, с получением баланса. Здесь будет больше нюансов, так что скорей всего придется поправлять.
Подготовка:
! Начнем, для отправки USSD запросов нам понадобится приложение gsm-ussd, берется http://linux.zum-quadrat.de/downloads/.
! После установки, надо подправить файл, выполняемsudo vi /usr/bin/gsm-ussd
Исправляем на
my $modemport = '/dev/ttyUSB2'; my @ussd_queries = ( '*101#' ); #тут указать код USSD вашего оператора
Проверяем работу приложения
sudo gsm-ussd -m /dev/ttyUSB2 --no-cleartext '*100#'
Если получили баланс или получили сообщение от оператора, то все работает правильно.
Теперь сам скрипт.
!
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' отвечающая за хранение текущего баланса.
Что может понадобится подправить:
! //Проверяем если у входящей СМС отправитель 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);
! }
! });
! });
Ну вроде все указал, описал. -
Отправка работает
Но входящие сообщения не показывает, вернее показывает только первое, а не последнее пришедшее
-
Он по порядку перебирает от объекта sms.in.id до текущего полученного id с базы данных.
-
"'sms.in.count' - Количество пришедших СМС" - всегда 1посмотрел базу, сравнил… скрипт выдает предпоследнее сообщение, если попытаться изменить sms.in.count
-
Он у тебя почему-то не целиком отрабатывает, так как после прочтения смс 'sms.in.count' изменяется на количество блоков смс. Поэтому у тебя постоянно первую смс и читает.
-
помоги настроить, плз..
насколько я понял, короткое сообщение читается так:
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 - номер сообщения в базе
правильно?
а как прочитать длинное?
-
Правильно, а длинное
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); }) } } })
-
а как определить, что пришло длинное?
-
а как определить, что пришло длинное? `
Самый первый запрос из приведенного кода. Если поле 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 !== ''){}
-
как получить конкретное сообщение?
как получить количество всех целых сообщений (включая собранных из кусков), а не общее количество кусков?
Помоги, плз,
Хотелось бы получить:
'sms.in.id' - номер последней пришедшей собранной СМС (а не номер последнего куска)
'sms.in.count' - Общее Количество пришедших СМС в базе (целых, а не общее количество кусков)
'sms.in.text' - Текст последней пришедшей СМС (у меня сейчас предпоследняя, так и не поборол)
И самое главное:
'sms.in.requesID' - Если тут ввести номер существующей СМС в базе…
'sms.in.requestTEXT' - ...то здесь увидим собственно текст запрошенной СМС
-
Большинство вопросов решил
Хотелось бы иметь возможность выборочно читать конкретное сообщение, сейчас только по 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); }); });
-
Так а что ты подразумеваешь под выборочным чтением, у тебя же по ID читает, ты хочешь по другому признаку? Подробней опиши что ты под этим понимаешь.
Еще бы я сделал по другому, убрал бы mysql пакет из js. Поставил драйвер SQL, настройки сохранил бы в нем, и через него запросы делал. Чуть безопаснее. Да и пакет в актуальном состоянии будет. Имхо.
-
да, читает четко по ID, но количество ID - это количество кусков, а не реальных сообщений. т.е. я отправил 3 сообщения, одно короткое, другое длинное (из 3 допустим кусков), третье опять короткое. следовательно количество ID будет 5, а количество сообщений - 3.
если выбирать по ID то 1 - это первое сообщение, 2, 3 или 4 - это второе, а 5 - это третье
а хотелось бы выбирать по Номеру сообщений, 1 - первое короткое, 2 - второе длинное из 3 частей, 3 - третье…
и да, mysql я бы убрал, если бы знал как
-
Убрать, я описал как.
Запросы после установки 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 из которых состоит СМС.
-
с базой не понял, надо новый инстанцию sql создавать? можно, если не затруднит, расписать чуть подробнее и по шагам?
-
База где хранится история объектов и входящие sms на одном сервере? Если да, то просто используете запросы, только в поле где указывали таблицу откуда делать выборку указываете через точку база.таблица. Если пользователи баз разные, то пользователю указанному в настройках драйвера для хранения истории необходимо дать права на чтение с базы SMS.
-
Не работает
Подскажите, плз, где ошибка?:
// () выдаем смс по запросу 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); } }); });
-
Пробуй так.
// () выдаем смс по запросу 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); }); } }); });
Мне кажется он неправильно формирует запрос с подстановкой данных.
-
не работает