Exemple #1
0
  /**
   * 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);
      }
    }
  }
Exemple #2
0
  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});
    }
  }