ArduinoRaspberry Pi

WebIoPI: Webservice steuert I2C Device

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.

blinkm1

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.

Schreibe einen Kommentar

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