|  | @@ -0,0 +1,60 @@
 | 
	
		
			
				|  |  | +#! /usr/bin/python3
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +"""
 | 
	
		
			
				|  |  | +rfid action commander deamon
 | 
	
		
			
				|  |  | +"""
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import os
 | 
	
		
			
				|  |  | +import subprocess
 | 
	
		
			
				|  |  | +import logging
 | 
	
		
			
				|  |  | +from shutil import copyfile
 | 
	
		
			
				|  |  | +from datetime import datetime
 | 
	
		
			
				|  |  | +from evdev import InputDevice, ecodes
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +logging.basicConfig(level=logging.DEBUG)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +def read_rfid():
 | 
	
		
			
				|  |  | +    combined_string = ""
 | 
	
		
			
				|  |  | +    for event in InputDevice("/dev/input/event0").read_loop():
 | 
	
		
			
				|  |  | +        if event.type == ecodes.EV_KEY and event.value == 0:  # value 0 = release key
 | 
	
		
			
				|  |  | +            if event.code == 28:  # code 28 = KEY_ENTER
 | 
	
		
			
				|  |  | +                return combined_string
 | 
	
		
			
				|  |  | +            # [4:5]? .. KEY[] starts with 'KEY_' and we expect one char
 | 
	
		
			
				|  |  | +            combined_string += ecodes.KEY[event.code][4:5] 
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +def run_action(script: str):
 | 
	
		
			
				|  |  | +    logging.info(f"RFID action: run {script}")
 | 
	
		
			
				|  |  | +    try:
 | 
	
		
			
				|  |  | +        r = subprocess.call(["/bin/bash", script])
 | 
	
		
			
				|  |  | +    except Exception as err:
 | 
	
		
			
				|  |  | +        logging.info(err)
 | 
	
		
			
				|  |  | +        last_rfid = None
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +last_rfid = None
 | 
	
		
			
				|  |  | +last_ts = datetime.now()
 | 
	
		
			
				|  |  | +while True:
 | 
	
		
			
				|  |  | +    rfid = read_rfid()
 | 
	
		
			
				|  |  | +    seconds_gone = (datetime.now() - last_ts).total_seconds()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    script = f"/opt/{rfid}"
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if os.path.islink(script):  # special RFID - alsways run!
 | 
	
		
			
				|  |  | +        logging.info(f"RFID {rfid} is special. {script} is a link")
 | 
	
		
			
				|  |  | +        run_action(script)
 | 
	
		
			
				|  |  | +        continue
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if not os.path.exists(script):
 | 
	
		
			
				|  |  | +        copyfile("/opt/_action_template", script)
 | 
	
		
			
				|  |  | +        logging.info(f"RFID action: empty {script} created from template")
 | 
	
		
			
				|  |  | +        continue
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if rfid == last_rfid and seconds_gone <= 5:
 | 
	
		
			
				|  |  | +        logging.info(f"Same RFID after {seconds_gone:.1f} seconds. Do nothing.")
 | 
	
		
			
				|  |  | +        continue
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    last_ts = datetime.now()
 | 
	
		
			
				|  |  | +    last_rfid = rfid
 | 
	
		
			
				|  |  | +    run_action(script)
 |