# ledserver.py mit lgpio für den Raspberry Pi 5 #! /usr/bin/python3 from time import sleep __PIN__ = 17 # GPIO Pin, den wir nutzen (BCM Nummerierung) __WAIT__ = 0.5 # Warten für 0,5 Sekunden from http.server import SimpleHTTPRequestHandler import socketserver import lgpio import logging # Handle auf den GPIO-Chip (meist 0 für /dev/gpiochip0) handle = lgpio.gpiochip_open(0) # Pin als Output setzen lgpio.gpio_claim_output(handle, __PIN__, 0) responsehtml = '
LED ist $ledstate_str
' logging.basicConfig( format='%(asctime)-15s [%(levelname)s] %(funcName)s: %(message)s', level=logging.DEBUG) # Da http ein stateless Protokoll ist, wird der Handler bei jedem Request neu def setLED(state): lgpio.gpio_write(handle, __PIN__, state) # aufgebaut! Deswegen benutzen wir hier setup() statt __init__() class LEDHttpRequestHandler(SimpleHTTPRequestHandler): def setup(self): logging.debug('setting up Handler') self.ledstate = False super().setup() def do_GET(self): logging.debug(f'path= {self.path}') logging.debug('GET: empfangen') self.send_response(200) self.send_header('Content-Type:','text/html') # Ende der Header markieren, dass ist wichtig, sonst kommt der Response nicht zurück! self.end_headers() #Wenn im Requestpath 'led='on'enthalten ist, schalten wir die LED ein. Bei off aus if '?led=' in self.path: if 'on' in self.path: logging.debug('schalte LED ein') self.ledstate = True setLED(self.ledstate) elif 'off' in self.path: logging.debug('schalte LED aus') self.ledstate = False setLED(self.ledstate) logging.debug(f'ledstate={self.ledstate}') response = responsehtml.replace('$ledstate_str',('aus','an')[self.ledstate]) self.wfile.write(response.encode()) class http_server: def __init__(self): def handler(*args): myHandler(*args) server = HTTPServer(('', 8080), handler) if __name__ == '__main__': logging.debug('MAIN: start') setLED(False) # Beim Start LED ausschalten #Request-Handler aufbauen handler = LEDHttpRequestHandler handler.ledstate = False #Socketserver mit unserem Handler starten with socketserver.TCPServer(('',8080),handler) as httpd: logging.info('SERVER: start') try: #Server läuft bis CTRL-C gedrückt wird. httpd.serve_forever() except KeyboardInterrupt: pass finally: setLED(False) lgpio.gpiochip_close(handle) # Handle schließen