Meteoclimatic
Hardware => Ordenadores control estaciones => Mensaje iniciado por: vixium en 12 de Noviembre de 2018, 12:50:15
-
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!!
-
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:
#!/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
-
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
-
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
-
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:
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
-
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!
-
Hola meteoalcolea
Prueba esto:
#!/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
-
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!
-
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
-
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!!
-
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
-
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!
-
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.
-
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!!
-
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.
-
Muchas gracias jmviper. Me pierdo en estos temas.
Saludos!!
-
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.
-
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
-
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.
-
Esta es la versión preliminar del script
-
En cuanto pueda lo pruebo.
Muchas gracias por vuestra ayuda y esfuerzo.
Saludos!!
-
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 *+* *+* *+* *+* *+*
-
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
-
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
-
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.
-
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.
-
Lo primero, o prueba que la parte hardware funciona
echo '1-1' | sudo tee /sys/bus/usb/drivers/usb/unbind
Espera unos segundos
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
-
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
-
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.