简要:问题是关于我是否应该修改我的 Ubuntu 16.04 系统来完成任务,或者是否有更简单的方法。
这是一个复杂的计算机系统,涉及多种语言和操作系统。
设置 Ubuntu 16.04 主系统供太阳能发电厂使用后,如下:
16.04 LTS 如何利用 eSpeak 让系统在整点时播报时间
摘录:使用espeak
sudo apt-get update
sudo apt-get install espeak
下一步是找到一种方法,让远程数据记录系统(8 个屏幕,主要由 Ubuntu 16.04 桌面和 Rpi3B 生成)命令主 Ubuntu 16.04 控制系统口头发出警报。
它们都在运行 Python 程序来进行记录并将数据发送到 Prime Ubuntu 控制系统进行存档、图像处理和上传到网络托管服务。
当前数据图是在 Prime Ubuntu 16.04 系统上创建的,用于
montage
格式化Imagemagick
图表,如下所示: https://www.SDsolarBlog.com/montage
为了获得语音警报,第一次尝试是让它们简单地用于scp
更新目录中的文件,并让 Ubuntu 系统检测文件的更改并通过运行用于espeak
宣布(例如)低电压情况的脚本来做出响应。所有系统都使用 RSA 无密码登录,因此复制很简单。
监控文件和目录变化的首选工具是incron
- 它类似于,cron
只是它基于文件系统事件而不是时钟触发。
以下是有关使用的信息incron
:
摘抄:
incron
从安装和inotify-tools
在 Ubuntu 16.04 控制系统上开始。**
sudo apt-get update
sudo apt-get install incron
sudo apt-get install inotify-tools
sudo apt-get autoremove
然后使用它incrontab -e
来设置一个简单的条目,如下所示:
/home/me/alarms IN_CREATE /home/me/alarms/saylow24
其中的内容/home/me/scripts/saylow24
是
#!/bin/bash
espeak "Low Voltage on 24"
sleep 10
espeak "Low Voltage on 24"
...因此,当 6 kWh 电池组电压低于阈值时,室内 Ubuntu 16.04 数据记录器可以命令 Prime 控制台发出语音警报。
然后我开始为太阳能电池板定位系统的外部数据记录器设置类似的脚本,该系统有自己独立的光伏电池板和电池。阴天对它来说是致命的。
那时我停下来问自己是否真的想增加incron
在 Ubuntu 16.04 控制台上使用守护进程的额外复杂性。我更喜欢简单的东西。
问题:有没有更简单的方法可以做到这一点,而不需要对 Ubuntu 进行重大更改?
答案1
incron
运行良好 - 它检测文件的scp
或甚至touch
并触发bash
脚本。但是,没有必要使用专用守护进程来检测很少使用的信号。使用incron
就像拿出大锤来打苍蝇,尽管这是“Ubuntu 方式”。其他人可能需要它,但我不需要。
剧透:只需添加一行 Python 代码:
os.system("ssh me@prime ' ( /home/me/alarms/saylow12 ) ' &")
这个答案的其余部分解释了如何使用它,除非您是系统工程师,否则可能是 TL;DR。
数据记录器运行 Python 程序来获取来自 USB/串行纳米单元的输入,这些单元会读取温度和电压。
大多数都在 Ubuntu 桌面上,外面的一个是低功耗 Rpi3,它由单独的小型太阳能电池板和与太阳能电池板定位系统共享的 12V 电池运行。
它们都使用 Python 程序读取来自 Nano 微控制器的串行数据,读取温度和电压,为每个数据点添加日期和时间,然后将其保存到 Linux 系统中的每日数据文件中。
日志程序如下所示(摘录):
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
live plots
然后,它们会生成图表,并在显示器上实时显示。这些gnuplot
程序非常简单:
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
请注意,
reread
gnuplot 中的命令会导致图表更新,因此当通过 WiFi 使用 Windows RDP 访问日志系统时,它们会实时显示在屏幕上。6
个图表可显示在单个大屏幕上。然后,另外两个图表显示在不同的屏幕上。
每 15 分钟,Prime Ubuntu 16.04 系统会收集所有图,应用一些 Imagemagic Fu 并将它们发送到https://www.SDsolarBlog.com/montage
切中要点: 当电压过低时,记录程序已设置为使用此代码(或类似代码)发送电子邮件警报:
os.system("echo 'SUBJECT: ALERT - Low Voltage on 24' >>temp")
os.system("cat temp | ssmtp [email protected]")
Gmail 设置为对主题行中带有 ALERT 的任何邮件应用警报标签
我的智能手机对带有该标签的 Gmail 邮件有特殊的通知音
但是在 Ubuntu 系统附近工作时,手机可能不在听力范围内。
要命令 Ubuntu 系统发出声音,只需在电子邮件发送后添加一行,如下所示:
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 ) ' &")
其中的文件saylow24
与问题中的文件相同。
请注意引号是普通撇号。
使用 & 符号是为了使该信号命令在 Ubuntu 母舰的后台执行时不会阻止 Python 脚本。
甚至更好的是,我现在可以这样做:
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 ) ' &")
然后对于外部电压记录器来说,它是类似的,只是它触发程序saylow12
。
此处添加的附加行是:
os.system("ssh me@prime ' ( /home/me/alarms/saylow12 ) ' &")
其中文件saylow12
非常相似:
#!/bin/bash
for i in {1..5}
do
espeak "Low Voltage on 12"
sleep 10
done
使用此bash
脚本,警报每 10 秒重复一次,因为它需要快速采取行动,否则外部 Rpi3 CPU 将失去电力,导致太阳能电池板停止跟踪太阳。
如上所示,任意信息性消息都可以通过以下方式传达:
os.system("ssh me@prime ' ( espeak High-Temp-Inside-Control-Box ) ' &")
请注意使用连字符来表示单词空格。
由于我无法改变天气,因此每个数据点只需说一次。
现在所有数据记录器都有办法在 Ubuntu 控制台上提供口头反馈。
实现起来非常简单而且效果很好。