private void handleEventType(State state, EcoTouchTags heatpumpCommandType) { for (EcoTouchBindingProvider provider : providers) { for (String itemName : provider.getItemNamesForType(heatpumpCommandType)) { eventPublisher.postUpdate(itemName, state); } } }
/** @{inheritDoc */ @Override protected void execute() { if (!bindingsExist()) { logger.debug("There is no existing EcoTouch binding configuration => refresh cycle aborted!"); return; } try { // collect all tags which are actively used in items Set<String> tags = new HashSet<String>(); for (EcoTouchBindingProvider provider : providers) { for (String tag : provider.getActiveTags()) { tags.add(tag); } } EcoTouchConnector connector = new EcoTouchConnector(ip, username, password, cookies); // collect raw values from heat pump HashMap<String, Integer> rawvalues = new HashMap<String, Integer>(); // request values (this could later be handled more efficiently // inside connector.getValues(tags)) for (String tag : tags) { try { int rawvalue = connector.getValue(tag); // raw value from // heat pump (needs // interpretation) rawvalues.put(tag, rawvalue); } catch (Exception e) { // the connector already logged the exception cause // let's ignore it and try the next value (intermittent // network problem?) continue; } } // post updates to event bus for (EcoTouchBindingProvider provider : providers) { for (EcoTouchTags item : provider.getActiveItems()) { if (!rawvalues.containsKey(item.getTagName())) { // could not get the value from the heat pump continue; } int heatpumpValue = rawvalues.get(item.getTagName()); if (item.getType() == EcoTouchTags.Type.Analog) { // analog value encoded as a scaled integer BigDecimal decimal = new BigDecimal(heatpumpValue).divide(new BigDecimal(10)); handleEventType(new DecimalType(decimal), item); } else if (item.getType() == EcoTouchTags.Type.Word) { // integer handleEventType(new DecimalType(heatpumpValue), item); } else { // bit field heatpumpValue >>= item.getBitNum(); heatpumpValue &= 1; handleEventType(new DecimalType(heatpumpValue), item); } } } // store authentication info cookies = connector.getCookies(); } finally { } }
@Override protected void internalReceiveCommand(String itemName, Command command) { // find the EcoTouch binding for the itemName EcoTouchTags tag = null; for (EcoTouchBindingProvider provider : providers) { try { tag = provider.getTypeForItemName(itemName); break; } catch (Exception e) { } } // consider special cases if (tag == EcoTouchTags.TYPE_ADAPT_HEATING) { double adapt = Double.parseDouble(command.toString()); adapt = (adapt + 2) * 2; adapt = Math.max(0, adapt); adapt = Math.min(8, adapt); command = new DecimalType((int) adapt); } EcoTouchConnector connector = new EcoTouchConnector(ip, username, password, cookies); int value = 0; switch (tag.getType()) { case Analog: value = (int) (Double.parseDouble(command.toString()) * 10); break; case Word: if (command == OnOffType.ON) { value = 1; } else if (command == OnOffType.OFF) { value = 0; } else { value = Integer.parseInt(command.toString()); } break; case Bitfield: try { // read-modify-write style value = connector.getValue(tag.getTagName()); int bitmask = 1 << tag.getBitNum(); if (command == OnOffType.OFF || Integer.parseInt(command.toString()) == 0) { value = value & ~bitmask; } else { value = value | bitmask; } } catch (Exception e1) { // connector.getValue() already logged a specific debug message logger.warn("cannot send command '" + command + "' to item '" + itemName + "'"); return; } } try { connector.setValue(tag.getTagName(), value); // It does not make sense to check the returned value from // setValue(). // Even if the tag is read only, one would get the newly set value // back. } catch (Exception e) { // connector.setValue() already logged a specific debug message logger.warn("cannot send command '" + command + "' to item '" + itemName + "'"); } }