I’ve recently found this script and put it to use. I’ve also been on a mission to reduce CPU use and found the script uses 100% CPU. The problem was the way the while loop was working.
The while loop at the end is the main difference.
import RPi.GPIO as GPIO
import time
import socket
# a "pulse" is 1 unit of measurement use emonHub scales and unit to define
# eg if 100 pulses is 1m3, ie 0.01m3 each then emonHub should use scale = 0.01 and unit = m3
# Therefore "pulse_id" becomes an accumulating "total used" and should follow the meter reading
nodeid = 18
valueid = 1
bounce = 1
interval = 5
lastsend = 0
host = "localhost" #emonbase1"
port = 50012
pulse_pin1 = 21
pulse_pin2 = 15
pulse_id = {1:0,2:0}
def eventHandler1(channel):
processpulse(1,GPIO.input(channel))
def eventHandler2(channel):
processpulse(2,GPIO.input(channel))
# print("event")
def processpulse(channel,status):
global pulse_id
global frame
global lastsend
if status: #GPIO.input(channel):
pulse_id[channel] += 1
print("Channel "+ str(channel) + " on : " + str(pulse_id[channel]))
else:
print("Channel "+ str(channel) + " off : " + str(pulse_id[channel]))
t = time.time()
f = ' '.join((str(t), str(nodeid), str(pulse_id[1]), str(pulse_id[2])))
if t > (lastsend + interval):
lastsend = t
print f
send(f)
def send(f):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
f = f + '\r\n'
s.send(f)
s.close()
if rpi:
GPIO.setmode(GPIO.BOARD)
GPIO.setup(pulse_pin1, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.add_event_detect(pulse_pin1, GPIO.BOTH, callback=eventHandler1, bouncetime=bounce)
GPIO.setup(pulse_pin2, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.add_event_detect(pulse_pin2, GPIO.BOTH, callback=eventHandler2, bouncetime=bounce)
try: # CTRL+C to break - requires graceful exit
while True:
time.sleep(5) # the value doesn't matter.
except KeyboardInterrupt:
GPIO.cleanup() # clean up GPIO on CTRL+C exit
exit()
GPIO.cleanup() # just in case
time.sleep() could be a millisecond, one second, 5000 seconds, makes no difference, as long as the program is running the interrupts will happen and callbacks are initiated immediately.
I hope that helps.