incron
funciona bem - ele detecta o scp
ou até mesmo um touch
de um arquivo e aciona o script bash
. No entanto, não há necessidade de usar um daemon dedicado apenas para detectar um sinal raramente usado. Usar incron
é como tirar uma marreta para golpear uma mosca, mesmo que seja o "modo Ubuntu". Outros podem precisar, mas eu não preciso.
Spoiler: basta adicionar uma única linha de código Python:
os.system("ssh me@prime ' ( /home/me/alarms/saylow12 ) ' &")
O restante desta resposta explica como ela é usada e pode ser TL; DR, a menos que você seja um engenheiro de sistemas.
The data-loggers run Python programs to pick up input from USB/serial Nano units which do temperature and voltage readings.
Most are on Ubuntu Desktops and the one outside is a low-power Rpi3 which runs from a separate smaller solar panel and a 12V battery which is shared with the solar panel positioning system.
Todos eles usam programas em Python para ler os dados em série de microcontroladores Nano que lêem temperaturas e tensões, adicionam a data e a hora a cada ponto de dados e os salvam nos arquivos de dados diários nos sistemas Linux.
Os programas de registro se parecem com (excerto):
import os
import serial
import datetime
import time
ser = serial.Serial("/dev/ttyUSB0",9600)
ser.flushInput()
while True :
linein = ser.readline()
if linein[:5]=="LOW V" :
print
os.system('echo "SUBJECT: ALERT LOW VOLTAGE OUTSIDE" | ssmtp [email protected]')
etc to add date/time stamp then save in CSV file
Eles então produzem gráficos que são exibidos como live plots
em monitores atualizados minuto a minuto. Os programas gnuplot
são muito simples:
set title "OUTSIDE 12V Battery"
set xlabel "Time"
set ylabel "Volts"
set yrange [11.5:15.5]
set grid
unset mouse
unset log
set key top left
set timestamp
set xdata time
set timefmt '%H:%M:%S'
set xtics format '%H:%M'
set style fill solid 1.0
set terminal x11
plot 15.5 lw 2 lc rgb 'navy' notitle, \
14.5 lw 1 lc rgb 'black' t "Charger off", \
14.4 lw 2 lc rgb 'blue' t "14.4V Charge", \
12.7 lw 2 lc rgb 'green' t "12.7 Full", \
12.45 lw 1 lc rgb 'black' t "Charger on", \
12.1 lw 2 lc rgb 'black' t "12.1 V Alert", \
"today.dat" using 2:15 skip 2 with boxes lw 1 lc rgb 'gray' t "Charger", \
"today.dat" using 2:8 skip 2 with lines lw 1 lc rgb 'red' t "Battery"
pause 15
reread
Note that the
reread
command in gnuplot causes the plot to update so they are displayed in real time on the screen when the logging system is accessed by Windows RDP via WiFi.
6 plots fit on a single large screen. Then two others on a different screen.
Every15minutesthePrimeUbuntu16.04systemgathersalltheplots,appliessomeImagemagicFuandsendsthemuptohttps://www.SDsolarBlog.com/montage
Direto ao ponto: Quando a voltagem está muito baixa, os programas de registro já estão configurados para enviar um alerta de email usando este código (ou similar):
os.system("echo 'SUBJECT: ALERT - Low Voltage on 24' >>temp")
os.system("cat temp | ssmtp [email protected]")
-
O Gmail está configurado para aplicar um rótulo de alerta a qualquer mensagem com ALERT na linha de assunto
-
Meu smartphone tem um tom de notificação especial para as mensagens do Gmail recebidas com esse rótulo
-
Mas enquanto trabalha perto do sistema Ubuntu, o telefone pode não estar ao alcance da voz.
Tudo o que é necessário para comandar o sistema Ubuntu é o fato de adicionar uma única linha após o envio do email, assim:
os.system("echo 'SUBJECT: ALERT - Low Voltage on 24' >>temp")
os.system("cat temp | ssmtp [email protected]")
os.system("ssh me@prime ' ( /home/me/alarms/saylow24 ) ' &")
em que o arquivo saylow24
é o mesmo da pergunta.
Note that the quote marks are normal apostrophes.
The ampersand is used so this signal command doesn't block the Python script while it executes in the background on the Ubuntu mothership.
Melhor ainda, agora tenho que fazer isso:
os.system("echo 'SUBJECT: ALERT - Low Voltage on 24' >>temp")
os.system("cat temp | ssmtp [email protected]")
os.system("ssh me@prime ' ( espeak -s 100 E-Mail-Has-Been-Sent ) ' &")
os.system("ssh me@prime ' ( /home/me/alarms/saylow24 ) ' &")
Então, para o registrador de tensão externo, é semelhante, exceto que ele aciona o programa saylow12
.
A linha adicional adicionada lá é:
os.system("ssh me@prime ' ( /home/me/alarms/saylow12 ) ' &")
em que o arquivo saylow12
é muito parecido:
#!/bin/bash
for i in {1..5}
do
espeak "Low Voltage on 12"
sleep 10
done
Este script bash
é usado para que o alerta se repita a cada 10 segundos porque exige ação rápida ou a CPU Rpi3 externa perderá energia, o que faz com que os painéis solares parem de rastrear o sol.
Como mostrado acima, mensagens informativas arbitrárias podem ser pronunciadas desta maneira:
os.system("ssh me@prime ' ( espeak High-Temp-Inside-Control-Box ) ' &")
Note the use of hyphens to denote word spaces.
This only needs to be spoken once per data point since I can't change the weather.
Agora, todos os registradores de dados têm uma maneira de dar feedback verbal no console do Ubuntu.
Muito simples de implementar e funciona bem.