LED am Raspberry PI mit Python-REST-API steuern

ledapiMit nur wenigen Zeilen Python-Code lässt sich eine einfache REST-API bauen, um eine LED am Raspberry PI an und auszuschalten. Damit lässt sicih dann über einen Browser die LED steuern. Zum Einsatz kommt dabei das Microframework Flask für Python.



Um Flask benutzen zu können, müssen zunächst ein paar Pakete installiert werden. Zunächst die Paketverwaltung PIP für Python und dann das Flask-Modul:

sudo apt-get install python-pip
sudo pip install Flask

Als nächstes wird das Grundgerüst für die API mit Flask geschaffen. Dazu wird die Datei webserver.py angelegt:

from flask import Flask
from flask import jsonify

app = Flask(__name__)

@app.route('/')
def hello_world():
    return jsonify(result='Hello World')

if __name__ == '__main__':
    app.run(debug=True,host="0.0.0.0")

Mit diesen 8 Zeilen (ohne Leerzeilen) Python-Code haben wir nun schon eine vollständigen Webserver mit einer REST-API geschrieben. Gestartet wird das ganze mit:
python webserver.py:

pi@raspberrypi ~ $ python test.py 
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat

Der Webserver lauscht nun auf Port 5000 auf Anfragen. Ruft man nun über einen Browser die IP des Raspberry PI auf Port 5000 auf (http://ip.vom.raspberry.pi:5000), so erhält man ein JSON mit dem Inhalt: „result=Hello World“ zurück.

Nun soll mit Hilfe der API eine LED geschaltet werden. Dafür sollen die folgenden API-Methoden implementiert werden:
– /api/led/on (schaltet die LED an)
– /api/led/off (schaltet die LED aus)
– /api/led/toggle (schaltet die LED abwechselnd ab oder an)

Dazu wird der Webserver-Code um die entsprechenden GPIO-Funktionen ergänzt. Die LED ist dabei an Port 24 der GPIO-Schnittstelle angeschlossen (Vorwiderstand nicht vergessen!)

Zunächst wird die GPIO-Schnittstelle initialisiert:

# LED an Pin 24
LED = 24

# Bordlayout auf BCM setzen
GPIO.setmode(GPIO.BCM) 

# Warnungen aus
GPIO.setwarnings(False) 

# LED pin als Output. Beim Start auf Low
GPIO.setup(LED, GPIO.OUT, initial=GPIO.LOW) 

Nun kommen die API-Endpunkte für on, off und toggle:

@app.route('/api/led/on')
def led_on():
    GPIO.output(LED,GPIO.HIGH)
    return jsonify(led=GPIO.input(LED))

@app.route('/api/led/off')
def led_off():
    GPIO.output(LED,GPIO.LOW)
    return jsonify(led=GPIO.input(LED))

@app.route('/api/led/toggle')
def led_togggle():
    GPIO.output(LED,not GPIO.input(LED))
    return jsonify(led=GPIO.input(LED))

Die LED wird also je nach API-Aufruf geschaltet und der aktuelle Zustand als JSON zurückgegeben.

Nach einem erneuten Start von webserver.py ist die API nun funktionsbereit. Das ganze kann im Browser getestet werden:

– LED an: http://ip.vom.raspberry.pi:5000/api/led/on
– LED aus: http://ip.vom.raspberry.pi:5000/api/led/off
– LED an oder aus: LED an: http://ip.vom.raspberry.pi:5000/api/led/toggle

Hier noch einmal der vollständige Python-Code:

from flask import Flask
from flask import jsonify
import RPi.GPIO as GPIO

LED = 24
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(LED, GPIO.OUT, initial=GPIO.LOW)

app = Flask(__name__)

@app.route('/api/led/on')
def led_on():
    GPIO.output(LED,GPIO.HIGH)
    return jsonify(led=GPIO.input(LED))

@app.route('/api/led/off')
def led_off():
    GPIO.output(LED,GPIO.LOW)
    return jsonify(led=GPIO.input(LED))

@app.route('/api/led/toggle')
def led_togggle():
    GPIO.output(LED,not GPIO.input(LED))
    return jsonify(led=GPIO.input(LED))

if __name__ == '__main__':
    app.run(debug=True,host="0.0.0.0")

3 Gedanken zu „LED am Raspberry PI mit Python-REST-API steuern

  1. Padi

    Danke für das Tutorial.
    Kann man den Code eigentlich so modifizieren das das Fenster sich nach dem öffnen nach kurzer Zeit schließt? Ich habe überlegt eine Art Visualisierung in html zu erstellen und die Befehle als Hyperlink hinzuzufügen. Das Heißt es sollte nur kurzzeitig das Fenster geöffnet werden und danach zurück in das Visufenster.

    Danke für die Hilfe

    Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.