/** * 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); } } }
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}); } }