Example #1
0
File: app.py Project: TurpIF/KHome
def api_module_field_status(module_name, field_name):
    if not packaging.is_installed(module_name):
        abort(404)

    try:
        mod = use_module(module_name)
    except RuntimeError as e:
        app.logger.exception(e)
        abort(404)
    else:
        # field exists ?
        if not field_name in mod.fields_info:
            abort(400)

        # field is readable ?
        f = mod.fields_info[field_name]
        if 'readable' not in f or not f['readable']:
            abort(403)

        # field returns value ?
        value = getattr(mod, f['name'])()
        if value is None:
            abort(404)

        return jsonify(dict(zip(('time', 'value'), value)))
Example #2
0
def api_module_field_status(module_name, field_name):
    if not packaging.is_installed(module_name):
        abort(404)

    try:
        mod = use_module(module_name)
    except RuntimeError as e:
        app.logger.exception(e)
        abort(404)
    else:
        # field exists ?
        if not field_name in mod.fields_info:
            abort(400)

        # field is readable ?
        f = mod.fields_info[field_name]
        if 'readable' not in f or not f['readable']:
            abort(403)

        # field returns value ?
        value = getattr(mod, f['name'])()
        if value is None:
            abort(404)

        return jsonify(dict(zip(('time', 'value'), value)))
Example #3
0
def api_module_info(module_name):
    try:
        module_info = use_module(module_name).info
        module_info['name'] = path.realname(module_info['name'])  # hack
        return jsonify(module_info)
    except (TypeError, RuntimeError) as e:
        app.logger.exception(e)
        abort(404)
Example #4
0
def _get_mod_info(module_name, field_name):
    """
    Return the information for the field *field_name* for the module
    *module_name*.
    """
    mod = module.use_module(module_name)
    field = getattr(mod, field_name)
    return mod.fields_info[field_name]
Example #5
0
File: app.py Project: TurpIF/KHome
def api_module_info(module_name):
    try:
        module_info = use_module(module_name).info
        module_info['name'] = path.realname(module_info['name']) # hack
        return jsonify(module_info)
    except (TypeError, RuntimeError) as e:
        app.logger.exception(e)
        abort(404)
Example #6
0
def _get_mod_info(module_name, field_name):
    """
    Return the information for the field *field_name* for the module
    *module_name*.
    """
    mod = module.use_module(module_name)
    field = getattr(mod, field_name)
    return mod.fields_info[field_name]
Example #7
0
def test_module(module_name):
    logger.info('Début du test du module "%s"', module_name)
    mod = use_module(module_name)
    logger.info('Informations (brutes) : %s', mod.info)
    fields = mod.info['fields']

    if 'public_name' in mod.info or not mod.info['public_name']:
        logger.warning('Pas de nom public pour le module (ajouter un public_name = "xxx" dans la description du module')

    if not fields:
        logger.error('Pas de champ défini dans le module')
    for field in fields:
        logger.info('Début du test du champ : "%s"', field['name'].encode('utf8'))
        if 'public_name' in field or not field['public_name']:
            logger.warning('Pas de nom public pour le field (ajouter un public_name = "xxx" dans la description du field')
        field_fn = getattr(mod, field['name'])
        syntax = str
        if 'type' in field:
            if field['type'] == 'numeric':
                syntax = float
            elif field['type'] == 'boolean':
                syntax = bool
            elif field['type'] == 'string':
                syntax = str
            else:
                logger.warning('Pas de type connu pour ce champ. (Il faut faire heriter de fields.syntax.xxx)')
        else:
            logger.warning('Pas de type pour ce champ. (Il faut faire heriter de "fields.syntax.<type>")')

        if 'readable' in field and field['readable']:
            value = field_fn()
            if isinstance(value, str):
                value = value.encode('utf8')
            logger.info('Test en lecture : "%s"', value)
            if value is None:
                logger.warning('Pas de valeur pour ce champ. (Il faut heriter de "fields.persistant.Volatile")')
        if 'writable' in field and field['writable']:
            if syntax is float:
                new_value = 42.0
            elif syntax is bool:
                new_value = True
            elif syntax is str:
                new_value = 'Hello world!'

            logger.info('Test en écriture : écriture de "%s"', new_value)
            field_fn(new_value)
            if 'readable' in field and field['readable']:
                value = field_fn()
                logger.info('Valeur lue après écriture : "%s"', value)
                if value is None:
                    logger.error('Pas de valeur pour ce champ après écriture')
                elif value[1] != new_value:
                    logger.error('Pas la même valeur lue après écriture')
        if not 'writable' in field and not 'readable' in field:
            logger.warning('Champ ni "readable" ni "writable"')
        logger.info('Fin du test du champ : "%s"', field['name'])
    logger.info('Fin du test du module "%s"', module_name)
Example #8
0
def api_update_field(module_name):
    try:
        field_name = request.form['field']
        value = request.form['value']
    except KeyError:
        abort(400)
    else:
        try:
            mod = use_module(module_name)
            field_fn = getattr(mod, field_name)
            return jsonify({'success': field_fn(value)})
        except (AttributeError, RuntimeError) as e:
            app.logger.exception(e)
            abort(400)
    abort(400)
Example #9
0
File: app.py Project: TurpIF/KHome
def api_update_field(module_name):
    try:
        field_name = request.form['field']
        value = request.form['value']
    except KeyError:
        abort(400)
    else:
        try:
            mod = use_module(module_name)
            field_fn = getattr(mod, field_name)
            return jsonify({ 'success':  field_fn(value) })
        except (AttributeError, RuntimeError) as e:
            app.logger.exception(e)
            abort(400)
    abort(400)
Example #10
0
def api_module_fields_all_statuses(module_name, field_name):
    if not packaging.is_installed(module_name):
        app.logger.warning('%s not installed', module_name)
        abort(404)
    try:
        mod = use_module(module_name)
    except RuntimeError as e:
        app.logger.exception(e)
        abort(404)
    else:
        if not field_name in mod.fields_info:
            abort(400)

        f = mod.fields_info[field_name]
        if 'readable' not in f or not f['readable']:
            abort(400)

        data = getattr(mod, f['name'])(fr=-time.time(), to=0)
        return jsonify([dict(zip(('time', 'value'), v)) for v in data])
Example #11
0
File: app.py Project: TurpIF/KHome
def api_module_fields_all_statuses(module_name, field_name):
    if not packaging.is_installed(module_name):
        app.logger.warning('%s not installed', module_name)
        abort(404)
    try:
        mod = use_module(module_name)
    except RuntimeError as e:
        app.logger.exception(e)
        abort(404)
    else:
        if not field_name in mod.fields_info:
            abort(400)

        f = mod.fields_info[field_name]
        if 'readable' not in f or not f['readable']:
            abort(400)

        data = getattr(mod, f['name'])(fr=-time.time(), to=0)
        return jsonify([dict(zip(('time', 'value'), v)) for v in data])
Example #12
0
def api_module_status(module_name):
    # TODO add support for multiple instances
    if not packaging.is_installed(module_name):
        app.logger.warning('%s not installed', module_name)
        abort(404)
    try:
        mod = use_module(module_name)
        mod.info['name'] = path.realname(mod.info['name'])  # hack
    except RuntimeError as e:
        app.logger.exception(e)
        abort(404)
    else:
        fields = {}
        for f in mod.info['fields']:
            if 'readable' not in f or not f['readable']:
                continue
            value = getattr(mod, f['name'])()
            if value is None:
                continue
            f.update(dict(zip(('time', 'value'), value)))
        return jsonify(mod.info)
Example #13
0
File: app.py Project: TurpIF/KHome
def api_module_status(module_name):
    # TODO add support for multiple instances
    if not packaging.is_installed(module_name):
        app.logger.warning('%s not installed', module_name)
        abort(404)
    try:
        mod = use_module(module_name)
        mod.info['name'] = path.realname(mod.info['name']) # hack
    except RuntimeError as e:
        app.logger.exception(e)
        abort(404)
    else:
        fields = {}
        for f in mod.info['fields']:
            if 'readable' not in f or not f['readable']:
                continue
            value = getattr(mod, f['name'])()
            if value is None:
                continue
            f.update(dict(zip(('time', 'value'), value)))
        return jsonify(mod.info)
Example #14
0
class PushUp(module.Base):
    public_name = 'Faites des pompes !'
    nfc = module.use_module('NFC')
    update_rate = 10

    class amount(fields.syntax.Numeric, fields.io.Writable, fields.io.Readable,
                 fields.persistant.Database, fields.Base):
        init_value = 0

    class controller(fields.Base):
        update_rate = 0.4

        def on_start(self):
            self.nbr = 0
            return super(PushUp.controller, self).on_start()

        def always(self):
            door_state = self.module.nfc.uid()[1] != 'Pas de carte'
            old = self.module.nfc.uid(t=-1)[1] != 'Pas de carte'
            self.module.logger.info('door state: %s', door_state)
            if door_state and not old:
                self.nbr += 1
                t = threading.Thread(target=self.play_music)
                t.start()
                time.sleep(1)
            return super(PushUp.controller, self).always()

        def play_music(self):
            try:
                fname = 'music/%s.wma' % (self.nbr % 2)
                self.module.logger.info('playing music %s', fname)
                cmd = 'mplayer -quiet -vo null -softvol -nolirc %s' % fname
                proc = sp.Popen(shlex.split(cmd))
                proc.wait()
            except (TypeError, sp.CalledProcessError) as e:
                self.module.logger.exception(e)