def put(self, electrovalve_id): """Update electrovalve""" _id = self.__toObjectId(electrovalve_id) json = request.get_json() electrovalve, errors = ElectrovalveSchema().load(json) logger.info(electrovalve) if errors: return make_response(jsonify({'message': errors}), 400) result = self.mongo.db.electrovalve.find_one({'_id': _id}) if result is not None: self.isWatering(result) self.validatePin(electrovalve, result) else: return make_response( jsonify({ 'message': ELECTROVALVE_NOT_FOUND.format(electrovalve_id) }), 404) if electrovalve['mode'] == 'automatic': electrovalve['timetable'] = None elif electrovalve['mode'] == 'scheduled': electrovalve['humidity_threshold'] = None electrovalve['sensor_pin'] = None else: electrovalve['timetable'] = None electrovalve['humidity_threshold'] = None electrovalve['sensor_pin'] = None self.mongo.db.electrovalve.update_one({'_id': _id}, {"$set": electrovalve}) self.addJob(electrovalve, electrovalve_id) return make_response(jsonify({'id': electrovalve_id}), 201)
def delete(self): """Delete all electrovalves""" logger.info('Delete all electrovalves') electrovalves = self.mongo.db.electrovalve.find() for electrovalve in electrovalves: self.removeJob(electrovalve, electrovalve['_id']) electrovalves = self.mongo.db.electrovalve.remove() return jsonify([])
def __call__(self, electrovalve_id): with mongo.app.app_context(): electrovalve = mongo.db.electrovalve.find_one_and_update({'_id': ObjectId(electrovalve_id) }, {'$set': {'watering': True}}) logger.info('ManualElectrovalve job started ...') logger.info('Water electrovalve with id {} at pin {}' .format(electrovalve_id, electrovalve['electrovalve_pin'])) time.sleep(electrovalve['duration']) electrovalve = mongo.db.electrovalve.find_one_and_update({'_id': ObjectId(electrovalve_id) }, {'$set': {'watering': False, 'last_water': datetime.utcnow()}})
def __call__(self, electrovalve_id): logger.info('SoilSensor job started ...') # GPIO.setwarnings(False) # GPIO.setmode(GPIO.BOARD) # GPIO.setup(pin, GPIO.IN) current_humidity = randint(1, 100) with mongo.app.app_context(): logger.info( 'Soil sensor for electrovalve with id {} has observed humidity {}%' .format(electrovalve_id, current_humidity)) mongo.db.electrovalve.find_one_and_update( {'_id': ObjectId(electrovalve_id)}, {'$set': { 'current_humidity': current_humidity }})
def post(self): """Create new electrovalve""" json = request.get_json() electrovalve, errors = ElectrovalveSchema().load(json) logger.info(electrovalve) if errors: return make_response(jsonify({'message': errors}), 400) self.validatePin(electrovalve) electrovalve['watering'] = False result = self.mongo.db.electrovalve.insert_one(electrovalve) electrovalve_id = str(result.inserted_id) self.addJob(electrovalve, electrovalve_id) return jsonify({'id': electrovalve_id})
def validate_object(self, data): logger.info(not 'timetable' in data) if data['mode'] == 'automatic' and not 'sensor_pin' in data: raise ValidationError('Automatic mode requires sensor_pin field') if data['mode'] == 'automatic' and not 'humidity_threshold' in data: raise ValidationError( 'Automatic mode requires humidity_threshold field') if data['mode'] != 'automatic' and 'sensor_pin' in data: raise ValidationError( 'sensor_pin field is valid only for automatic mode') if data['mode'] != 'automatic' and 'humidity_threshold' in data: raise ValidationError( 'humidity_threshold field is valid only for automatic mode') if data['mode'] == 'scheduled' and not 'timetable' in data: raise ValidationError('Scheduled mode requires timetable field') if data['mode'] != 'scheduled' and 'timetable' in data: raise ValidationError( 'timetable field is valid only for scheduled mode')
def __call__(self, electrovalve_id): with mongo.app.app_context(): electrovalve = mongo.db.electrovalve.find_one( {'_id': ObjectId(electrovalve_id)}) logger.info('AutomaticElectrovalve job started ...') # GPIO.setwarnings(False) # GPIO.setmode(GPIO.BOARD) # GPIO.setup(electrovalve.electrovalve_pin, GPIO.OUT) # logger.info( 'Electrovalve with id {} - Current humidity {}% : Humidity treshold {}%' .format(electrovalve_id, electrovalve['current_humidity'], electrovalve['humidity_threshold'])) if electrovalve is not None and electrovalve[ 'current_humidity'] < electrovalve['humidity_threshold']: logger.info('Water electrovalve with id {} at pin {}'.format( electrovalve_id, electrovalve['electrovalve_pin']))
def getAvailablePin(self): electrovalves = list(self.mongo.db.electrovalve.find()) if electrovalves is not None: automatic_electrovalves = filter( lambda electrovalve: 'sensor_pin' in electrovalve, electrovalves) sensor_pins = map(lambda electrovalve: electrovalve['sensor_pin'], automatic_electrovalves) electrovalve_pins = map( lambda electrovalve: electrovalve['electrovalve_pin'], electrovalves) logger.info(electrovalve_pins) logger.info(sensor_pins) available_pins = [ name for name, pin in PINS.iteritems() if name not in electrovalve_pins + sensor_pins ] logger.info(available_pins) return available_pins else: return PINS
def on_disconnect(self): logger.info("disconnect ...") pass
def get(self): """Get all electrovalves""" logger.info('Get all electrovalves') electrovalves = self.mongo.db.electrovalve.find() return jsonify(list(electrovalves))
def get(self): """Get all pins""" logger.info('Get all pins') available_pins = self.pin_facade.getAvailablePin() return jsonify(available_pins)