- DIESEL generator engaged
- DIESEL generator fault
- MAINS power lost
- A/C unit 1 fault
- A/C unit 2 fault
- Temperature alert
To do so, I wrote a small python program (my "hello world" in python...hehe
Code: Select all
#!/usr/bin/env python
print "PiFace SNMP Monitor (c) 2013 by Chris <gridrun> Burri @ Total Optical Networks AG"
# configuration
tempalert = 40.0
sendtrap = "/home/pi/piface/python/piface/sendtrap.sh"
readtemp = "/home/pi/piface/python/piface/readtemp.pl"
msgdieselengaged = "Diesel engaged"
msgdieseldisengaged = "Diesel disengaged"
msgdieselfault = "Diesel fault"
msgdieselclear = "Diesel fault cleared"
msgmainsfault = "Mains power lost"
msgmainsclear = "Mains power restored"
msgac1fault = "A/C unit 1 fault"
msgac1clear = "A/C unit 1 fault cleared"
msgac2fault = "A/C unit 2 fault"
msgac2clear = "A/C unit 2 fault cleared"
msgtempalert = "Temperature alert"
msgtempclear = "Temperature normal"
# imports
from time import sleep
from subprocess import call
import time
import threading
import subprocess
import signal
import sys
import piface.pfio as pfio
# variable definitions
false = 0
true = 1
CurTemp = 0.0
staTempHigh = 0
lstTempHigh = 0
pinDieselRunning = 0
lstDieselRunning = 0
pinDieselFault = 0
lstDieselFault = 0
pinMainsLost = 0
lstMainsLost = 0
pinAirCondition1Fault = 0
lstAirCondition1Fault = 0
pinAirCondition2Fault = 0
lstAirCondition2Fault = 0
# Ctrl-C handler
def signal_handler(signal, frame):
print "Ctrl-C received; aborting..."
tmprdr.stop()
sys.exit(0)
# parameter monitoring function
def parmon(curPar, lstPar, MsgAlert, MsgClear):
if (curPar != lstPar):
if (curPar == 1):
print "TRAP: " + MsgAlert
call([sendtrap, MsgAlert])
else:
print "TRAP: " + MsgClear
call([sendtrap, MsgClear])
# temperature reader class
class TmpRdrCls(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.event = threading.Event()
def run(self):
while not self.event.is_set():
global CurTemp
global staTempHigh
global tempalert
proc = subprocess.Popen(["sudo", readtemp], stdout=subprocess.PIPE)
CurTemp = proc.stdout.readline()
if float(CurTemp) > tempalert:
staTempHigh = 1
else:
staTempHigh = 0
self.event.wait( 18 )
def stop(self):
self.event.set()
# setup temp reader class
tmprdr = TmpRdrCls()
signal.signal(signal.SIGINT, signal_handler)
# initialize PiFace digital board
pfio.init()
# print startup message
print "PiFace SNMP Monitor initialized and running..."
# start temp reader
tmprdr.start()
# main loop
while True:
# read status pins
pinDieselRunning = pfio.digital_read(1)
pinDieselFault = pfio.digital_read(2)
pinMainsLost = pfio.digital_read(3)
pinAirCondition1Fault = pfio.digital_read(4)
pinAirCondition2Fault = pfio.digital_read(5)
# process Diesel RUN status pin
parmon(pinDieselRunning, lstDieselRunning, msgdieselengaged, msgdieseldisengaged)
# process Diesel FAULT status pin
parmon(pinDieselFault, lstDieselFault, msgdieselfault, msgdieselclear)
# process Mains status pin
parmon(pinMainsLost, lstMainsLost, msgmainsfault, msgmainsclear)
# process Air Condition FAULT status pins
parmon(pinAirCondition1Fault, lstAirCondition1Fault, msgac1fault, msgac1clear)
parmon(pinAirCondition2Fault, lstAirCondition2Fault, msgac2fault, msgac2clear)
# process temperature alerts
parmon(staTempHigh, lstTempHigh, msgtempalert, msgtempclear)
# remember pin stati
lstDieselRunning = pinDieselRunning
lstDieselFault = pinDieselFault
lstMainsLost = pinMainsLost
lstAirCondition1Fault = pinAirCondition1Fault
lstAirCondition2Fault = pinAirCondition2Fault
lstTempHigh = staTempHigh
# delay 100ms
sleep(0.1)
Code: Select all
#!/bin/bash
/home/pi/piface/python/piface/net-snmp-5.7.2/apps/snmptrap -v 1 -c public <receiver host> '1.2.3.4.5.6' '192.193.194.195' 6 99 '55' 1.11.12.13.14.15 s "$1" 2> /dev/null
To read the temperature, I used a HIDTemper USB thermometer, with some perl code:
Code: Select all
#!/usr/bin/perl
use strict;
use Device::USB::PCSensor::HidTEMPer;
my $pcsensor = Device::USB::PCSensor::HidTEMPer->new();
my @devices = $pcsensor->list_devices();
foreach my $device (@devices) {
print $device->internal()->celsius() if defined $device->internal();
}
Hope you'll find this useful. Have fun with the Pi!