def forceSendState(self): if self._forceSendState: self._forceSendState = False stateChange = StateChange() stateChange.clientSensorId = self.id if self.state == self.triggerState: stateChange.state = 1 else: stateChange.state = 0 stateChange.dataType = self.sensorDataType stateChange.sensorData = self.sensorData return stateChange return None
def forceSendState(self): if (int(time.time()) - self.lastUpdate) > self.interval: self.lastUpdate = int(time.time()) stateChange = StateChange() stateChange.clientSensorId = self.id if self.state == self.triggerState: stateChange.state = 1 else: stateChange.state = 0 stateChange.dataType = self.sensorDataType stateChange.sensorData = self.sensorData return stateChange return None
def execute(self): # time on which the last full sensor states were sent # to the server lastFullStateSent = 0 # Get reference to server communication object. while self.connection is None: time.sleep(0.5) self.connection = self.globalData.serverComm self._isInitialized = True while True: # check if the client is connected to the server # => wait and continue loop until client is connected if not self.connection.isConnected(): time.sleep(0.5) continue # poll all sensors and check their states for sensor in self.sensors: oldState = sensor.getState() sensor.updateState() currentState = sensor.getState() # Check if a sensor alert is forced to send to the server. # => update already known state and continue sensorAlert = sensor.forceSendAlert() if sensorAlert: oldState = currentState asyncSenderProcess = AsynchronousSender( self.connection, self.globalData) # set thread to daemon # => threads terminates when main thread terminates asyncSenderProcess.daemon = True asyncSenderProcess.sendSensorAlert = True asyncSenderProcess.sendSensorAlertSensorAlert = sensorAlert asyncSenderProcess.start() continue # check if the current state is the same # than the already known state => continue elif oldState == currentState: continue # check if the current state is an alert triggering state elif currentState == sensor.triggerState: # check if the sensor triggers a sensor alert # => send sensor alert to server if sensor.triggerAlert: logging.info("[%s]: Sensor alert " % self.fileName + "triggered by '%s'." % sensor.description) # Create sensor alert object to send to the server. sensorAlert = SensorAlert() sensorAlert.clientSensorId = sensor.id sensorAlert.state = 1 sensorAlert.hasOptionalData = sensor.hasOptionalData sensorAlert.optionalData = sensor.optionalData sensorAlert.changeState = sensor.changeState sensorAlert.hasLatestData = sensor.hasLatestData sensorAlert.dataType = sensor.sensorDataType sensorAlert.sensorData = sensor.sensorData asyncSenderProcess = AsynchronousSender( self.connection, self.globalData) # set thread to daemon # => threads terminates when main thread terminates asyncSenderProcess.daemon = True asyncSenderProcess.sendSensorAlert = True asyncSenderProcess.sendSensorAlertSensorAlert = \ sensorAlert asyncSenderProcess.start() # if sensor does not trigger sensor alert # => just send changed state to server else: logging.debug("[%s]: State " % self.fileName + "changed by '%s'." % sensor.description) # Create state change object to send to the server. stateChange = StateChange() stateChange.clientSensorId = sensor.id stateChange.state = 1 stateChange.dataType = sensor.sensorDataType stateChange.sensorData = sensor.sensorData asyncSenderProcess = AsynchronousSender( self.connection, self.globalData) # set thread to daemon # => threads terminates when main thread terminates asyncSenderProcess.daemon = True asyncSenderProcess.sendStateChange = True asyncSenderProcess.sendStateChangeStateChange = \ stateChange asyncSenderProcess.start() # only possible situation left => sensor changed # back from triggering state to a normal state else: # check if the sensor triggers a sensor alert when # state is back to normal # => send sensor alert to server if sensor.triggerAlertNormal: logging.info("[%s]: Sensor alert " % self.fileName + "for back to normal state " + "triggered by '%s'." % sensor.description) # Create sensor alert object to send to the server. sensorAlert = SensorAlert() sensorAlert.clientSensorId = sensor.id sensorAlert.state = 0 sensorAlert.hasOptionalData = sensor.hasOptionalData sensorAlert.optionalData = sensor.optionalData sensorAlert.changeState = sensor.changeState sensorAlert.hasLatestData = sensor.hasLatestData sensorAlert.dataType = sensor.sensorDataType sensorAlert.sensorData = sensor.sensorData asyncSenderProcess = AsynchronousSender( self.connection, self.globalData) # set thread to daemon # => threads terminates when main thread terminates asyncSenderProcess.daemon = True asyncSenderProcess.sendSensorAlert = True asyncSenderProcess.sendSensorAlertSensorAlert = \ sensorAlert asyncSenderProcess.start() # if sensor does not trigger sensor alert when # state is back to normal # => just send changed state to server else: logging.debug("[%s]: State " % self.fileName + "changed by '%s'." % sensor.description) # Create state change object to send to the server. stateChange = StateChange() stateChange.clientSensorId = sensor.id stateChange.state = 0 stateChange.dataType = sensor.sensorDataType stateChange.sensorData = sensor.sensorData asyncSenderProcess = AsynchronousSender( self.connection, self.globalData) # set thread to daemon # => threads terminates when main thread terminates asyncSenderProcess.daemon = True asyncSenderProcess.sendStateChange = True asyncSenderProcess.sendStateChangeStateChange = \ stateChange asyncSenderProcess.start() # Poll all sensors if they want to force an update that should # be send to the server. for sensor in self.sensors: stateChange = sensor.forceSendState() if stateChange: asyncSenderProcess = AsynchronousSender( self.connection, self.globalData) # set thread to daemon # => threads terminates when main thread terminates asyncSenderProcess.daemon = True asyncSenderProcess.sendStateChange = True asyncSenderProcess.sendStateChangeStateChange = stateChange asyncSenderProcess.start() # check if the last state that was sent to the server # is older than 60 seconds => send state update utcTimestamp = int(time.time()) if (utcTimestamp - lastFullStateSent) > 60: logging.debug("[%s]: Last state " % self.fileName + "timed out.") asyncSenderProcess = AsynchronousSender( self.connection, self.globalData) # set thread to daemon # => threads terminates when main thread terminates asyncSenderProcess.daemon = True asyncSenderProcess.sendSensorsState = True asyncSenderProcess.start() # update time on which the full state update was sent lastFullStateSent = utcTimestamp time.sleep(0.5)
def execute(self): # time on which the last full sensor states were sent # to the server lastFullStateSent = 0 # Get reference to server communication object. while self.connection is None: time.sleep(0.5) self.connection = self.globalData.serverComm self._isInitialized = True while True: # check if the client is connected to the server # => wait and continue loop until client is connected if not self.connection.isConnected(): time.sleep(0.5) continue # poll all sensors and check their states for sensor in self.sensors: oldState = sensor.getState() sensor.updateState() currentState = sensor.getState() # Check if a sensor alert is forced to send to the server. # => update already known state and continue sensorAlert = sensor.forceSendAlert() if sensorAlert: oldState = currentState asyncSenderProcess = AsynchronousSender( self.connection, self.globalData) # set thread to daemon # => threads terminates when main thread terminates asyncSenderProcess.daemon = True asyncSenderProcess.sendSensorAlert = True asyncSenderProcess.sendSensorAlertSensorAlert = sensorAlert asyncSenderProcess.start() continue # check if the current state is the same # than the already known state => continue elif oldState == currentState: continue # check if the current state is an alert triggering state elif currentState == sensor.triggerState: # check if the sensor triggers a sensor alert # => send sensor alert to server if sensor.triggerAlert: logging.info("[%s]: Sensor alert " % self.fileName + "triggered by '%s'." % sensor.description) # Create sensor alert object to send to the server. sensorAlert = SensorAlert() sensorAlert.clientSensorId = sensor.id sensorAlert.state = 1 sensorAlert.hasOptionalData = sensor.hasOptionalData sensorAlert.optionalData = sensor.optionalData sensorAlert.changeState = sensor.changeState sensorAlert.hasLatestData = sensor.hasLatestData sensorAlert.dataType = sensor.sensorDataType sensorAlert.sensorData = sensor.sensorData asyncSenderProcess = AsynchronousSender( self.connection, self.globalData) # set thread to daemon # => threads terminates when main thread terminates asyncSenderProcess.daemon = True asyncSenderProcess.sendSensorAlert = True asyncSenderProcess.sendSensorAlertSensorAlert = \ sensorAlert asyncSenderProcess.start() # if sensor does not trigger sensor alert # => just send changed state to server else: logging.debug("[%s]: State " % self.fileName + "changed by '%s'." % sensor.description) # Create state change object to send to the server. stateChange = StateChange() stateChange.clientSensorId = sensor.id stateChange.state = 1 stateChange.dataType = sensor.sensorDataType stateChange.sensorData = sensor.sensorData asyncSenderProcess = AsynchronousSender( self.connection, self.globalData) # set thread to daemon # => threads terminates when main thread terminates asyncSenderProcess.daemon = True asyncSenderProcess.sendStateChange = True asyncSenderProcess.sendStateChangeStateChange = \ stateChange asyncSenderProcess.start() # only possible situation left => sensor changed # back from triggering state to a normal state else: # check if the sensor triggers a sensor alert when # state is back to normal # => send sensor alert to server if sensor.triggerAlertNormal: logging.info("[%s]: Sensor alert " % self.fileName + "for back to normal state " + "triggered by '%s'." % sensor.description) # Create sensor alert object to send to the server. sensorAlert = SensorAlert() sensorAlert.clientSensorId = sensor.id sensorAlert.state = 0 sensorAlert.hasOptionalData = sensor.hasOptionalData sensorAlert.optionalData = sensor.optionalData sensorAlert.changeState = sensor.changeState sensorAlert.hasLatestData = sensor.hasLatestData sensorAlert.dataType = sensor.sensorDataType sensorAlert.sensorData = sensor.sensorData asyncSenderProcess = AsynchronousSender( self.connection, self.globalData) # set thread to daemon # => threads terminates when main thread terminates asyncSenderProcess.daemon = True asyncSenderProcess.sendSensorAlert = True asyncSenderProcess.sendSensorAlertSensorAlert = \ sensorAlert asyncSenderProcess.start() # if sensor does not trigger sensor alert when # state is back to normal # => just send changed state to server else: logging.debug("[%s]: State " % self.fileName + "changed by '%s'." % sensor.description) # Create state change object to send to the server. stateChange = StateChange() stateChange.clientSensorId = sensor.id stateChange.state = 0 stateChange.dataType = sensor.sensorDataType stateChange.sensorData = sensor.sensorData asyncSenderProcess = AsynchronousSender( self.connection, self.globalData) # set thread to daemon # => threads terminates when main thread terminates asyncSenderProcess.daemon = True asyncSenderProcess.sendStateChange = True asyncSenderProcess.sendStateChangeStateChange = \ stateChange asyncSenderProcess.start() # Poll all sensors if they want to force an update that should # be send to the server. for sensor in self.sensors: stateChange = sensor.forceSendState() if stateChange: asyncSenderProcess = AsynchronousSender( self.connection, self.globalData) # set thread to daemon # => threads terminates when main thread terminates asyncSenderProcess.daemon = True asyncSenderProcess.sendStateChange = True asyncSenderProcess.sendStateChangeStateChange = stateChange asyncSenderProcess.start() # check if the last state that was sent to the server # is older than 60 seconds => send state update if (time.time() - lastFullStateSent) > 60: logging.debug("[%s]: Last state " % self.fileName + "timed out.") asyncSenderProcess = AsynchronousSender( self.connection, self.globalData) # set thread to daemon # => threads terminates when main thread terminates asyncSenderProcess.daemon = True asyncSenderProcess.sendSensorsState = True asyncSenderProcess.start() # update time on which the full state update was sent lastFullStateSent = time.time() time.sleep(0.5)