/** * Posts update event to OpenHAB bus for "holding" type slaves * * @param binding ModbusBinding to get item configuration from BindingProviding * @param registers data received from slave device in the last pollInterval * @param itemName item to update */ protected void internalUpdateItem(String slaveName, InputRegister[] registers, String itemName) { for (ModbusBindingProvider provider : providers) { if (!provider.providesBindingFor(itemName)) { continue; } ModbusBindingConfig config = provider.getConfig(itemName); if (!config.slaveName.equals(slaveName)) { continue; } String slaveValueType = modbusSlaves.get(slaveName).getValueType(); double rawDataMultiplier = modbusSlaves.get(slaveName).getRawDataMultiplier(); State newState = extractStateFromRegisters(registers, config.readRegister, slaveValueType); /* receive data manipulation */ State newStateBoolean = provider.getConfig(itemName).translateBoolean2State(!newState.equals(DecimalType.ZERO)); if (!UnDefType.UNDEF.equals(newStateBoolean)) { newState = newStateBoolean; } else if ((rawDataMultiplier != 1) && (config.getItem() instanceof NumberItem)) { double tmpValue = ((DecimalType) newState).doubleValue() * rawDataMultiplier; newState = new DecimalType(String.valueOf(tmpValue)); } State currentState = config.getItemState(); if (!newState.equals(currentState)) { eventPublisher.postUpdate(itemName, newState); } } }
/** @{inheritDoc} */ @Override protected void execute() { logger.trace("Connecting to {}" + baseURL); clearState(); String xmlDoc = fetchStateFromController(); if (xmlDoc == null) { return; } for (AutelisBindingProvider provider : providers) { for (String itemName : provider.getItemNames()) { Item item = provider.getItem(itemName); String config = provider.getAutelisBindingConfigString(itemName); XPathFactory xpathFactory = XPathFactory.newInstance(); XPath xpath = xpathFactory.newXPath(); try { InputSource is = new InputSource(new StringReader(xmlDoc)); String value = xpath.evaluate("response/" + config.replace('.', '/'), is); State state = toState(item.getClass(), value); State oldState = stateMap.put(itemName, state); if (!state.equals(oldState)) { logger.debug("updating item {} with state {}", itemName, state); eventPublisher.postUpdate(itemName, state); } } catch (XPathExpressionException e) { logger.warn("could not parse xml", e); } } } }
/** * Posts update event to OpenHAB bus for "coil" type slaves * * @param binding ModbusBinding to get item configuration from BindingProviding * @param registers data received from slave device in the last pollInterval * @param item item to update */ protected void internalUpdateItem(String slaveName, BitVector coils, String itemName) { for (ModbusBindingProvider provider : providers) { if (provider.providesBindingFor(itemName)) { ModbusBindingConfig config = provider.getConfig(itemName); if (config.slaveName.equals(slaveName)) { boolean state = coils.getBit(config.readRegister); State currentState = provider.getConfig(itemName).getItemState(); State newState = provider.getConfig(itemName).translateBoolean2State(state); if (!newState.equals(currentState)) { eventPublisher.postUpdate(itemName, newState); } } } } }
/** {@inheritDoc} */ public EList<Widget> renderWidget(Widget w, StringBuilder sb) throws RenderException { Switch s = (Switch) w; String snippetName = null; Item item; try { item = itemUIRegistry.getItem(w.getItem()); if (s.getMappings().size() == 0) { if (item instanceof RollershutterItem) { snippetName = "rollerblind"; } else if (item instanceof GroupItem && ((GroupItem) item).getBaseItem() instanceof RollershutterItem) { snippetName = "rollerblind"; } else { snippetName = "switch"; } } else { snippetName = "buttons"; } } catch (ItemNotFoundException e) { logger.warn("Cannot determine item type of '{}'", w.getItem(), e); snippetName = "switch"; } String snippet = getSnippet(snippetName); snippet = StringUtils.replace(snippet, "%id%", itemUIRegistry.getWidgetId(w)); System.out.println("\nSwitchRenderer->getICon->" + itemUIRegistry.getIcon(w)); snippet = StringUtils.replace(snippet, "%icon%", escapeURLPath(itemUIRegistry.getIcon(w))); snippet = StringUtils.replace(snippet, "%item%", w.getItem()); snippet = StringUtils.replace(snippet, "%label%", getLabel(w)); snippet = StringUtils.replace(snippet, "%servletname%", WebAppServlet.SERVLET_NAME); State state = itemUIRegistry.getState(w); System.out.println("\nSwitchRenderer->getState->" + state.toString()); if (s.getMappings().size() == 0) { if (state instanceof PercentType) { state = ((PercentType) state).intValue() > 0 ? OnOffType.ON : OnOffType.OFF; } if (state.equals(OnOffType.ON)) { snippet = snippet.replaceAll("%checked%", "checked=true"); } else { snippet = snippet.replaceAll("%checked%", ""); } } else { StringBuilder buttons = new StringBuilder(); for (Mapping mapping : s.getMappings()) { String button = getSnippet("button"); button = StringUtils.replace(button, "%item%", w.getItem()); button = StringUtils.replace(button, "%cmd%", mapping.getCmd()); button = StringUtils.replace(button, "%label%", mapping.getLabel()); if (s.getMappings().size() > 1 && state.toString().equals(mapping.getCmd())) { button = StringUtils.replace(button, "%type%", "Warn"); // button with red color } else { button = StringUtils.replace(button, "%type%", "Action"); // button with blue color } buttons.insert(0, button); } snippet = StringUtils.replace(snippet, "%buttons%", buttons.toString()); } // Process the color tags snippet = processColor(w, snippet); sb.append(snippet); return null; }
private void internalPropertyUpdate(String property, State value, boolean incremental) throws Exception { int bound = 0; if (value == null) { logger.trace("internalPropertyUpdate: Value is null for Property '{}', ignored.", property); return; } for (BindingProvider provider : providers) { if (provider instanceof MiosBindingProvider) { MiosBindingProviderImpl miosProvider = (MiosBindingProviderImpl) provider; for (String itemName : miosProvider.getItemNamesForProperty(property)) { MiosBindingConfig config = miosProvider.getMiosBindingConfig(itemName); if (config != null) { // Transform whatever value we have, based upon the // Transformation Service specified in the Binding // Config. State newValue = config.transformIn(value); if (newValue != value) { logger.trace( "internalPropertyUpdate: transformation performed, from '{}' to '{}'", value, newValue); } // // Set the value only if: // * we're running Incrementally OR; // * the CURRENT value is UNDEFINED OR; // * the CURRENT value is different from the NEW value // // This is to handle a case where the MiOS Unit // "restarts" and floods us with a bunch of the same // data. In this case, we don't want to flood the Items, // since it may re-trigger a bunch of Rules in an // unnecessary manner. // if (incremental) { logger.debug( "internalPropertyUpdate: BOUND (Incr) Updating '{} {mios=\"{}\"}' to '{}'", itemName, property, newValue); eventPublisher.postUpdate(itemName, newValue); } else { ItemRegistry reg = miosProvider.getItemRegistry(); State oldValue = reg.getItem(itemName).getState(); if ((oldValue == null && newValue != null) || (UnDefType.UNDEF.equals(oldValue) && !UnDefType.UNDEF.equals(newValue)) || !oldValue.equals(newValue)) { logger.debug( "internalPropertyUpdate: BOUND (Full) Updating '{} {mios=\"{}\"}' to '{}', was '{}'", new Object[] {itemName, property, newValue, oldValue}); eventPublisher.postUpdate(itemName, newValue); } else { logger.trace( "internalPropertyUpdate: BOUND (Full) Ignoring '{} {mios=\"{}\"}' to '{}', was '{}'", new Object[] {itemName, property, newValue, oldValue}); } } bound++; } else { logger.trace( "internalPropertyUpdate: Found null BindingConfig for item '{}' property '{}'", itemName, property); } } } } if (bound == 0) { logger.trace("internalPropertyUpdate: NOT BOUND {mios=\"{}\"}, value={}", property, value); } else { logger.trace( "internalPropertyUpdate: BOUND {mios=\"{}\"}, value={}, bound {} time(s)", new Object[] {property, value, bound}); } }