|
|
| Zeile 1: |
Zeile 1: |
| {{aktives Projekt|Kontakt=Ollo}}
| | Blubb |
| | |
| = Publikationen =
| |
| * [[Datei:2014-02-28_Praesi_Raumbeleuchtung.pdf]]
| |
| | |
| = Server =
| |
| == Hardware ==
| |
| * Raspberry Pi [http://www.gtkdb.de/index_36_2451.html seriell stumm geschalten]
| |
| * ioBoard [https://github.com/C3MA/uberschalter Projekt auf Github]
| |
| | |
| Das ioBoard wird über das UART des Raspberry Pis angesprochen.
| |
| Die Kommunikation zum Raspberry erfolgt über Ethernet, es werden keine weiteren Schnittstellen benötigt.
| |
| | |
| == Software ==
| |
| * raspbian (wheezy)
| |
| ** ser2net
| |
| ** lighttpd (optional für Webclient)
| |
| *** Webserver-Projekt [https://github.com/C3MA/uberschalter Unterordner web]
| |
| | |
| == Konfiguration ==
| |
| | |
| In der Konfigurationsdatei /etc/ser2net.conf von '''ser2net''' aktiviert man folgende Konfiguration. Alle weiteren können auskommentiert werden:
| |
| | |
| 2001:raw:120:/dev/ttyAMA0:9600 NONE 1STOPBIT 8DATABITS -XONXOFF -LOCAL -RTSCTS
| |
| | |
| == Webserver konfigurieren ==
| |
| <code>
| |
| $ cd /var/
| |
| $ sudo chown pi:pi www/
| |
| $ cd cd /var/www/
| |
| $ git clone https://github.com/C3MA/uberschalter
| |
| $ cd uberschalter/web/
| |
| $ make
| |
| </code>
| |
| | |
| Aktualiseren der '''lighttpd''' Konfiguration zu folgender (Muss ggf. erst installiert werden):
| |
| <code>
| |
| server.modules = (
| |
| "mod_cgi",
| |
| "mod_access",
| |
| "mod_alias",
| |
| "mod_compress",
| |
| "mod_redirect",
| |
| # "mod_rewrite",
| |
| )
| |
| | |
| #server.document-root = "/var/www"
| |
| server.document-root = "/var/www/uberschalter/web/www"
| |
| server.upload-dirs = ( "/var/cache/lighttpd/uploads" )
| |
| server.errorlog = "/var/log/lighttpd/error.log"
| |
| server.pid-file = "/var/run/lighttpd.pid"
| |
| server.username = "www-data"
| |
| server.groupname = "www-data"
| |
| server.port = 80
| |
| | |
| | |
| index-file.names = ( "index.php", "index.html", "index.lighttpd.html" )
| |
| url.access-deny = ( "~", ".inc" )
| |
| static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )
| |
| | |
| compress.cache-dir = "/var/cache/lighttpd/compress/"
| |
| compress.filetype = ( "application/javascript", "text/css", "text/html", "text/plain" )
| |
| | |
| # default listening port for IPv6 falls back to the IPv4 port
| |
| include_shell "/usr/share/lighttpd/use-ipv6.pl " + server.port
| |
| include_shell "/usr/share/lighttpd/create-mime.assign.pl"
| |
| include_shell "/usr/share/lighttpd/include-conf-enabled.pl"
| |
| | |
| $HTTP["url"] =~ "/cgi-bin/" {
| |
| cgi.assign = ( "" => "" )
| |
| }
| |
| | |
| cgi.assign = (
| |
| ".cgi" => ""
| |
| )
| |
| </code>
| |
| | |
| = Client =
| |
| == Android ==
| |
| * https://bitbucket.org/0110/iorouter
| |
| | |
| == Web ==
| |
| Auf dem RaspberryPi läuft auch Webserver um die Lampen zu steuern:
| |
| (Zu erreichen im Raum-Netzwerk unter ''lampi'' oder ''10.23.42.140''.)
| |
| <gallery>
| |
| Datei:LampPiWeb.png|Lamp Webinterface
| |
| </gallery>
| |
| | |
| = Lampenpositionen =
| |
| <gallery>
| |
| Datei:LampenPlan.jpg|Lampenpositionen mit deren Identifikationsnummer
| |
| </gallery>
| |
| | |
| = Mqtt =
| |
| == Doku ==
| |
| | |
| == Skript ==
| |
| <code>
| |
| import mosquitto, os, socket, time
| |
| #File: /usr/local/sbin/light2mqtt.py
| |
| | |
| TCP_IP = '127.0.0.1'
| |
| TCP_PORT = 2001
| |
| BUFFER_SIZE = 1024
| |
| | |
| mqttBroker="10.23.42.31"
| |
| | |
| mypid = os.getpid()
| |
| | |
| client = mosquitto.Mosquitto("RoomLights"+str(mypid))
| |
| | |
| oldStates = None
| |
| | |
| def processState(ls):
| |
| lightnr=1
| |
| global oldStates
| |
| | |
| for light in ls:
| |
| if oldStates is None or light != oldStates[lightnr - 1]:
| |
| lightState = "on" if int(light) == 1 else "off"
| |
| client.publish("/room/light/%s/state" % lightnr, lightState, 0, True)
| |
| lightnr+=1
| |
| oldStates = ls
| |
| | |
| # Light ist das licht 1-6
| |
| # State ist h oder l
| |
| | |
| def switchLight(light, state):
| |
| s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
| |
| s.connect((TCP_IP, TCP_PORT))
| |
| | |
| s.send("ollpew%s%s" % (light, state))
| |
| | |
| time.sleep(0.2)
| |
| | |
| data = s.recv(BUFFER_SIZE)
| |
| s.close()
| |
| | |
| data = data.replace("\r", "").split("\n")
| |
| | |
| lightState = data[3].split(" ")[1]
| |
|
| |
| processState(lightState)
| |
| | |
| | |
| def getStates():
| |
| s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
| |
| s.connect((TCP_IP, TCP_PORT))
| |
| | |
| s.send("ollpera")
| |
| | |
| time.sleep(0.2)
| |
| | |
| data = s.recv(BUFFER_SIZE)
| |
| s.close()
| |
| | |
| data = data.replace("\r", "").split("\n")
| |
| | |
| lightState = data[2].split(" ")[1]
| |
| | |
| processState(lightState)
| |
| | |
| | |
| #getStates()
| |
| #switchLight(3, "l")
| |
| #time.sleep(2)
| |
| #switchLight(3, "h")
| |
| | |
| def on_connect(rc):
| |
| #print("Connected with result code "+str(rc))
| |
| | |
| client.subscribe("/room/light/+/command")
| |
| | |
| def on_message(userdata, msg):
| |
| | |
| topic = msg.topic.strip("/").split("/")
| |
| | |
| lightNr = int(topic[2])
| |
| message = str(msg.payload)
| |
| | |
| if lightNr >= 1 and lightNr <= 6 and message in ["on", "off"]:
| |
| lightState = "l" if message == "off" else "h"
| |
| switchLight(lightNr, lightState)
| |
| | |
| | |
| client.on_connect = on_connect
| |
| client.on_message = on_message
| |
| | |
| client.connect(mqttBroker, 1883, 60, True)
| |
| | |
| while client.loop() == 0:
| |
| pass
| |
| | |
| </code>
| |
| | |
| Autostart im Raspberry:
| |
| Folgende Zeile in '''/etc/rc.local''' einfügen: (vor dem ''exit 0'' wenn vorhanden)
| |
| <code>
| |
| # Start the monster deamon to rule the world
| |
| /usr/bin/python /usr/local/sbin/light2mqtt.py &
| |
| </code>
| |