diff --git a/backend.py b/backend.py index bd128704ee42404a2a5a5e7a2f0c7d54f153197c..bceb2db0400c8f6bbd4f0562d8bfcb5bcfbae409 100644 --- a/backend.py +++ b/backend.py @@ -50,8 +50,8 @@ class Backend(): # self.devices = OrderedDict() ### will contain the list of nodes in the network # self.sensors = OrderedDict() ### will contain the list of sensors (only) in the network self.node_added = False - self.node_removed = False - self.timestamps = {} ### will contain the time of the last values' update for each sensor + self.node_removed = False + self.timestamps = {} ### will contain the time of the last values' update for each sensor self.queryStages = { ### the diffrent stages that a node object gets through before being ready "None" : 1, # Query process hasn't started for this node "ProtocolInfo" : 2, # Retrieve protocol information @@ -211,7 +211,7 @@ class Backend(): values = node.get_values("All","All","All",False,"All") for value in values.itervalues(): #print("%s %s %s" % (value.label, value.data, value.units)) - if value.label == "Group 1 Interval": + if value.label == "Group 1 Interval": value.data = Grp_interval # Group 1 Reports sent every 240 seconds if value.label == "Group 1 Reports": value.data = Grp_reports # Group 1 Reports : Temperature, Luminance, Humidity and battery @@ -230,61 +230,33 @@ class Backend(): def network_nodesConfiguration(self): # this method returns a html containing the configuration of the network's nodes - - result = "<h1>Network Configuration</h1>" - result += "<p>Home ID = " + self.network.home_id_str + "</p></br>" - result += """<table style="text-align: center; width: 100%; margin: auto; border-collapse: collapse; border: 1px solid black;"> - <tr> - <th>ID</th> - <th>Powered by</th> - <th>Wake-up Interval</th> - <th>Wake up 10 minutes when</br>batteries are inserted</th> - <th>On Time</th> - <th>Enable Motion Sensor</th> - <th>Command Options</th> - <th colspan="2">Group 1</th> - <th colspan="2">Group 2</th> - <th colspan="2">Group 3</th> - </tr> - <tr> - <th colspan="7"></th> - <th>Reports</th> - <th>Interval</th> - <th>Reports</th> - <th>Interval</th> - <th>Reports</th> - <th>Interval</th> - </tr> - """ + result = {} + result ['Network Home ID'] = self.network.home_id_str for node in self.ordered_nodes_dict().itervalues(): if node.isReady and node.node_id is not 1: node.request_all_config_params() values = node.get_values("All","All","All",False,"All") #Config + System pour Wake-up interval - result += "<tr style='border: 1px solid black;'>" nodeValues = {} for value in values.itervalues(): #nodeValues[cle] = {}... #nodeValues[value.value_id]... #nodeValues[valeur.label]... nodeValues[int(value.index)] = value.data - result += "<td>"+str(node.node_id)+"</td>" - result += "<td>" - result += "USB" if node.is_listening_device else "Batteries" - result += "</td>" - result += "<td>"+str(nodeValues[0])+"</td>" - result += "<td>"+str(nodeValues[2])+"</td>" - result += "<td>"+str(nodeValues[3])+"</td>" - result += "<td>"+str(nodeValues[4])+"</td>" - result += "<td>"+str(nodeValues[5])+"</td>" - result += "<td>"+str(nodeValues[101])+"</td>" - result += "<td>"+str(nodeValues[111])+"</td>" - result += "<td>"+str(nodeValues[102])+"</td>" - result += "<td>"+str(nodeValues[112])+"</td>" - result += "<td>"+str(nodeValues[103])+"</td>" - result += "<td>"+str(nodeValues[113])+"</td>" - result += "</tr>" - result += "</table>" - return result + print str(value.index)+" "+str(value.label)+" "+str(value.data)+" id:"+str(node.node_id) + info = {} + info ['Node ID'] = str(node.node_id) + info ['Wake-up Interval'] = str(nodeValues[0]) + info ['Enable Motion Sensor'] = str(nodeValues[4]) + info ['Group 1 Reports'] = str(nodeValues[101]) + info ['Group 1 Interval'] = str(nodeValues[111]) + info ['Group 2 Reports'] = str(nodeValues[102]) + info ['Group 2 Interval'] = str(nodeValues[112]) + info ['Group 3 Reports'] = str(nodeValues[103]) + info ['Group 3 Interval'] = str(nodeValues[113]) + + result ['Node '+str(node.node_id)] = info + return jsonify(result) + ################################################################################################################ @@ -293,18 +265,18 @@ class Backend(): def start(self): - # this method starts the software representation + # this method starts the software representation global started if started: - print "Already started " + print "Already started" return started = True self.network.start() print "Z-Wave Network Starting..." for i in range(0, 300): - if self.network.is_ready: + if self.network.state == self.network.STATE_READY: break else: time.sleep(1.0) @@ -319,7 +291,7 @@ class Backend(): # this method stops the software representation global started - started = False + started = False print "Stopping Z-Wave Network... " self.network.stop() @@ -400,7 +372,7 @@ class Backend(): def allMeasures(self, n): for node in self.network.nodes.itervalues(): - if node.node_id == n and node.isReady and n != 1 : + if node.node_id == n and node.isReady and n != 1 and "timestamp"+str(node.node_id) in self.timestamps: values = node.get_values("All", "User", "All", True, False) if len(node.location) < 3: node.location = configpi.sensors[str(node.node_id)][:4] @@ -425,7 +397,7 @@ class Backend(): def temperature(self, n): for node in self.network.nodes.itervalues(): - if node.node_id == n and node.isReady and n != 1 : + if node.node_id == n and node.isReady and n != 1 and "timestamp"+str(node.node_id) in self.timestamps: values = node.get_values(0x31, "User", "All", True, False) for value in values.itervalues(): if value.label == "Temperature": @@ -437,7 +409,7 @@ class Backend(): def humidity(self, n): for node in self.network.nodes.itervalues(): - if node.node_id == n and node.isReady and n != 1 : + if node.node_id == n and node.isReady and n != 1 and "timestamp"+str(node.node_id) in self.timestamps: values = node.get_values(0x31, "User", "All", True, False) for value in values.itervalues(): if value.label == "Relative Humidity": @@ -449,7 +421,7 @@ class Backend(): def luminance(self, n): for node in self.network.nodes.itervalues(): - if node.node_id == n and node.isReady and n != 1 : + if node.node_id == n and node.isReady and n != 1 and "timestamp"+str(node.node_id) in self.timestamps: values = node.get_values(0x31, "User", "All", True, False) for value in values.itervalues(): if value.label == "Luminance": @@ -461,7 +433,7 @@ class Backend(): def motion(self, n): for node in self.network.nodes.itervalues(): - if node.node_id == n and node.isReady and n != 1 : + if node.node_id == n and node.isReady and n != 1 and "timestamp"+str(node.node_id) in self.timestamps: values = node.get_values(0x30, "User", "All", True, False) for value in values.itervalues(): if value.label == "Sensor": @@ -473,7 +445,7 @@ class Backend(): def battery(self, n): for node in self.network.nodes.itervalues(): - if node.node_id == n and node.isReady and n != 1 : + if node.node_id == n and node.isReady and n != 1 and "timestamp"+str(node.node_id) in self.timestamps: val = node.get_battery_level() return jsonify(controller = name, sensor = node.node_id, location = node.location, type = "battery", updateTime = self.timestamps["timestamp"+str(node.node_id)], value = val) return "Node not ready or wrong sensor node !" diff --git a/flask-main.py b/flask-main.py index 2ca253fc2b64ec3e9cfbd1616982c3c1d36870ae..6dbce47591ad540ec6fae6efdb576940c7cc9427 100755 --- a/flask-main.py +++ b/flask-main.py @@ -33,6 +33,31 @@ def index(): @apiSuccess {JSON} Table Network's Information. +@apiSuccessExample {json} Example data on success: +{ + "Network Home ID": "0xe221b13f", + "Node 1": { + "Is Ready": true, + "Neighbours": "2", + "Node ID": "1", + "Node location": "", + "Node name": "", + "Product name": "Z-Stick Gen5", + "Query Stage": "Complete", + "Query Stage (%)": "100 %" + }, + "Node 2": { + "Is Ready": true, + "Neighbours": "1", + "Node ID": "2", + "Node location": "", + "Node name": "", + "Product name": "MultiSensor 6", + "Query Stage": "Complete", + "Query Stage (%)": "100 %" + } +} + @apiDescription Gets the configuration of the Z-Wave network in a JSON format """ @@ -66,7 +91,23 @@ def network_configureNodes(Grp_interval,Grp_reports,Wakeup_interval): @apiName Networks' Nodes configuration @apiGroup Admin -@apiSuccess {html} Table Describing of the nodes' configuration. +@apiSuccess {JSON} Table Describing of the nodes' configuration. + +@apiSuccessExample {json} Example data on success: +{ + "Network Home ID": "0xe221b13f", + "Node 2": { + "Enable Motion Sensor": "Enabled level 5 (maximum sensitivity", + "Group 1 Interval": "3600", + "Group 1 Reports": "241", + "Group 2 Interval": "3600", + "Group 2 Reports": "0", + "Group 3 Interval": "3600", + "Group 3 Reports": "0", + "Node ID": "2", + "Wake-up Interval": "240" + } +} @apiDescription Gets a html with the list of nodes and their configuration parameters @@ -595,7 +636,7 @@ if __name__ == '__main__': file_handler.setFormatter(Formatter('%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]')) app.logger.addHandler(file_handler) - app.run(host='::', debug=False, use_reloader=False) + app.run(host='::', debug=False, use_reloader=False, port=5000) except KeyboardInterrupt: backend.stop()