Dieser Artikel ist eine Fortsetzung von diesem Blog. Die Installation von WebIoPI wird vorausgesetzt und nicht weiter erklärt, das kann dieser Blogger besser hier (dort sind auch ein paar RPi Projekte zu finden, so wie hier ein paar Ideen zur Heimautomatisierung).
Ziel war es, als Fingerübung in WebIoPI einen Webservice zu realisieren, sodass darüber eine I2C Gerät gesteuert werden kann. Als erster Schritt wurde diese einfach in Form eines WebIoPI Macros realisiert. Der Aufruf des Webservice erfolgt so:
http://setscene/<nummer>
Die <nummer> ist eine Zahl von 1 bis 20. Als Gerät wurde eine BlinkM I2C Leuchtdiode gewählt, da diese eine einfache optische Kontrolle erlaubt. Sie kann mit RGB Werten beschickt werden oder auch – wie hier verwendet – mit einer Nummer eine vorher einprogrammierte Sequenz abspielen, zum Beispiel den Text SOS morsen. Im Auslieferungszustand sind etliche Szenen bereits programmiert.
Es gibt praktischerweise auch eine einfache Python Bibliothek, die die Ansteuerung übernimmt. Diese testen wir zuerst:
from pyblinkm import BlinkM, Scripts blinkm = BlinkM() blinkm.reset() blinkm.play_script(Scripts.THUNDERSTORM) blinkm.reset() blinkm.fade_to(255,0,0) blinkm.fade_to_hex("ff0000") blinkm.go_to(0,255,0)
Die Logik dazu wird in einem script.py geschrieben und in WebIoPI eingebunden. Die index.html Seite braucht es nicht. Zuerst werden die Module geladen und eine Szene definiert, die gerade beim Start geschickt wird:
# Imports import webiopi import time import pyblinkm from pyblinkm import BlinkM, Scripts # Enable debug output webiopi.setDebug() # Retrieve GPIO lib DEFSCENE = 10
# Called by WebIOPi at script loading def setup(): webiopi.debug("Script with macros - Setup") global blinkm blinkm = BlinkM() blinkm.reset() blinkm.play_script(DEFSCENE)
Danach wird das Schleifenverhalten und Ende definiert:
# Looped by WebIOPi def loop(): # Toggle LED each 5 seconds #value = not GPIO.digitalRead(LED1) #GPIO.digitalWrite(LED1, value) webiopi.sleep(5)
# Called by WebIOPi at server shutdown def destroy(): webiopi.debug("Script with macros - Destroy") blinkm.reset()
Dann folgt endlich das einfache Macro setscene mit einer Variable. Da alles auf Python beruht, gestaltet sich der Aufruf dieser „externen Funktion“ banal einfach.
# A macro which sets the scene on the BlinkM @webiopi.macro def setscene(scene): int_scene = int(scene) webiopi.debug("setscene(%s)" % (int_scene)) blinkm.play_script(int_scene) return int_scene
Zwei weitere Testmacros sind auch noch im Code enthalten:
# A macro which says hello @webiopi.macro def HelloWorld(first, last): webiopi.debug("HelloWorld(%s, %s)" % (first, last)) return "Hello %s %s !" % (first, last)
# A macro without args which return nothing @webiopi.macro def PrintTime(): webiopi.debug("PrintTime: " + time.asctime()) return time.asctime()
Das ist schon alles. Auf der To do Liste gäbe es aber noch einiges:
- weitere Macros erstellen: ändere die Farben (RGB), die Frequenz und anderes
- eine Webseite mit einem Eingabeformular erstellen, in dem die Szene und andere Parameter gesetzt werden können
- einen WebIoPI Treiber entwickeln
Das ganze ist schliesslich nur eine Fingerübung für ein anderes Projekt, so werde ich die Perfektion hier nicht auf die Spitze treiben.