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):