Breve: A questão é se devo modificar meu sistema Ubuntu 16.04 para realizar uma tarefa ou se existe uma maneira mais fácil.
Este é um sistema complexo de computadores, envolvendo uma mistura de linguagens e sistemas operacionais.
Após configurar o sistema primário Ubuntu 16.04 para a usina solar falar, conforme:
16.04 LTS Como fazer o sistema anunciar a hora no início da hora com eSpeak
EXCERTO: Useespeak
sudo apt-get update
sudo apt-get install espeak
o próximo passo é encontrar uma maneira para os sistemas de registro de dados remotos (8 telas, geradas principalmente pelos desktops Ubuntu 16.04 e um Rpi3B) comandarem o sistema de controle primário do Ubuntu 16.04 para emitir alertas verbalmente.
Todos eles estão executando programas Python para fazer o registro e enviar dados ao sistema de controle Prime Ubuntu para arquivamento, manipulação de imagens e upload para o serviço de hospedagem web.
Os gráficos de dados atuais são criados no sistema Prime Ubuntu 16.04 usando
montage
inImagemagick
para formatar os gráficos que podem ser vistos aqui: https://www.SDsolarBlog.com/montage
Para obter alertas de voz, a primeira tentativa foi fazer com que eles simplesmente usassem scp
para atualizar um arquivo em um diretório e fazer com que o sistema Ubuntu detectasse a alteração em um arquivo e respondesse executando um script usado espeak
para anunciar, por exemplo, que um baixo condição de tensão existe. Todos os sistemas usam logins RSA sem senha, portanto, fazer a cópia é simples.
A ferramenta ideal para monitorar alterações de arquivos e diretórios é incron
- que é semelhante, cron
exceto pelo fato de ser acionada com base em eventos do sistema de arquivos em vez do relógio.
Aqui estão as informações sobre como usar incron
:
Monitore a atividade de arquivos e diretórios com incron
EXCERTO:
Comece instalando
incron
einotify-tools
no sistema de controle Ubuntu 16.04.**
sudo apt-get update
sudo apt-get install incron
sudo apt-get install inotify-tools
sudo apt-get autoremove
em seguida, use incrontab -e
para configurar uma entrada simples como esta:
/home/me/alarms IN_CREATE /home/me/alarms/saylow24
onde o conteúdo de /home/me/scripts/saylow24
está
#!/bin/bash
espeak "Low Voltage on 24"
sleep 10
espeak "Low Voltage on 24"
... para que o registrador de dados interno do Ubuntu 16.04 possa comandar o console Prime para emitir um alerta de voz quando o banco de baterias de 6 kWh cair abaixo de uma tensão limite.
Então comecei a configurar um script semelhante para o registrador de dados externo do sistema de posicionamento do painel solar, que possui seu próprio painel fotovoltaico e bateria separados. Os dias nublados são um assassino para isso.
Nesse ponto, parei e me perguntei se realmente queria adicionar a complexidade extra do uso do incron
daemon no console do Ubuntu 16.04. Prefiro que as coisas sejam simples.
Pergunta: Existe uma maneira mais fácil de fazer isso sem precisar fazer grandes alterações no Ubuntu?
Responder1
incron
funciona bem - detecta scp
ou até mesmo um touch
arquivo e aciona o bash
script. No entanto, não há necessidade de usar um daemon dedicado apenas para detectar um sinal raramente usado. Usar incron
é como pegar uma marreta para golpear uma mosca, mesmo que seja o "jeito Ubuntu". Outros podem precisar, mas eu não.
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.
Os registradores de dados executam programas Python para captar entradas de unidades Nano USB/serial que fazem leituras de temperatura e tensão.
A maioria está em desktops Ubuntu e o que está fora é um Rpi3 de baixo consumo que funciona a partir de um painel solar menor separado e uma bateria de 12 V que é compartilhada com o sistema de posicionamento do painel solar.
Todos eles usam programas Python para ler os dados seriais dos microcontroladores Nano que leem temperaturas e tensões, adicionam a data e hora a cada ponto de dados e depois os salvam nos arquivos de dados diários nos sistemas Linux.
Os programas de registro são assim (trecho):
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 live plots
em monitores atualizados a cada minuto. Os gnuplot
programas 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
Observe que o
reread
comando no gnuplot faz com que o gráfico seja atualizado para que sejam exibidos em tempo real na tela quando o sistema de registro for acessado pelo Windows RDP via WiFi.
6 gráficos cabem em uma única tela grande. Depois, outros dois em uma tela diferente.
A cada 15 minutos o sistema Prime Ubuntu 16.04 reúne todas as plotagens, aplica alguns Imagemagic Fu e envia parahttps://www.SDsolarBlog.com/montage
Ao ponto: Quando a tensão está muito baixa, os programas de registro já estão configurados para enviar um alerta por e-mail 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 mensagens recebidas do Gmail com esse marcador
Mas ao trabalhar perto do sistema Ubuntu, o telefone pode não estar ao alcance da voz.
Tudo o que é necessário para comandar o sistema Ubuntu e falar de forma audível é adicionar uma única linha após o envio do e-mail, 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 ) ' &")
onde o arquivo saylow24
é o mesmo da pergunta.
Observe que as aspas são apóstrofos normais.
O e comercial é usado para que este comando de sinal não bloqueie o script Python enquanto ele é executado em segundo plano na nave-mãe do Ubuntu.
Melhor ainda, agora faço o seguinte:
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 aciona o saylow12
programa.
A linha adicional adicionada é:
os.system("ssh me@prime ' ( /home/me/alarms/saylow12 ) ' &")
onde o arquivo saylow12
é muito semelhante:
#!/bin/bash
for i in {1..5}
do
espeak "Low Voltage on 12"
sleep 10
done
Este bash
script é usado para que o alerta se repita a cada 10 segundos porque exige uma ação rápida ou a CPU Rpi3 externa perderá energia, o que fará com que os painéis solares parem de rastrear o sol.
Conforme mostrado acima, mensagens informativas arbitrárias podem ser faladas desta forma:
os.system("ssh me@prime ' ( espeak High-Temp-Inside-Control-Box ) ' &")
Observe o uso de hífens para denotar espaços de palavras.
Isso só precisa ser falado uma vez por ponto de dados, pois não posso alterar o clima.
Agora todos os registradores de dados têm uma forma de fornecer feedback verbal no console do Ubuntu.
Muito simples de implementar e funciona bem.