我的Pi ZeroW上有一个PIR和一个声音传感器。 我还有一个python脚本打开一个侦听套接字并处理'声音'或'运动'中断。对于每个声音/动作事件,它会递增一个值,该值可以通过套接字连接读取,并在成功读取后重置为零。
我创建了2个collectd python插件'motion.py'和'sound.py',他们在CGP(collectd graph panel)中创建rrd数据和图形,但它们是两个独立的插件。我真的很喜欢它:
并且让它们每分钟更新一次(而不是每10秒更新一次)。
到目前为止我所拥有的内容如下:
我在〜/ collectd / types.db.local和〜/ cgp / inc / types.db中定义了一个类型'职业'
...
occupation motion:GAUGE:0:U, sound:GAUGE:0:U
motion value:GAUGE:0:U
sound value:GAUGE:0:U
...
在〜/ cgp / plugin中我有Occup.json
{
"occupation": {
"title": "Occupancy on {{HOST}}",
"vertical": "Events",
"type": "stacked",
"legend": {
"motion": {
"name": "Motion",
"color": "0000f0"
},
"sound": {
"name": "Sound",
"color": "ff00f0"
}
},
"legend_format": "%.1lf"
}
}
和我的occup.py插件如下:
/usr/share/pi/occupation/bin/occupation.py
import collectd
import socket
import sys
server_name = 'localhost'
server_port = 10000
def config_func(config):
collectd.info('config called')
def read_occupation():
collectd.info('read_occupation called')
# Read raw value
# Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
global server_name
global server_port
server_address = (server_name, server_port)
sock.connect(server_address)
sock.sendall('MOVEMENT')
motion = sock.recv(16)
sock.sendall('SOUND')
sound = sock.recv(16)
sock.close()
# Dispatch value to collectd
val1 = collectd.Values()
val1.plugin = 'occupation'
val1.type = 'occupation'
val1.values = [motion, sound]
val1.dispatch()
collectd.info('read_motion %s read_sound %s' % (motion, sound))
def init_func():
collectd.info('init called')
collectd.register_config(config_func)
collectd.register_init(init_func)
collectd.register_read(read_occupation, 60)
使用这个配置我得到一个错误:没有DS称为'value'(来自Base.class.php),因为我的rrd只有值'motion'和'sound' - 没有'value'值。< / p>
我觉得我很接近,但我只是在猜测,因为我不太了解Python插件的有限文档,但还没有找到更好的东西。
我发现这个链接https://www.programcreek.com/python/example/106897/collectd.register_read让我觉得我对python插件的看法都是错的。
我假设我正在正确编写rrd文件,但我似乎无法使cgp中的图形部分正常工作。谁能证明我哪里出错?
提前致谢!