This commit is contained in:
Wolfgang Hottgenroth 2015-06-01 00:51:45 -07:00
commit 041b2c13d6
3 changed files with 185 additions and 0 deletions

3
.hgignore Normal file
View File

@ -0,0 +1,3 @@
syntax: glob
*.pyc

78
LaundryServer.py Normal file
View File

@ -0,0 +1,78 @@
from twisted.internet import reactor
from twisted.web.server import Site
from twisted.web.resource import Resource
from twisted.web.static import File
import paho.mqtt.client as mqtt
import json
state = ['x', 'x', 'x', 'x', 'x', 'x', 'x', 'x']
def on_message(client, userdata, msg):
j = json.loads(msg.payload)
ss = j['data']['switchStates']
for s in ss:
if s['feedbackState'] == 0:
state[s['index']] = 'aus'
elif s['state'] == 1:
state[s['index']] = 'an'
else:
state[s['index']] = 'unbekannt'
def send_message(target, switchState):
t = {'kitchen':0, 'oven':1, 'laundry':2}
# command = "switch %s %s" % [target, switchState]
command = "switch " + str(t[target]) + " " + str(switchState)
mqttClient.publish('IoT/Command/RelayBox', command)
class HelloWorld(Resource):
isLeaf = True
def render_GET(self, request):
return "Hello world!"
class Switch(Resource):
isLeaf = True
def render_GET(self, request):
target = request.args['target'][0]
switchState = request.args['state'][0]
send_message(target, switchState)
return "OK"
class Status(Resource):
isLeaf = False
def __init__(self, target):
self.target = target
def render_GET(self, request):
t = {'kitchen':0, 'oven':1, 'laundry':2}
return state[t[self.target]]
mqttClient = mqtt.Client()
mqttClient.on_message = on_message
mqttClient.connect("mqttbroker", 1883, 60)
mqttClient.subscribe("IoT/Status/RelayBox")
mqttClient.loop_start()
root = Resource()
root.putChild("", File("index.html"))
root.putChild("Hello", HelloWorld())
root.putChild("switch", Switch())
root.putChild("oven", Status("oven"))
root.putChild("kitchen", Status("kitchen"))
root.putChild("laundry", Status("laundry"))
factory = Site(root, logPath='/tmp/laundryServer.log')
reactor.listenTCP(8080, factory)
reactor.run()

104
index.html Normal file
View File

@ -0,0 +1,104 @@
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css">
<script src="http://code.jquery.com/jquery-1.11.2.min.js"></script>
<script src="http://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script>
<script>
$("document").ready(function() {
$("#target").hide();
$("#button").click(function() {
var $v = "nix";
if ($("#flip-checkbox-1").is(":checked")) {
$v = "on";
} else {
$v = "off";
}
var $w = $("#target").text();
$.ajax({
url: 'http://172.16.2.15:8080/switch?target=' + $w + '&state=' + $v
});
// $("#bla").text($v + $w);
});
$(".switchlink").click(function() {
var $v = $(this).attr("id");
var $w = $("span:first", this).text();
$("#dialogTitle").text($w);
$("#target").text($v);
});
(function worker1() {
$.ajax({
url: 'http://172.16.2.15:8080/kitchen',
success: function(data) {
$('#stateKueche').text(data);
},
complete: function() {
// Schedule the next request when the current one's complete
setTimeout(worker1, 1000);
}
});
})();
(function worker2() {
$.ajax({
url: 'http://172.16.2.15:8080/oven',
success: function(data) {
$('#stateHerd').text(data);
},
complete: function() {
// Schedule the next request when the current one's complete
setTimeout(worker2, 1000);
}
});
})();
(function worker3() {
$.ajax({
url: 'http://172.16.2.15:8080/laundry',
success: function(data) {
$('#stateWaschkueche').text(data);
},
complete: function() {
// Schedule the next request when the current one's complete
setTimeout(worker3, 1000);
}
});
})();
});
</script>
<style>
.red { background-color: red; }
.green { background-color: green; }
</style>
</head>
<body>
<div data-role="page" id="mainpage">
<div data-role="header">
<h1>RelayBox</h1>
</div>
<div data-role="main" class="ui-content">
<ul data-role="listview" data-inset="true" data-count-theme="b">
<li><a class="switchlink" id="kitchen" href="#dialog?switch=kitchen"><span>K&uuml;che Rest</span> <span id="stateKueche" class="ui-li-count">on</span></a></li>
<li><a class="switchlink" id="oven" href="#dialog?switch=oven"><span>Herd</span> <span id="stateHerd" class="ui-li-count">on</span></a></li>
<li><a class="switchlink" id="laundry" href="#dialog?switch=laundry"><span>Waschk&uuml;che</span> <span id="stateWaschkueche" class="ui-li-count">off</span></a></li>
</ul>
</div>
</div>
<div data-role="dialog" id="dialog">
<div data-role="header">
<h1 id="dialogTitle">Switching</h1>
</div>
<div data-role="main" class="ui-content">
<center>
<input name="flip-checkbox-1" id="flip-checkbox-1" type="checkbox" data-role="flipswitch">
<span id="target">x</span>
</center>
<a href="#mainpage" id="button" data-role="button" data-rel="back">Ok</a>
</div>
</div>
</body>
</html>