ITCooky Recetas

Vamos a cocinar it cositas

Casa inteligente con TelegramBot en Node.js!

дата noviembre 7, 2019

Continúe desarrolar el tema «Quiero saber la temperatura y la humedad de la habitación desde cualquier parte del mundo» y qué mas elegir sino Telegram que es muy conocido ahora, vamos paso a pasito.

Cojo OrangePi Zero 512mb asi

Обзор-тестирование[пришлось еще одну купить] Orange Pi Zero 512Mb с коробкой и платой расширения!



La estación meteorológica en Arduino aún mide la temperatura y el resto, y esto a pesar de mi soldadura (la temperatura es inadecuada está inflada, pero este sensor DHT22 probablemente esté chamuscado)

arduino_ch340_temp_ehernet_018
Мониторим по сети — свет, температуру, движение с Arduino Uno R3 CH340G и строим графики!


Con el paso de tiempo, la cantidad de imágenes OS para OrenagePi de disminuyeron, me gustó DietPi pero dijeron « demonios sabe qué tipo de módulo WiFi hay aquí, no es posible codear papa el, vaya a «. Pero Arambien aún permanece, también dicen que «demonios sabe qué tipo de módulo WiFi hay aquí, no es posible codear papa el, puede tener errores «. Pero a aquellos a quienes les gustan las naranjas no son faciles de asustar; ¡no se trata de unos mimipc con instrucciones paso a paso para todas las ocasiones!

Descargo desde esta página www.armbian.com/orange-pi-zero/ Imagen Strech, el tamaño no esta, pero Debe caber en un pequeño archivo de 2 gb (subido).

Escribo en el SD tarjeta en mi Ubuntu. Conectaremos la tarjeta de memoria y veremos en el sistema dónde está
sudo lsblk
esta en sde la que es de 2 GB
Hay que sacar la (pero seguira entre laos isonos de diskos)
sudo umount /dev/sde1
ahora la borraremos
sudo mkfs.vfat -I /dev/sde
a desmontar
sudo umount /dev/sde
Desarchivamos la imagen y escribamos en la tarjeta, llevara unos minutos
Otra ves cambiaron el alchibador, el nuevo archivador es 7z hay que instalarlo en Ubuntu
sudo apt-get install p7zip
desarchivamos
p7zip -d Debian_stretch_next.7z
va la escritura
sudo dd bs=1M if=Armbian_5.38_Orangepizero_Debian_stretch_next_4.14.14.img of=/dev/sde

Insertamos la tarjeta en el orange zero, si no se carga, debe probar con otra tarjeta (esto es en realidad el 98% de los problemas de carga) para entrar Log in as: root Password: 1234. Y otro 2% de problemas se debe a una mala grabación de una unidad flash … No lo sé, la grabé por segunda vez y arranqué, tengo muchas SD de calidad malisima. Transcenent 2Gb sin indicar la velocidad – funciono para mi.

El IP de naranja lo veo el enrutador entre las emitidos, me conecto a través de SSH
sudo ssh root@192.168.1.218
Conectarse a Wi-Fi es rápido y fácil, vaya al menú de Armbian
sudo armbian-config
No voy a describir todo el processo de coneccion, me conecté a WiFi, grabe los settings, y se conecta por si mismo despues de reboot!

Ahora debo elegir qué, de qué, dónde, cómo, en general, el Telegram Bot funciona. Hay mucho para elegir, pero como no domino con soltura ninguno de los lenguajes de programación, por eso elijo Node.JS, ¡y por qué no! Parece que JS al final es JavaScript, pero es muy similar a C ++, no lo sé, pero lo he visto.

Al menos hay instrucciones, comenzaré siguiento pasos de este maravilloso artículo archakov.im/post/telegram-bot-on- nodejs.html envía inmediatamente a Google para instalar el Nodo Js, ¡pero está bien! Por cierto, nada funcionó para mí de acuerdo con estas instrucciones, pero me inspiró mucho…

Instalacion de Node.Js
Para eso hay dos comandas
curl -sL https://deb.nodesource.com/setup_9.x | bash -
apt-get install -y nodejs

En Arambian no esta la fuente del repositorio de Node.JS asi la linea uno lo añade. Se consumieron 56 megabytes, me temo por mi tarjeta de 2 Gb, por supuesto, aunque la encontré en la basura, pero es nueva. Y lo mas gracioso es que, por mucho que quieres ya no puedes comprar una tarjeta menos de16 gb, es decir, ¡puedes comprar 8 Gb pero a un precio de 16 Gb!

Verificando las versiones de lo que fue instalado por los comandos
root@orangepizero:~# node --version
v9.11.1
root@orangepizero:~# npm --version
5.6.0

Agregando seguridad
¡Siempre es útil ocultar su IP real de cualquier servicio público, especialmente si es algo smart y potencialmente pirateríable!

Instalando TOR
apt-get install tor

Hay un fallo en Debian no se puede hacer pasre con el boton izquierdo de mause en vim
se corrige eso creando un file
vi ~/.vimrc
con la linea

set mouse=

Despues de eso puedo pastear com mouse… a veces no se copian los primeros symbolos de linea…

Añádele al file
vi /etc/tor/torrc
esa line

SocksPort 127.0.0.1:9050

nada mas hace falta

Instalamos proxy servidor Privoxy
apt-get install privoxy
Añádele al file
vi /etc/privoxy/config
la linea

forward-socks5 / localhost:9050 .

Ejecutamos
service tor start
service privoxy restart

Chekeamos
Ese es nuestro IP indefencivo
curl ident.me
Y ese tras el proxy
curl -x http://localhost:8118 ident.me
Si son diferentes entonces funciona la cosa esa!
Lo añadimos a la automarcha
sudo update-rc.d privoxy enable
sudo update-rc.d tor enable

dice algo de perl, pero igual funciona

Creamos el bot y recibimos el token
Hay que hablar en Telegram con BotFather y invintar en nombre para el bot y el nickname, y asi nos da el token. Hay muchas instruccion para eso, quizas hasta en español(y si pensais que es todo una traduccion google pues no es un handjobe total)!

Instalamos y arrancamos Telegram Bot’a
Instalamos
npm install node-telegram-bot-api
Vemos la version
npm list node-telegram-bot-api
Creamos directorio y file
mkdir tbot
cd tbot
vi bot.js

Añadimos aca

const TelegramBot = require('node-telegram-bot-api');

// replace the value below with the Telegram token you receive from @BotFather
const token = 'YOUR_TOKEN_YOUR_TOKEN’;

// Create a bot that uses 'polling' to fetch new updates
const bot = new TelegramBot(token, {polling: true,
request: {
  proxy: "http://localhost:8118"
 }
});

// Matches "/echo [whatever]"
bot.onText(/\/echo (.+)/, (msg, match) => {
  // 'msg' is the received Message from Telegram
  // 'match' is the result of executing the regexp above on the text content
  // of the message

  const chatId = msg.chat.id;
  const resp = match[1]; // the captured "whatever"

  // send back the matched "whatever" to the chat
  bot.sendMessage(chatId, resp);
});

// Listen for any kind of message. There are different kinds of
// messages.
bot.on('message', (msg) => {
  const chatId = msg.chat.id;

  // send a message to the chat acknowledging receipt of their message
  bot.sendMessage(chatId, 'Received your message');
});

Ejecutamos
node bot.js
Y aquí está, encontramos en nuestro teléfono Telegram un bot por nickname o por el nombre ITCooky home y le escribimos: solo puede responder «Received your message» y repite el mensaje si comienza con /echo.

Agregamos al bot la función de informe de temperatura
Imaginé que iba a leer el archivo, que se forma a partir de la encuesta de la Arduino a través de http, y la última línea, como la temperatura actual, será mostrada por el bot en respuesta … Pues no, no sé cómo hacer esto, pero sé cómo responder con una imagen, y haré una imagen con scripts ordinarios: ¡la temperatura en el gráfico por 5 minutos, por hora, por día!

Estoy preparando los datos y el grafico, igual como aca artículo de SAP , ¡claro que se diferencia del FreeBSD un poco!

Instalamos el browser de consola
apt-get install lynx
Hacemos script
vi andmon.sh
Añadimos aca

#!/bin/bash
d=`/usr/bin/lynx -source -connect_timeout=10 192.168.1.177 | awk 'NR==2'`
if [ -z "$d" ]
then
t=`/bin/date +%Y"."%m"."%d"-"%H":"%M" "`
/bin/echo "${t} 0 0 0 0 0" >> /root/tbot/mon.log
exit
elif ! [ -z "$d" ]
then
t=`/bin/date +%Y"."%m"."%d"-"%H":"%M" "`
/bin/echo "${t}${d}" >> /root/tbot/mon.log
fi

Lo hacemos ejecutar
chmod +x andmon.sh
Y lo añadimos aca en el cron
crontab -e
la linea
*/1 * * * * /root/tbot/andmon.sh

Espero unos minutos y veo si aparece el file /root/tbot/mon.log esta aqui, ok

Instalamos un ploter que hase graficos
apt-get install gnuplot
hacemos un script
vi plot.sh
Añadimos aca

#!/bin/bash
/bin/cat /root/tbot/mon.log |/usr/bin/tail -n -5 | /usr/bin/xargs -n 6 /bin/echo > /root/tbot/temp5.log
/usr/bin/gnuplot << EOF
set terminal png size 800,500
set output '/root/tbot/temp5.png'
set autoscale y
set autoscale x
unset border
set xdata time
#set ytics 1
#set xtics 5 font "Verdana, 10" rotate 90
set grid
set timefmt "%Y.%m.%d-%H:%M"
set format x "%H:%M"
plot '/root/tbot/temp5.log' u 1:2 with lines linetype 1 t 'temperature C'
EOF
/bin/cat /root/tbot/mon.log |/usr/bin/tail -n -60 | /usr/bin/xargs -n 6 /bin/echo > /root/tbot/temph.log
/usr/bin/gnuplot << EOF
set terminal png size 800,500
set output '/root/tbot/temph.png'
set autoscale y
set autoscale x
unset border
set xdata time
#set ytics 1
#set xtics 5 font "Verdana, 10" rotate 90
set grid
set timefmt "%Y.%m.%d-%H:%M"
set format x "%H:%M"
plot '/root/tbot/temph.log' u 1:2 with lines linetype 1 t 'temperature C'
EOF
/bin/cat /root/tbot/mon.log |/usr/bin/tail -n -1440 | /usr/bin/xargs -n 6 /bin/echo > /root/tbot/tempd.log
/usr/bin/gnuplot << EOF
set terminal png size 800,500
set output '/root/tbot/tempd.png'
set autoscale y
set autoscale x
unset border
set xdata time
#set ytics 1
#set xtics 5 font "Verdana, 10" rotate 90
set grid
set timefmt "%Y.%m.%d-%H:%M"
set format x "%H"
plot '/root/tbot/tempd.log' u 1:2 with lines linetype 1 t 'temperature C'
EOF

Lo hasemos ejecutivo
chmod +x plot.sh
Añadimos al cron
crontab -e
la linea
*/1 * * * * /root/tbot/plot.sh

hacemos el script de bot
vi bot0.js
Añadimos aca

process.env["NTBA_FIX_350"] = 1;
process.env["NTBA_FIX_319"] = 1;

const TelegramBot = require('node-telegram-bot-api');

// replace the value below with the Telegram token you receive from @BotFather
const token = 'YOUR_TOKEN';

// Create a bot that uses 'polling' to fetch new updates
const bot = new TelegramBot(token, {polling: true,
request: {
  proxy: "http://localhost:8118"
 }
});


// Matches "/echo [whatever]"
bot.onText(/[T/t]est/, (msg, match) => {
const chatId = msg.chat.id;
bot.sendMessage(chatId, 'I am working');
});


bot.onText(/[T/t]emp5/, (msg, match) => {
const chatId = msg.chat.id;

    const photo5 = 'temp5.png';
    bot.sendPhoto(chatId, photo5, {caption: 'Temp last 5 min'});

});
bot.onText(/[T/t]emph/, (msg, match) => {
const chatId = msg.chat.id;

   const photoh = 'temph.png';
    bot.sendPhoto(chatId, photoh, {caption: 'Temp last 60 min'});

});
bot.onText(/[T/t]empd/, (msg, match) => {
const chatId = msg.chat.id;

   const photod = 'tempd.png';
    bot.sendPhoto(chatId, photod, {caption: 'Temp last 24h'});

});

Las primeras dos líneas son necesarias para que no haya errores amenazantes … No sé cómo funciona, pero todos lo ponen y los errores no aparecen

Comandos de bot, todos con mayúscula y minúscula
test – solo dice estoy vivo
temp5 – grafico de temperaturas de 5 min
temph – grafico de temperaturas de 1 hora
tempd – grafico de temperaturas de 24 horas

Simplemente ejecutarlo no es suficiente, me gustaría que se inicie después de reiniciar el systema

Para hacer eso, hay que instalar pm2

npm i pm2 -g

Ejecutamos
pm2 start bot0.js --name bot0
Y una commando mas, ahora bot arrancvara en boot
pm2 startup
Asi se puede ver que nodes a running
pm2 list

┌──────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────┬───────────┬──────┬──────────┐
│ App name │ id │ mode │ pid  │ status │ restart │ uptime │ cpu │ mem       │ user │ watching │
├──────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────┼───────────┼──────┼──────────┤
│ bot0     │ 0  │ fork │ 2376 │ online │ 0       │ 47m    │ 0%  │ 46.6 MB   │ root │ disabled │
└──────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────┴───────────┴──────┴──────────┘
 Use `pm2 show <id|name>` to get more details about an app

Monitoring
pm2 monit

Comnados para apagar y arrancar
pm2 stop App-name
pm2 start App-name

Quitar de pm2 del autostart
pm2 delete App-name

Hago reboot – y funciona!!!!

Añadimos un avatar al bot
Eso hay que hacverlo en telegram, decirle al @BotFather la frase /setuserpic y responder a sus preguntas y mandarle la imagen

Tareas pendientes Comprenda por qué OrangePi Zero se congela: sobrecalentamiento (poco probable), fuente de alimentación (cambio a propietario), módulo WiFi (cambio a Ethernet), tarjeta de memoria < / del> Sí, debido al power, reemplacé Auchanovskaya con un Xaomi patentado

– Hacer notificaciones bajo ciertas condiciones

– Y entender cómo restringir el acceso al bot (¡Uy!)

Hacemos notificación bajo ciertas condiciones
Ufff fue duro, emocionante, doloroso, pero agradable. Algo permaneció incomprensible, ¡pero hay un resultado! Cerebro da vueltas tras aprender un nuevo idioma, sintaxis!

Lo primero que no entendí fue cómo obtener el segundo valor desde la línea usando las herramientas Node.js, es facil hacer con comandos de consola, así que inserto la línea en el archivo para el ploter

/bin/cat /root/tbot/mon.log |/usr/bin/tail -n -5 | /usr/bin/awk '{print $2}' > /root/tbot/tw.log

Eso hace file tw.log donde en la columna hay cinco valores de temperatura para los últimos cinco minutos, y lo mismo para la humedad hw

en fin tengo dos file con estatisticas para hacer graficos
plotmin.sh

#!/bin/bash
/bin/cat /root/tbot/mon.log |/usr/bin/tail -n -5 | /usr/bin/xargs -n 6 /bin/echo > /root/tbot/mon5.log
/bin/cat /root/tbot/mon.log |/usr/bin/tail -n -5 | /usr/bin/awk '{print $2}' > /root/tbot/tw.log
/bin/cat /root/tbot/mon.log |/usr/bin/tail -n -5 | /usr/bin/awk '{print $3}' > /root/tbot/hw.log

/usr/bin/gnuplot << EOF
set terminal png size 800,500
set output '/root/tbot/temp5.png'
set autoscale y
set autoscale x
unset border
set xdata time
#set ytics 1
#set xtics 5 font "Verdana, 10" rotate 90
set grid
set timefmt "%Y.%m.%d-%H:%M"
set format x "%H:%M"
plot '/root/tbot/mon5.log' u 1:2 with lines linetype 1 t 'temperature C'
EOF
/usr/bin/gnuplot << EOF
set terminal png size 800,500
set output '/root/tbot/hum5.png'
set autoscale y
set autoscale x
unset border
set xdata time
#set ytics 1
#set xtics 5 font "Verdana, 10" rotate 90
set grid
set timefmt "%Y.%m.%d-%H:%M"
set format x "%H:%M"
plot '/root/tbot/mon5.log' u 1:3 with lines linetype 2 t 'humidity %'
EOF

y plot.sh

#!/bin/bash
/bin/cat /root/tbot/mon.log |/usr/bin/tail -n -60 | /usr/bin/xargs -n 6 /bin/echo > /root/tbot/monh.log
/usr/bin/gnuplot << EOF
set terminal png size 800,500
set output '/root/tbot/temph.png'
set autoscale y
set autoscale x
unset border
set xdata time
set grid
set timefmt "%Y.%m.%d-%H:%M"
set format x "%H:%M"
plot '/root/tbot/monh.log' u 1:2 with lines linetype 1 t 'temperature C'
EOF
/bin/cat /root/tbot/mon.log |/usr/bin/tail -n -1440 | /usr/bin/xargs -n 6 /bin/echo > /root/tbot/mond.log
/usr/bin/gnuplot << EOF
set terminal png size 800,500
set output '/root/tbot/tempd.png'
set autoscale y
set autoscale x
unset border
set xdata time
set grid
set timefmt "%Y.%m.%d-%H:%M"
set format x "%H"
plot '/root/tbot/mond.log' u 1:2 with lines linetype 1 t 'temperature C'
EOF
/usr/bin/gnuplot << EOF
set terminal png size 800,500
set output '/root/tbot/humh.png'
set autoscale y
set autoscale x
unset border
set xdata time
set grid
set timefmt "%Y.%m.%d-%H:%M"
set format x "%H:%M"
plot '/root/tbot/monh.log' u 1:3 with lines linetype 2 t 'humidity %'
EOF
/usr/bin/gnuplot << EOF
set terminal png size 800,500
set output '/root/tbot/humd.png'
set autoscale y
set autoscale xи вставляю
unset border
set xdata time
set grid
set timefmt "%Y.%m.%d-%H:%M"
set format x "%H"
plot '/root/tbot/mond.log' u 1:3 with lines linetype 2 t 'humidity %'
EOF

se arrancar por el cron
crontab -e
la linea
*/1 * * * * /root/tbot/plotmin.sh
*/5 * * * * /root/tbot/plotmin.sh

Reescribí el bot, por alguna razón no funciono funciones () , aparentemente algo se insertó y pasó parámetros de los paréntesis, por lo que el código se repite.
El bot mismo está haciendo un archivo
vi itchomebot.js
y añado

process.env["NTBA_FIX_350"] = 1;
process.env["NTBA_FIX_319"] = 1;

const TelegramBot = require('node-telegram-bot-api');
// replace the value below with the Telegram token you receive from @BotFather
const token = '5YouR_b0t_tokEn_heAR';

const adminId = 1112t2333;

// Create a bot that uses 'polling' to fetch new updates
const bot = new TelegramBot(token, {polling: true,
request: {
  proxy: "http://localhost:8118"
 }
});

// start var
var fs = require('fs');
var readline = require('readline');
var stream = require('stream');
//for min max status
tw1 = 29;
alert1 = 0;
tw2 = 15;
alert2 = 0;
hw1 = 70;
alert3 = 0;
hw2 = 20;
alert4 = 0;
// end var

//start all 


bot.onText(/[T/t]est/, (msg, match) => {
bot.sendMessage(msg.chat.id, 'I am working');
});

//start help
bot.onText(/\/help/, (msg, match) => {
bot.sendMessage(msg.chat.id, 'Manual:\n/start - start and subscribe for warnings\n/help - this manual\n/toadmin text - send message to bot admin\n/touser 111222333 "text" - send message to user(only for admin)\nTest - test\nTemp5 - temp stat for 5 min\nTemph - temp stat for last 60 min\nTempd - temp stat for last 24h\nHum5 - humidity stat for 5 min\nHumh - humidity stat for last 60 min\nHumd - humidity stat for last 24h\nKkk -to run inline keybord\n/warnings off - warnings off\n/warnings on - warnings on');
});
//end help

//start send message to bot admin
bot.onText(/\/toadmin (.+)/, (msg, match) => {
  const fromUser = msg.from.id;
  const resp = match[1]; // the captured "whatever"
  bot.sendMessage(adminId, 'Message from ' + fromUser + ' "' + resp + '"');
});
//ens send message to bot admin

//start send message to user 
bot.onText(/\/touser (.+) "(.+)"/, (msg, match) => {
  const fromUser = msg.from.id;
 const touserId = match[1]
 const touserText = match[2]
if (fromUser == adminId) {
  bot.sendMessage(touserId, 'Message from bot admin: "' + touserText + '"');
} else {
bot.sendMessage(fromUser, 'You are not athtorised');
};
});
//ens send message to user 

//start send pic stat
bot.onText(/[H/h]um5/, (msg, match) => {
  bot.sendPhoto(msg.chat.id, 'hum5.png', {caption: 'Humidity last 5 min'});
});
bot.onText(/[H/h]umh/, (msg, match) => {
  bot.sendPhoto(msg.chat.id, 'humh.png', {caption: 'Humidity last 60 min'});
});
bot.onText(/[H/h]umd/, (msg, match) => {
  bot.sendPhoto(msg.chat.id, 'humd.png', {caption: 'Humidity last 24h'});
});
bot.onText(/[T/t]emp5/, (msg, match) => {
  bot.sendPhoto(msg.chat.id, 'temp5.png', {caption: 'Temp last 5 min'});
});
bot.onText(/[T/t]emph/, (msg, match) => {
  bot.sendPhoto(msg.chat.id, 'temph.png', {caption: 'Temp last 60 min'});
});
bot.onText(/[T/t]empd/, (msg, match) => {
  bot.sendPhoto(msg.chat.id, 'tempd.png', {caption: 'Temp last 24h'});
});
//end send pic stat

//start start 
bot.onText(/\/start/, (msg, match) => {
bot.sendMessage(msg.chat.id, 'Welcome! This is ItCooky.com TelegramBot running on OrangePi PC Plus 1Gb RAM 8Gb eMMC\n\n For recieve warnings run:\n/warnings on');
});
//end start 



//start warnigs 

//start find midscope by file name
function midscope(arg1, callback) {
var arrreadfile = [];
readline.createInterface(fs.createReadStream(arg1), new stream).on('line', function(line) {
arrreadfile.push(line);
});
readline.createInterface(fs.createReadStream(arg1), new stream).on('close', function() {
var arrvaluesfromfile = arrreadfile.map(function (x) {
return parseInt(x, 10);
});
const reducer = (accumulator, currentValue) => accumulator + currentValue;
 var midscopevalue = (arrvaluesfromfile.reduce(reducer) / arrvaluesfromfile.length);
callback (midscopevalue);
});
};
//stop find midscope by file name

//start send messages to id in list file
function sendtoidfromfile (arg1,arg2,arg3,arg4) {
readline.createInterface(fs.createReadStream(arg1), new stream).on('line', function(line) {
bot.sendMessage(line, '' + arg2 + arg3 + arg4 + '');
});
readline.createInterface(fs.createReadStream(arg1), new stream).on('close', function() {
});
}


//end send messages to id in list file



function warningtemp(arg1,arg2) {
midscope ('./tw.log', function (num) {
if (num >= arg1 &&  alert1 == 0 )
{

sendtoidfromfile ('./warning_users.id','WARNING: Height Temp in badroom! More than ',tw1,'C!');

alert1 = 1;
} else {
if (num < arg1 && alert1 == 1 )
{
sendtoidfromfile ('./warning_users.id','RELAX: Normal temp in badroom! Less than ',tw1,'C!');
alert1 = 0;
};
};
if (num <= arg2 &&  alert2 == 0 )
{

sendtoidfromfile ('./warning_users.id','WARNING: Low Temp in badroom! Less than ',arg2,'C!');

alert2 = 1;
} else {
if (num > arg2 && alert2 == 1 )
{
sendtoidfromfile ('./warning_users.id','RELAX: Normal temp in badroom! More than ',arg2,'C!');
alert2 = 0;
};
};
});


};
setInterval(warningtemp, 300500, tw1, tw2);

function warninghum(arg1,arg2) {
midscope ('./hw.log', function (num) {
if (num >= arg1 &&  alert3 == 0 )
{

sendtoidfromfile ('./warning_users.id','WARNING: Height humidity in badroom! More than ',arg1,'%!');

alert3 = 1;
} else {
if (num < arg1 && alert3 == 1 )
{sendtoidfromfile ('./warning_users.id','RELAX: Normal humuduty in badroom! Less than ',arg1,'%!');
alert3 = 0;
};
};
if (num <= arg2 &&  alert4 == 0 )
{

sendtoidfromfile ('./warning_users.id','WARNING: Low humidity in badroom! Less than ',arg2,'%!');

alert4 = 1;
} else {
if (num > arg2 && alert4 == 1 )
{sendtoidfromfile ('./warning_users.id','RELAX: Normal humidity in badroom! More than ',arg2,'%!');
alert4 = 0;
};
};
});


};
setInterval(warninghum, 290000, hw1, hw2);


//end warnigs


//set warnings on
bot.onText(/\/[W/w]arnings on/, (msg, match) => {
var users = msg.from.id;
var dubl = 0;
var instream = fs.createReadStream('./warning_users.id');
var rl = readline.createInterface(instream, new stream);
rl.on('line', function(line) {
console.log(line);
if ( line == users) {
dubl = dubl + 1;
};
});
rl.on('close', function() {
 if (dubl == 0) {
var fs = require('fs');
fs.appendFile('warning_users.id', `${users}\n`, (error) => { console.log("Error!");
});
bot.sendMessage(msg.chat.id, 'Youv bin subscribed to warnings');
};
if (dubl != 0) {
bot.sendMessage(msg.chat.id, 'You are allready subcribed to warnings');
};
});
});
//end set warnings on



//delete form warnings function arg file name and word

function delstring(arg1,arg2) {
var value = arg2 + '\n';
var datafromfile = fs.readFileSync('./' + arg1, 'utf-8');
var newDataFile = datafromfile.replace(value, '');
fs.writeFileSync('./' + arg1, newDataFile, 'utf-8');
};

//end delete functions


//start warnigs off 
bot.onText(/[W/w]arnings off/, (msg, match) => {
var user = msg.from.id;
filename = 'warning_users.id';
delstring(filename, user);

});

Borro de la lista el viejo bot
pm2 delete bot0
y arranco el nuevo
pm2 start itchomebot.js --name ITCooky
y repito otra vez
pm2 startup
Los trozos de código están firmados. No sepuede enviar notificaciones sin conocer los ID de usuarios, debe recopilarlos. El evento para recopilar / start se ejecuta por todos los inicios de sesión nuevos en el bot. Si deseas recibir notificaciones, diga al bot /warnings on

ID se anade al archivo, pero primero se verifica si ya está allí. Será necesario eliminarlo de esta lista a solicitud del usuario, pero luego más tarde. Para desactivar las notoficaciones /warnings off

Además (al final del bot con //start warnigs for height temp ) se considera el valor promedio del archivo tw.log , aquí las decimas se pierden, pero no necesito tal precisión, entonces en comparación con el valor de tw , si hay más, se abre un archivo con ID y se les envía un mensaje.
EEsa funcion se inicia con ese comando

setInterval(warning, 300000);

que funciona cada 300 segundos (para advertencias posteriores agregue medio segundo a este plazo, de modo que no se procese todo al mismo tiempo). Una notificación llega cuando funciona y la segunda cuando la condición deja de funcionar. Solía venir cada 5 minutos y era estresante.

Puede enviar un mensaje al administrador del bot /toadmin text . Debe designar un administrador del bot para esto, debe registrar su número de 9 dígitos al principio en cons = 111222333 no se ve el id tan facil desde teelgram app, pero está escrito en warnings_users.id. El administrador también puede enviar /touser 111222333 «texto»

UPD
Lo reescribí de nuevo, al bot. No sé por que, sera porque no entiendo bien la programación asincrónica (lo mas probable), o solo porque no es apta para lo que hago. Me las arreglé para meter en la función midscope (la ruta al argumento del archivo) el calculo mediano de las 5 valores – para sacar este valor de la función no funcionó, por lo que todo funciona en esta función. Logré enviar mensajes por ID desde un archivo en la función sendtoidfromfile (ruta de argumentos a un archivo con ID, primera parte del mensaje, valor métrico, final del mensaje). Hay algún tipo de problema con las variables globales en Node.Js, pero si las declara así al principio ( alert1 y así sucesivamente) entonces funcionan, pasan por funciones, los valores no se extraen de las funciones, aunque se extraen en ejemplos de entrenamiento … Bueno, nada, el bot está funcionando de nuevo, ¡el bot vuelve a señalar cuando la temperatura o la humedad en el dormitorio es demasiado alta o baja!

UPD: Añadimos un teclado en pantalla a TelegramBot

Todo el mundo dice que es facil, clarosi hubieran ejemplos en el manual de telegram, si! Pero no hay ejemplos!

Agregue esto al final del bot.

//custome keyboard settings
const keyMYboard = {
   reply_markup: {
       inline_keyboard: [
           [
{text: `Temperature`, callback_data:'t'},
{text: `5m`, callback_data:'temp5'},
{text: `1h`, callback_data:'temph'},
{text: `24h`, callback_data:'tempd'}
  ],[
{text: `Humidity`, callback_data:'h'},
{text: `5m`, callback_data:'hum5'},
{text: `1h`, callback_data:'humh'},
{text: `24h`, callback_data:'humd'}
]]}}

//this runs inline keyboard
bot.onText(/[K/k]kk/, (msg, match) => {
bot.sendMessage(msg.chat.id, 'ITChomeBot Keyboard', keyMYboard);
});

//this start button press reader - only once ofr all inline_keyboards imho
bot.on('callback_query', function (msg) {
if (msg.data === 'temp5'){
bot.sendPhoto(msg.from.id, 'temp5.png', {caption: 'Temp last 5 min'});
bot.answerCallbackQuery(msg.id, "Done", false);
}
if (msg.data === 'temph'){
bot.sendPhoto(msg.from.id, 'temph.png', {caption: 'Temp last 60 min'});
bot.answerCallbackQuery(msg.id, "Done", false);
}
if (msg.data === 'tempd'){
bot.sendPhoto(msg.from.id, 'tempd.png', {caption: 'Temp last 24h'});
bot.answerCallbackQuery(msg.id, "Done", false);
}
if (msg.data === 'hum5'){
bot.sendPhoto(msg.from.id, 'hum5.png', {caption: 'Humidity last 5 min'});
bot.answerCallbackQuery(msg.id, "Done", false);
}
if (msg.data === 'humh'){
bot.sendPhoto(msg.from.id, 'humh.png', {caption: 'Humidity last 60 min'});
bot.answerCallbackQuery(msg.id, "Done", false);
}
if (msg.data === 'humd'){
bot.sendPhoto(msg.from.id, 'humd.png', {caption: 'Humidity last 24h'});
bot.answerCallbackQuery(msg.id, "Done", false);
}
});


Rearrancamos al bot
pm2 stop ITCooky
pm2 start ITCooky

Realmente, todo es facil. Primero, cree un nombre constante (cualquiera) keyMYboard, luego describa el texto que estará en el botón y lo que enviará. Resulta que no puedes simplemente enviar mensajes de texto al botón, sino que debe enviar algo, no importa si solo necesitas un botón con texto.

Para llamar al teclado, escribimos al bot Kkk o kkk. Él responde, como siempre, pero al final del comando después del texto aparece eldel teclado.

A continuación, captamos las respuestas de los botones con bot.on y if – aquí solo quería enviar el texto del comando al que debería responder el bot, no, no funcionó, tuve que describirlo por completo. Después de hacer click en el botón en su esquina izquierda, algo gira y continúa girando durante un tiempo, incluso cuando se recibe la respuesta, eso molesto. Resultó que este no pasa en todos los ejemplos de Internet, pero es un error: después de tomar la respuesta del botón, debemos responder el botón para que no espere y no gire. Para hacer esto, pon

bot.answerCallbackQuery(msg.id, "Done", false);

– si se establece en true el Done se verá en pantalla completa y se verá obligado a hacer clic nuevamente en OK.

Hubo un misterio que cuando lanzó el teclado una vez despues obtuvo una respuesta, la segunda vez obtuvo dos respuestas con solo hacer click en un botón, y así sucesivamente. Saqué el manejador de teclas de la llamada del teclado, es suficiente ejecutarlo por separado una vez y procesará todo, de lo contrario, hubo tantos teclados como pulsaciones de teclas, por lo tanto, las respuestas se multiplicaban.


One Response to “Casa inteligente con TelegramBot en Node.js!”

  1. […] La idea inicial era esta: el bot de Telegram guarda todas las imágenes que le mandan, luego, cada dos minutos, comienza el procesamiento de las imágenes en la carpeta y el resultado se envía a todos. El nombre del destinatario estará en el nombre del archivo… todo parece ser simple, pero resultó ser muy difícil de hacer: debe profundizar en la asincronía y, en general… Entonces todo será simple y lineal, recibe una foto, va a procesarla de inmediato y ¡que los demas esperen! Y esta vez lo hare en Python, no en vano escuché (y bueno, hice toda las tareas) un curso gratisCS50’s Introduction to Programming with Python, y la vez anterior (hace 4 años ¡Mamma Mia!) todo estaba hecho en node.js Casa inteligente con TelegramBot en Node.js! […]

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *