Meteoclimatic

Hardware => Ordenadores => Mensaje iniciado por: vixium en 12 de Noviembre del 2018, 12:50:15 pm

Título: [Ayuda] BASH para reiniciar la RasPi
Publicado por: vixium en 12 de Noviembre del 2018, 12:50:15 pm
Buenas tardes,

Tengo una PCE conectada a una RasPi y tengo un problema de desconexiones que se solucionan reiniciando todo. He conseguido que al reiniciar la RasPi se reinicie también la consola de la PCE, así que ya lo único que me queda para no perder los datos con estos cortes es automatizar el proceso.

Por ello, necesito ayuda para programar un bash en linux que se ejecute cada minuto (se mete en el crontab) y que éste compare el fichero realtime.txt que utiliza cumulusMX. Detallo más la teoría:

- Tengo un fichero realtime.txt que contiene la fecha, la hora y todos los valores registrados por la estación.
- Este fichero se sobreescribe con datos nuevos cada minuto.

La idea es guardar los datos de los 3 últimos ficheros (3 minutos) y comparar si la velocidad del viento, temperatura, humedad, etc son idénticos.

--> Si son idénticos: la estación ha perdido señal y el realtime solo está actualizando la hora, pero no los datos de sensores, porque se ha quedado con el último valor. Por lo tanto: reboot.
--> Si son diferentes: no hacer nada.

Ya digo, la teoría es facil, pero no tengo ni tiempo ni conocimiento para hacerlo. ¿alguien que controle me puede ayudar?¿a alguien se le ocurre otra solución?

Gracias!!
Título: Re:[Ayuda] BASH para reiniciar la RasPi
Publicado por: jmviper en 12 de Noviembre del 2018, 21:02:12 pm
Hola vixium

Sí se puede hacer... en programación prácticamente todo es posible... he creado el bash con lo poco que me sé (y googleando un rato  *+* *+*) y debo de decir que probándolo funciona...

El problema es que hay que restringir muuuucho los campos a leer del realtime.txt que genera Cumulus… explico... algunos campos aunque se pierda la señal del viento pueden ir siendo alterados (o tardar tiempo en serlo) por Cumulus como el Rain rate o la velocidad media del viento por lo que no serían exactamente "iguales".

El script es este:

Código: [Seleccionar]
#!/bin/bash

realtime='/etc/CumulusMX/realtime.txt'
check='/home/pi/cumuluscheck.txt'

cat $realtime | cut -d ' ' -f 3-5,7-8 >> $check
lineas=$(wc -l < $check)
lineas2=$(uniq $check | wc -l)
if [[ $lineas == 4 ]]
then sed -i '1d' $check
elif [[ $lineas -lt 3 ]]
then exit
fi
if [[ $lineas2 == 1 ]]
then rm $check
     reboot
fi

Te lo comento un poco.

al principio en realtime= y en check= aparecen las rutas (siempre éstas entre comillas) donde se encuentra el archivo realtime de Cumulus MX (depende de dónde lo hayas puesto) y del archivo que servirá para comparar líneas que se ubicará por defecto en /home/pi

Comparará sólo los campos de temperatura, humedad, punto de rocío y velocidad y dirección del viento. El peligro de esto es que si por ejemplo tu estación está 3 minutos con la misma temperatura, humedad y por ejemplo el viento está a 0 km/h que puede fácilmente darse en situaciones de inversión térmica en las que no hay casi variación el script haría que se reiniciase la raspi.

Yo, en vez de cada minuto pondría que cada 3 ó cada 5 minutos comparase los 3 registros (se puede variar el número de registros a comparar)

Si creas el archivo con nano hazlo con sudo delante para que sea propiedad de root y ponle permisos de ejecución con sudo chmod +x nombredelarchivo (que deberá terminar en extensión .sh)

Ponlo en el crontab de root (sudo crontab -e), por ejemplo */3 * * * * rutadelarchivobash ejecutaría el script cada 3 minutos por lo que si en esos 9 minutos esos valores son inguales en todas las líneas reiniciaría la Raspi.

Si tienes alguna duda o quieres saber algo por aquí estoy

saludos
Título: Re:[Ayuda] BASH para reiniciar la RasPi
Publicado por: vixium en 16 de Noviembre del 2018, 12:28:38 pm
Acabo de verlo, estoy pendiente de probarlo en cuanto tenga un hueco libre (este finde pretendo ponerme un rato con este tema).

Muchísimas gracias!! os comentaré las novedades!

Un saludo
Título: Re:[Ayuda] BASH para reiniciar la RasPi
Publicado por: vixium en 16 de Noviembre del 2018, 18:02:59 pm
Probado y funcionando.

He modificado algunas cosas, he metido más variables (6 en total: temperatura, humedad, punto de rocío, velocidad media, racha máxima y dirección de viento)

También he modificado el número de líneas a escribir en el fichero (de 3 a 5).

En resumen, se ejecuta cada 2 minutos y guardo las 5 últimas ejecuciones del script. Si todas son iguales (10 minutos con las mismas medidas de las 6 variables), reinicio.

Gracias a todos y en especial a jmviper!
Un saludo
Título: Re:[Ayuda] BASH para reiniciar la RasPi
Publicado por: jmviper en 16 de Noviembre del 2018, 20:21:26 pm
Ok puedes modificarlo a tu gusto.

La velocidad media del viento se quedaría al cabo de poco tiempo igual a la racha actual si ésta se quedase estancada.

En cuanto a ponerlo a 5 registros habrás tenido que modificar los condicionales del script de esta manera:

Código: [Seleccionar]
if [[ $lineas == 6 ]]
then sed -i '1d' $check
elif [[ $lineas -lt 5 ]]
then exit
fi
if [[ $lineas2 == 1 ]]
then rm $check
     reboot
fi

Que te funcione como se espera  ;)

saludos
Título: Re:[Ayuda] BASH para reiniciar la RasPi
Publicado por: meteoalcolea en 12 de Octubre del 2020, 18:40:26 pm
Como ya he puesto en otro hilo del foro, estoy teniendo cortes de señal entre el sensor exterior y la consola de la PCE. La única forma de solucionarlo es apagando la consola y volviéndola a encender. ¿Se podría hacer algo similar a lo anterior para que cuando weewx detecte que no recibe datos de la consola la reinicie? No sé si puede ayudar, pero en el fichero index.html los datos de temperatura, humedad,....... aparecen como N/A.

Gracias!
Título: Re:[Ayuda] BASH para reiniciar la RasPi
Publicado por: jmviper en 12 de Octubre del 2020, 22:57:21 pm
Hola meteoalcolea

Prueba esto:

Código: [Seleccionar]
#!/bin/bash

rutaplantilla=/var/www/html/weewx/meteoclimatic/meteoclimatic.htm
temp=$(cat $rutaplantilla | grep TMP)
temp="${temp// /}"
if [[ $temp == "*TMP=N/A" ]]
then reboot now
fi


Te lo dejo como adjunto en mi mensaje como weewxcheck.sh

Solo debes de mirar que rutaplantilla= tenga la ruta absoluta a la plantilla de meteoclimatic.

Independientemente de donde la pongas (lo normal sería en /home/pi) le das permisos de ejecución con sudo chmod +x weewxcheck.sh

Una vez hecho entras en el crontab de root con sudo crontab -e y al final del mismo en una nueva línea pones */5 * * * * /home/pi/weewxcheck.sh
si lo has puesto en /home/pi

Reiniciará la raspi si encuentra en el campo de temperatura de la plantilla *TMP=N/A

Título: Re:[Ayuda] BASH para reiniciar la RasPi
Publicado por: meteoalcolea en 12 de Octubre del 2020, 23:05:35 pm
Hola jmviper.

Muchas gracias por tu respuesta!!

Esto también me reiniciará la consola? Es que si no se reinicia no vuelve a coger señal del sensor exterior.

Saludos!
Título: Re:[Ayuda] BASH para reiniciar la RasPi
Publicado por: jmviper en 12 de Octubre del 2020, 23:34:27 pm
Eso solo reinicia la raspi y por lo tanto weewx, no la consola de la estación.

En weewx hay documentación al respecto y dice que no hay más alternativa que reiniciar la consola manualmente (quitar pilas etc etc) pero que hay unas líneas que se pueden poner en weewx.conf para evitar, en la medida de lo posible, esos cuelgues:

https://github.com/weewx/weewx/wiki/FineOffset%20USB%20lockup
Título: Re:[Ayuda] BASH para reiniciar la RasPi
Publicado por: meteoalcolea en 12 de Octubre del 2020, 23:45:17 pm
Pero mi consola no deja de comunicarse con la raspi por USB. El problema es que deja de recibir datos del sensor exterior. Y hasta que no se reinicia la consola, no vuelve a recibir datos. Se podría apagar y volver a encender el USB de la raspi? Con esto reiniciaria la consola, no?

Muchas gracias por tu ayuda!!
Título: Re:[Ayuda] BASH para reiniciar la RasPi
Publicado por: jmviper en 13 de Octubre del 2020, 00:11:59 am
No creo que se pueda reiniciar la consola desde el USB.

De todas maneras espera a ver si alguien que la tenga sepa de algo que funcione al respecto aunque va a ser difícil.

Saludos
Título: Re:[Ayuda] BASH para reiniciar la RasPi
Publicado por: meteoalcolea en 13 de Octubre del 2020, 08:56:51 am
En el primer mensaje, vixium decía "He conseguido que al reiniciar la RasPi se reinicie también la consola de la PCE". Eso sería perfecto para solucionar mi problema. Pero no sé cómo hacerlo. Cuando reinicio la raspi, la consola no se reinicia (estando sin pilas, claro está).

Saludos!
Título: Re:[Ayuda] BASH para reiniciar la RasPi
Publicado por: jmviper en 13 de Octubre del 2020, 09:45:24 am
Faltaría saber cómo lo hizo posible.

De las pocas soluciones que se me ocurren estaría ponerle un relé gobernado por el GPIO de la raspi que reiniciase la consola.

Por aquí (https://www.amazon.es/Babysbreath17-Profundidad-acoplador-sustituci%C3%B3n-Arduino/dp/B07KJH83WL/ref=sr_1_1?__mk_es_ES=%C3%85M%C3%85%C5%BD%C3%95%C3%91&dchild=1&keywords=Babysbreath17+relay&qid=1602574473&sr=8-1) hay alguno barato barato.

La cuestión sería cacharrear y conseguir alguna librería o script que trabaje con él.
Título: Re:[Ayuda] BASH para reiniciar la RasPi
Publicado por: meteoalcolea en 13 de Octubre del 2020, 12:25:34 pm
Podría servir algo de lo que hablan aquí? Me pierdo.....

https://raspberrypi.stackexchange.com/questions/9264/how-do-i-reset-a-usb-device-using-a-script/59417#59417?newreg=7e82992000fa475b85cb5d71181b9c9f

Gracias!!
Título: Re:[Ayuda] BASH para reiniciar la RasPi
Publicado por: jmviper en 13 de Octubre del 2020, 13:13:20 pm
Ahí hablan de resetear el puerto USB pero lo que hay que hacer es resetear la consola de su fuente de alimentación, ya sea pilas o corriente o las dos cosas a la vez.
El quitar el cable USB que transmite los datos a la raspi no va a resetear la consola sino solamente la comunicación consola - raspi y no consola - sensores.

Título: Re:[Ayuda] BASH para reiniciar la RasPi
Publicado por: meteoalcolea en 13 de Octubre del 2020, 13:54:32 pm
Muchas gracias jmviper. Me pierdo en estos temas.

Saludos!!
Título: Re:[Ayuda] BASH para reiniciar la RasPi
Publicado por: jantoni en 13 de Octubre del 2020, 20:11:05 pm
No sé a qué os referís por "resetear" el usb.

El problema es que, si la consola se alimenta por el puerto USB desde la Raspberry Pi, la cosa va a estar jodida, puesto que el reinicio de la Raspi, no tiene por qué implicar una pérdida de la señal de 5V en el puerto USB.

Y aunque lo implique, la pérdida de la tensión de +5V en el puerto USB debe ser suficientemente larga para que la consola se apague.

Lo único que se me ocurre es engañar al sistema. Pero tiene sus peligros. Me explico.

1.- Habría que utilizar unos script al efecto. En este post, ya explicaba como habilitar unos scripts en bash para Orange Pi. Habría que ver la librería correspondiente para Raspberry Pi y si coinciden los puertos Gpio.      https://forum.meteoclimatic.net/index.php/topic,2782.0.html

2.- En el caso de querer reiniciar la raspberry y tirar abajo el puerto USB, habría que hacer una secuencia como esta:

     Primero: Cerrar Weewx y su base de datos.
     Segundo: Sincronizar la tarjeta para evitar pérdida de datos que hubiera en caché (vamos, un sync de toda la vida)
     Tercero: No reiniciar la placa Pi (sea orange o raspi), sino mediante un relé quitarle la alimentación. (ese es el peligro que es un apagón)

3.- El puerto GPIO tiene que estar enlazado con un relé que esté configurado para estar cerrado por defecto. Es decir, siempre estará cerrado salvo que se de la instrucción por el GPIO para que se abra (en el momento de abrir cortará la alimentación a la placa PI).

4.- Al activar el GPIO se abrirá el relé y se perderá la alimentación de la raspi, que se apagará. Al estar el relé configurado en la posición de cerrado, la raspi debería iniciar el arranque de forma inmediata.

Todo esto debería funcionar en teoría. Hay que probarlo en la práctica, puesto que ese corte de corriente, puede que tampoco sea suficientemente largo para reiniciar la consola.

Los scripts eran versión alfa......creo recordar que había algún error, que no sé si está corregido en el foro.
Título: Re:[Ayuda] BASH para reiniciar la RasPi
Publicado por: jantoni en 13 de Octubre del 2020, 20:12:35 pm
Y, por otro lado, tenéis la opción de deshabilitar los +5V en los puertos USB

https://www.raspberrypi.org/forums/viewtopic.php?t=172313#:~:text=there%20is%20no%20hardware%20to,power%20lines%20are%20wired%20together.

el problema de estos métodos, es que los kernel y los raspbian (ahora RaspOS) cambian mucho........y lo que hoy funciona, mañana no

Ah.....y dado la diferencia entre los hardware de las diferentes placas de Raspberry Pi, estos sistemas pueden funcionar en algunas versiones, y en otras no.

Cada uno que haga las pruebas que estime oportunas, je ej
Título: Re:[Ayuda] BASH para reiniciar la RasPi
Publicado por: jmviper en 14 de Octubre del 2020, 08:25:40 am
Ummm, eso no lo sabía yo exactamente....que esta estación se alimentaba a pilas o por el puerto USB sin fuente de alimentación...

Entonces podría valer el script que puse antes (que puede entrar en un bucle sin fin de reinicios de la raspi, no lo probéis, habría que ampliar el intervalo de 5 minutos en el crontab como mínimo siendo mayor que el tiempo de generación de la plantilla) modificando la parte del reinicio por esa desconexión y tras unos segundos vuelta a conectar del USB.

Jantoni y yo ya hemos hablado al respecto y a ver si hoy podemos poner un script para probarlo porque parece ser que cada versión de raspi tiene su propio comando para deshabilitar puertos USB.
Título: Re:[Ayuda] BASH para reiniciar la RasPi
Publicado por: jantoni en 14 de Octubre del 2020, 19:59:01 pm
Esta es la versión preliminar del script
Título: Re:[Ayuda] BASH para reiniciar la RasPi
Publicado por: meteoalcolea en 14 de Octubre del 2020, 21:30:56 pm
En cuanto pueda lo pruebo.
Muchas gracias por vuestra ayuda y esfuerzo.
Saludos!!
Título: Re:[Ayuda] BASH para reiniciar la RasPi
Publicado por: jantoni en 16 de Octubre del 2020, 08:14:10 am
Recuerda que hay que darle permisos de ejecución y ejecutarlo como root

Y que todo es muy preliminar, no soy ningún experto en bash....bueno, no soy experto en nada *+* *+* *+* *+* *+*
Título: Re:[Ayuda] BASH para reiniciar la RasPi
Publicado por: manolodos en 16 de Octubre del 2020, 15:54:15 pm
Faltaría saber cómo lo hizo posible.

De las pocas soluciones que se me ocurren estaría ponerle un relé gobernado por el GPIO de la raspi que reiniciase la consola.

Por aquí (https://www.amazon.es/Babysbreath17-Profundidad-acoplador-sustituci%C3%B3n-Arduino/dp/B07KJH83WL/ref=sr_1_1?__mk_es_ES=%C3%85M%C3%85%C5%BD%C3%95%C3%91&dchild=1&keywords=Babysbreath17+relay&qid=1602574473&sr=8-1) hay alguno barato barato.

La cuestión sería cacharrear y conseguir alguna librería o script que trabaje con él.

Hola:
En mi estación de Navas de San Juan-Sierra tengo instalado un sistema de relés para reiniciar consola y/o transmisor
En este hilo está  explicado 
https://forum.meteoclimatic.net/index.php/topic,51.msg15474.html#msg15474
Si se adapta el script que habéis desarrollado, podría quedar automatizado todo el proceso
Saludos

Título: Re:[Ayuda] BASH para reiniciar la RasPi
Publicado por: jmviper en 16 de Octubre del 2020, 20:08:29 pm
Hola manolodos

La de cosas que hay por ahí en meteoclimatic o que no vemos o no nos acordamos.... creo que eso serviría sobradamente. De todas formas a ver las pruebas desconectando el USB si funcionan y si no ya está lo tuyo que como dices adaptándolo a que no tenga la consola lectura de los sensores haga un reinicio.

Saludos
Título: Re:[Ayuda] BASH para reiniciar la RasPi
Publicado por: meteoalcolea en 31 de Enero del 2021, 13:21:40 pm
Buenas, después de unos meses en los que no he podido hacerlo, me he puesto a probar con el script de @jantoni pero creo que algo no estoy haciendo bien. No reinicia los USB, y por tanto no vuelve a coger los datos del sensor exterior. Os paso mi fichero crontab y el resetUSBraspi.sh por si tengo algo mal. Gracias.
Título: Re:[Ayuda] BASH para reiniciar la RasPi
Publicado por: jantoni en 01 de Febrero del 2021, 09:51:28 am
No te puedo decir.

Ya indicaba que no se podía probar al no disponer de una Raspi3b.

Pero, es que todo lo que toca a Raspberry Pi, que no sea estándar del mundo Debian, puede cambiar de una versión de RaspiOS a otra, y sobre todo en los comandos que manejan el hardware.
Título: Re:[Ayuda] BASH para reiniciar la RasPi
Publicado por: jantoni en 01 de Febrero del 2021, 09:55:41 am
Lo primero,  o prueba que la parte hardware funciona

Código: [Seleccionar]
echo '1-1' | sudo tee /sys/bus/usb/drivers/usb/unbind
Espera unos segundos

Código: [Seleccionar]
echo '1-1' | sudo tee /sys/bus/usb/drivers/usb/bind
Si eso funciona, entonces el problema es del resto del script.

Si no funciona, es que han tocado el firmware y habría que buscar otra solución.

Insisto que esto no funciona en una raspi2

Ah, debes hacerlo como root
Título: Re:[Ayuda] BASH para reiniciar la RasPi
Publicado por: meteoalcolea en 01 de Febrero del 2021, 13:27:48 pm
He probado con esos dos comandos y el resultado ha sido este:

root@raspberrypi:~# echo '1-1' | sudo tee /sys/bus/usb/drivers/usb/bind
1-1
tee: /sys/bus/usb/drivers/usb/bind: No existe el dispositivo
root@raspberrypi:~# echo '1-1' | sudo tee /sys/bus/usb/drivers/usb/bind
1-1
tee: /sys/bus/usb/drivers/usb/bind: No existe el dispositivo

Título: Re:[Ayuda] BASH para reiniciar la RasPi
Publicado por: jantoni en 02 de Febrero del 2021, 09:42:18 am
Si te da ese resultado en una Raspberry Pi 3, entonces han vuelto a cambiar los dispositivos en el firmware.

Es lo malo de RPi, lo mucho que modifican estas cosas.

Yo encontré la solución en Google cuando se preguntó por primera vez.....ahora te tocará googlear si quieres ver la solución.

Por favor, compártela.