예제 #1
0
    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)
예제 #2
0
 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([])
예제 #3
0
    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()}})
예제 #4
0
 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
             }})
예제 #5
0
    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})
예제 #6
0
    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']))
예제 #8
0
    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
예제 #9
0
 def on_disconnect(self):
     logger.info("disconnect ...")
     pass
예제 #10
0
 def get(self):
     """Get all electrovalves"""
     logger.info('Get all electrovalves')
     electrovalves = self.mongo.db.electrovalve.find()
     return jsonify(list(electrovalves))
예제 #11
0
 def get(self):
     """Get all pins"""
     logger.info('Get all pins')
     available_pins = self.pin_facade.getAvailablePin()
     return jsonify(available_pins)