diff --git a/.gitignore b/.gitignore index ba74660..8fde707 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +# configuration +controller/config/__init__.py + # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] diff --git a/app/client/state.html b/app/client/state.html index 2aacea9..2c32d6e 100644 --- a/app/client/state.html +++ b/app/client/state.html @@ -11,6 +11,7 @@ {{/with}}
Otpusni ventil: {{pretty_valve state.out_valve }}
+
Ulazni ventil/pumpa: {{pretty_valve state.in_valve }}
Zadnja komunikacija: {{ last_communication_time }}
{{/with}}
diff --git a/app/client/state.js b/app/client/state.js index 6264cd0..ed7e21a 100644 --- a/app/client/state.js +++ b/app/client/state.js @@ -1,7 +1,6 @@ function controller_state() { var controllerId = Session.get('controller_id'); result = ControllerState.findOne({}); - console.log("jupiii", result); if (!result) { result = {} }; diff --git a/app/server/api.js b/app/server/api.js index 2c0cf3d..1bdcd08 100644 --- a/app/server/api.js +++ b/app/server/api.js @@ -9,7 +9,7 @@ Api.addRoute('sensorData', { authRequired: false }, { post: function() { - console.log("Body params", this.bodyParams); + reactToSensorData(this.bodyParams); SensorData.insert({ temperatureValue: parseFloat(this.bodyParams.temperatureValue), humidityValue: parseFloat(this.bodyParams.humidityValue), @@ -23,16 +23,49 @@ Api.addRoute('sensorData', { }); +function reactToSensorData(nextSensorReading) { + console.log("reacting to sensor"); + var controllerId = nextSensorReading.controllerId; + var state = stateOrDefault(controllerId).state; + var shouldStartPumping = (parseInt(nextSensorReading.tankFull) === 0 && (!state.in_valve || state.in_valve === 'closed')); + + if (shouldStartPumping) { + ControllerState.update({ + controller_id: controllerId + }, { + '$set': { + 'state.in_valve': 'opening', + 'time': new Date(), + 'set_by': 'server' + } + }); + } + var shouldStopPumping = parseInt(nextSensorReading.tankFull) === 1 && (state.in_valve === 'open' || state.in_valve === 'opening'); + + if (shouldStopPumping) { + ControllerState.update({ + controller_id: controllerId + }, { + '$set': { + 'state.in_valve': 'closing', + 'time': new Date(), + 'set_by': 'server' + } + }); + } +} + Api.addRoute('state/:id', { authRequired: false }, { post: function() { - console.log("Body params", this.bodyParams); + console.log("setting state", this.bodyParams); return ControllerState.update({ controller_id: this.urlParams.id }, { '$set': { 'state.out_valve': this.bodyParams.out_valve, + 'state.in_valve': this.bodyParams.in_valve, 'time': new Date(), 'set_by': 'client' } @@ -43,6 +76,7 @@ Api.addRoute('state/:id', { } }); + function stateOrDefault(id) { var stateEntry = ControllerState.findOne({ controller_id: id, @@ -52,13 +86,13 @@ function stateOrDefault(id) { stateEntry = ControllerState.insert({ controller_id: id, state: { - out_valve: 'closed' + out_valve: 'closed', + in_valve: 'closed' }, time: new Date(), config: { draining_period_amount: 5, draining_period_unit: 'minutes' - }, set_by: 'server' }); diff --git a/controller/config/__init__.py b/controller/config/copy__init__.py.example similarity index 82% rename from controller/config/__init__.py rename to controller/config/copy__init__.py.example index 6a6c197..e018b03 100644 --- a/controller/config/__init__.py +++ b/controller/config/copy__init__.py.example @@ -3,7 +3,8 @@ GPIO_PIN_DHT = 4 # BCM SENSORDATA_URL = 'http://tfm.meteor.com/api/v1.0/sensorData' GPIO_PIN_TANKFULL = 20 # BCM -GPIO_PIN_VALVE = 21 # BCM +GPIO_PIN_OUT_VALVE = 21 # BCM +GPIO_PIN_IN_VALVE = 18 # BCM API_BASE_URL = 'http://tfm.meteor.com/api/v1.0' CONTROLLER_ID = '120' # every controller must have a different one STATE_FILE = '/var/run/controller_state' diff --git a/controller/state/changer.py b/controller/state/changer.py index 45e3e5f..2e2c1c8 100644 --- a/controller/state/changer.py +++ b/controller/state/changer.py @@ -7,29 +7,56 @@ class Changer(object): self.local_state = local_state self.remote_state = remote_state GPIO.setmode(GPIO.BCM) # Broadcom pin-numbering scheme - GPIO.setup(config.GPIO_PIN_VALVE, GPIO.OUT) - - self.states = { - 'opening': self.open_valve, - 'closing': self.close_valve, - 'open': self.open_valve, - 'closed': self.close_valve + GPIO.setup(config.GPIO_PIN_OUT_VALVE, GPIO.OUT) + GPIO.setup(config.GPIO_PIN_IN_VALVE, GPIO.OUT) + self.out_valve_states = { + 'opening': self.open_out_valve, + 'closing': self.close_out_valve, + 'open': self.open_out_valve, + 'closed': self.close_out_valve } + self.in_valve_states = { + 'opening': self.open_in_valve, + 'closing': self.close_in_valve, + 'open': self.open_in_valve, + 'closed': self.close_in_valve + } + + def safe_remote_state(self, key): + if key in ['out_valve', 'in_valve']: + return self.remote_state.get(key, 'closed') + else: + return self.remote_state.get(key,''); + def process_change(self): self.validate_states() - change = self.states.get(self.remote_state['out_valve'], None ) - if change is not None: - change() + + out_valve_change = self.out_valve_states.get(self.safe_remote_state('out_valve'), None ) + if out_valve_change is not None: + out_valve_change() + + in_valve_change = self.in_valve_states.get(self.safe_remote_state('in_valve'), None ) + if in_valve_change is not None: + in_valve_change() + return self.local_state - def open_valve(self): - GPIO.output(config.GPIO_PIN_VALVE, GPIO.HIGH) + def open_in_valve(self): + GPIO.output(config.GPIO_PIN_IN_VALVE, GPIO.HIGH) + self.local_state['in_valve'] = 'open' + + def close_in_valve(self): + GPIO.output(config.GPIO_PIN_IN_VALVE, GPIO.LOW) + self.local_state['in_valve'] = 'closed' + + def open_out_valve(self): + GPIO.output(config.GPIO_PIN_OUT_VALVE, GPIO.HIGH) self.local_state['out_valve'] = 'open' - def close_valve(self): - GPIO.output(config.GPIO_PIN_VALVE, GPIO.LOW) + def close_out_valve(self): + GPIO.output(config.GPIO_PIN_OUT_VALVE, GPIO.LOW) self.local_state['out_valve'] = 'closed' def validate_states(self):