Initial commit
This commit is contained in:
		
							
								
								
									
										10
									
								
								relay_rpc.service
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								relay_rpc.service
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					[Unit]
 | 
				
			||||||
 | 
					Description=Relay rpc service
 | 
				
			||||||
 | 
					After=multi-user.target
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[Service]
 | 
				
			||||||
 | 
					Type=idle
 | 
				
			||||||
 | 
					ExecStart=/usr/local/bin/relay_rpc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[Install]
 | 
				
			||||||
 | 
					WantedBy=multi-user.target
 | 
				
			||||||
							
								
								
									
										58
									
								
								relay_rpc/main.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								relay_rpc/main.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,58 @@
 | 
				
			|||||||
 | 
					"""Entry point"""
 | 
				
			||||||
 | 
					#!/usr/bin/env python
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import logging
 | 
				
			||||||
 | 
					import sys
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from xmlrpc.server import SimpleXMLRPCServer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import RPi.GPIO as GPIO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LOG_LEVEL = logging.ERROR
 | 
				
			||||||
 | 
					LOG_FILE = "/var/log/relay_rpc.log"
 | 
				
			||||||
 | 
					LOG_FORMAT = "%(asctime)s %(levelname)s %(message)s"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					HOST = "0.0.0.0"
 | 
				
			||||||
 | 
					PORT = 64001
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					GPIOS = [26, 20, 21]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def switch_relay(relay: int, state: bool):
 | 
				
			||||||
 | 
					    """Switch relay"""
 | 
				
			||||||
 | 
					    pin = int(GPIOS[relay - 1])
 | 
				
			||||||
 | 
					    log = logging.getLogger()
 | 
				
			||||||
 | 
					    log.info("switching relay %s (pin %s) %s", relay, pin, state)
 | 
				
			||||||
 | 
					    GPIO.output(pin, not state)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def init_relays():
 | 
				
			||||||
 | 
					    """Init relays"""
 | 
				
			||||||
 | 
					    GPIO.setwarnings(False)
 | 
				
			||||||
 | 
					    GPIO.setmode(GPIO.BCM)
 | 
				
			||||||
 | 
					    for pin in GPIOS:
 | 
				
			||||||
 | 
					        GPIO.setup(pin, GPIO.OUT)
 | 
				
			||||||
 | 
					        GPIO.output(pin, True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def main():
 | 
				
			||||||
 | 
					    """Entry point"""
 | 
				
			||||||
 | 
					    logging.basicConfig(format=LOG_FORMAT, level=LOG_LEVEL, filename=LOG_FILE)
 | 
				
			||||||
 | 
					    # logging.basicConfig(format=LOG_FORMAT, level=LOG_LEVEL)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    log = logging.getLogger()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    init_relays()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    server = SimpleXMLRPCServer((HOST, PORT), allow_none=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    server.register_function(switch_relay, 'switch_relay')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    log.info('Control-c to quit')
 | 
				
			||||||
 | 
					    server.serve_forever()
 | 
				
			||||||
 | 
					    log.info("Shutting down...")
 | 
				
			||||||
 | 
					    log.info("...done. Exiting...")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if __name__ == '__main__':
 | 
				
			||||||
 | 
					    sys.exit(main())
 | 
				
			||||||
							
								
								
									
										43
									
								
								setyp.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								setyp.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,43 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					import os
 | 
				
			||||||
 | 
					import shutil
 | 
				
			||||||
 | 
					import stat
 | 
				
			||||||
 | 
					from setuptools import setup
 | 
				
			||||||
 | 
					from setuptools.command.install import install
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					NAME = 'relay_rpc'
 | 
				
			||||||
 | 
					VERSION = '1'
 | 
				
			||||||
 | 
					AUTHOR = 'Thomas Klaehn'
 | 
				
			||||||
 | 
					EMAIL = 'tkl@blackfinn.de'
 | 
				
			||||||
 | 
					PACKAGES = [NAME]
 | 
				
			||||||
 | 
					REQUIRES = ['RPi.GPIO']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SERVICEDIR = "/lib/systemd/system"
 | 
				
			||||||
 | 
					DAEMON_START_SCRIPT = os.path.join(SERVICEDIR, NAME +".service")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LOGFILE = "/var/log/" + NAME + ".log"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ENTRY_POINTS = {
 | 
				
			||||||
 | 
					    'console_scripts': [
 | 
				
			||||||
 | 
					        'relay_rpc = relay_rpc.main:main'
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Install(install):
 | 
				
			||||||
 | 
					    def run(self):
 | 
				
			||||||
 | 
					        install.run(self)
 | 
				
			||||||
 | 
					        os.makedirs(SERVICEDIR, exist_ok=True)
 | 
				
			||||||
 | 
					        shutil.copyfile(NAME + '.service', os.path.join(SERVICEDIR, DAEMON_START_SCRIPT))
 | 
				
			||||||
 | 
					        os.chmod(DAEMON_START_SCRIPT, stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IROTH)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            open(LOGFILE, 'r')
 | 
				
			||||||
 | 
					        except FileNotFoundError:
 | 
				
			||||||
 | 
					            os.makedirs(os.path.dirname(LOGFILE), exist_ok=True)
 | 
				
			||||||
 | 
					            open(LOGFILE, 'x')
 | 
				
			||||||
 | 
					            os.chmod(LOGFILE, stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IWGRP | stat.S_IROTH | stat.S_IWOTH)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					setup(name=NAME, version=VERSION, long_description=__doc__, author=AUTHOR, author_email=EMAIL,
 | 
				
			||||||
 | 
					      packages=PACKAGES, zip_safe=False, install_requires=REQUIRES, entry_points=ENTRY_POINTS,
 | 
				
			||||||
 | 
					      cmdclass={'install': Install})
 | 
				
			||||||
		Reference in New Issue
	
	Block a user