9 Commits

Author SHA1 Message Date
Senad Uka
d15bc0e5a6 problem with python syntax 2016-03-06 14:49:26 +01:00
Senad Uka
ee828c544e syntax error fix 2016-03-06 14:47:42 +01:00
Senad Uka
28e5f7f1f0 safe key getting from the response 2016-03-06 14:46:42 +01:00
Senad Uka
ed8267b6ab ignore existing config 2016-03-06 14:14:26 +01:00
Senad Uka
99fdc768fc config/init.py removed 2016-03-06 14:13:25 +01:00
Senad Uka
c47e1be364 Finished in valve support 2016-03-06 14:07:33 +01:00
Senad Uka
8d9e42c147 reformatted code 2016-03-06 13:40:53 +01:00
Senad Uka
279e0f8652 Added suport for in valve 2016-03-06 13:40:53 +01:00
2395cc6ddf Merge pull request #8 from senaduka/optimize_subscriptions
Optimized subscriptions
2016-03-06 12:05:48 +01:00
6 changed files with 85 additions and 20 deletions

3
.gitignore vendored
View File

@@ -1,3 +1,6 @@
# configuration
controller/config/__init__.py
# Byte-compiled / optimized / DLL files # Byte-compiled / optimized / DLL files
__pycache__/ __pycache__/
*.py[cod] *.py[cod]

View File

@@ -11,6 +11,7 @@
</div> </div>
{{/with}} {{/with}}
<div>Otpusni ventil: {{pretty_valve state.out_valve }}</div> <div>Otpusni ventil: {{pretty_valve state.out_valve }}</div>
<div>Ulazni ventil/pumpa: {{pretty_valve state.in_valve }}</div>
<div>Zadnja komunikacija: {{ last_communication_time }}</div> <div>Zadnja komunikacija: {{ last_communication_time }}</div>
{{/with}} {{/with}}
<div> <div>

View File

@@ -1,7 +1,6 @@
function controller_state() { function controller_state() {
var controllerId = Session.get('controller_id'); var controllerId = Session.get('controller_id');
result = ControllerState.findOne({}); result = ControllerState.findOne({});
console.log("jupiii", result);
if (!result) { if (!result) {
result = {} result = {}
}; };

View File

@@ -9,7 +9,7 @@ Api.addRoute('sensorData', {
authRequired: false authRequired: false
}, { }, {
post: function() { post: function() {
console.log("Body params", this.bodyParams); reactToSensorData(this.bodyParams);
SensorData.insert({ SensorData.insert({
temperatureValue: parseFloat(this.bodyParams.temperatureValue), temperatureValue: parseFloat(this.bodyParams.temperatureValue),
humidityValue: parseFloat(this.bodyParams.humidityValue), 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', { Api.addRoute('state/:id', {
authRequired: false authRequired: false
}, { }, {
post: function() { post: function() {
console.log("Body params", this.bodyParams); console.log("setting state", this.bodyParams);
return ControllerState.update({ return ControllerState.update({
controller_id: this.urlParams.id controller_id: this.urlParams.id
}, { }, {
'$set': { '$set': {
'state.out_valve': this.bodyParams.out_valve, 'state.out_valve': this.bodyParams.out_valve,
'state.in_valve': this.bodyParams.in_valve,
'time': new Date(), 'time': new Date(),
'set_by': 'client' 'set_by': 'client'
} }
@@ -43,6 +76,7 @@ Api.addRoute('state/:id', {
} }
}); });
function stateOrDefault(id) { function stateOrDefault(id) {
var stateEntry = ControllerState.findOne({ var stateEntry = ControllerState.findOne({
controller_id: id, controller_id: id,
@@ -52,13 +86,13 @@ function stateOrDefault(id) {
stateEntry = ControllerState.insert({ stateEntry = ControllerState.insert({
controller_id: id, controller_id: id,
state: { state: {
out_valve: 'closed' out_valve: 'closed',
in_valve: 'closed'
}, },
time: new Date(), time: new Date(),
config: { config: {
draining_period_amount: 5, draining_period_amount: 5,
draining_period_unit: 'minutes' draining_period_unit: 'minutes'
}, },
set_by: 'server' set_by: 'server'
}); });

View File

@@ -3,7 +3,8 @@
GPIO_PIN_DHT = 4 # BCM GPIO_PIN_DHT = 4 # BCM
SENSORDATA_URL = 'http://tfm.meteor.com/api/v1.0/sensorData' SENSORDATA_URL = 'http://tfm.meteor.com/api/v1.0/sensorData'
GPIO_PIN_TANKFULL = 20 # BCM 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' API_BASE_URL = 'http://tfm.meteor.com/api/v1.0'
CONTROLLER_ID = '120' # every controller must have a different one CONTROLLER_ID = '120' # every controller must have a different one
STATE_FILE = '/var/run/controller_state' STATE_FILE = '/var/run/controller_state'

View File

@@ -7,29 +7,56 @@ class Changer(object):
self.local_state = local_state self.local_state = local_state
self.remote_state = remote_state self.remote_state = remote_state
GPIO.setmode(GPIO.BCM) # Broadcom pin-numbering scheme GPIO.setmode(GPIO.BCM) # Broadcom pin-numbering scheme
GPIO.setup(config.GPIO_PIN_VALVE, GPIO.OUT) GPIO.setup(config.GPIO_PIN_OUT_VALVE, GPIO.OUT)
GPIO.setup(config.GPIO_PIN_IN_VALVE, GPIO.OUT)
self.states = {
'opening': self.open_valve,
'closing': self.close_valve,
'open': self.open_valve,
'closed': self.close_valve
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): def process_change(self):
self.validate_states() self.validate_states()
change = self.states.get(self.remote_state['out_valve'], None )
if change is not None: out_valve_change = self.out_valve_states.get(self.safe_remote_state('out_valve'), None )
change() 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 return self.local_state
def open_valve(self): def open_in_valve(self):
GPIO.output(config.GPIO_PIN_VALVE, GPIO.HIGH) 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' self.local_state['out_valve'] = 'open'
def close_valve(self): def close_out_valve(self):
GPIO.output(config.GPIO_PIN_VALVE, GPIO.LOW) GPIO.output(config.GPIO_PIN_OUT_VALVE, GPIO.LOW)
self.local_state['out_valve'] = 'closed' self.local_state['out_valve'] = 'closed'
def validate_states(self): def validate_states(self):