private DPTXlator createTranslator(final int objIndex, final int pid)
		throws KNXException, InterruptedException
	{
		final int ot = getObjectType(objIndex, true);
		int pdt = -1;
		Property p = (Property) properties.get(new PropertyKey(ot, pid));
		// if no property found, lookup global pid
		if (p == null && pid < 50)
			p = (Property) properties.get(new PropertyKey(pid));
		if (p != null) {
			if (p.dpt != null)
				try {
					final DPTXlator t = TranslatorTypes.createTranslator(0, p.dpt);
					t.setAppendUnit(false);
					return t;
				}
				catch (final KNXException e) {
					logger.warn("fallback to default translator for PID " + pid
							+ ", no translator for DPT " + p.dpt, e);
				}
			pdt = p.pdt;
		}
		// if we didn't get pdt from definitions, query property description,
		// in local dev.mgmt, no pdt description is available
		if (pdt == -1 && !local)
			pdt = pa.getDescription(objIndex, pid, 0)[3] & 0x3f;
		if (PropertyTypes.hasTranslator(pdt)) {
			final DPTXlator t = PropertyTypes.createTranslator(pdt);
			t.setAppendUnit(false);
			return t;
		}
		final KNXException e = new KNXException(
				"no translator available for PID " + pid + ", " + getObjectTypeName(ot));
		logger.warn("translator missing for PID " + pid + ", PDT " + pdt, e);
		throw e;
	}