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