/** @{inheritDoc */
  @Override
  public void updated(Dictionary<String, ?> config) throws ConfigurationException {

    if (config == null || config.isEmpty()) {
      logger.warn("Empty or null configuration. Ignoring.");
      return;
    }

    Set<String> names = getNames(config);

    for (String name : names) {

      String value = (String) config.get(name + ".serialPort");
      String serialPort = value != null ? value : MeterConfig.DEFAULT_SERIAL_PORT;

      value = (String) config.get(name + ".baudRateChangeDelay");
      int baudRateChangeDelay =
          value != null ? Integer.valueOf(value) : MeterConfig.DEFAULT_BAUD_RATE_CHANGE_DELAY;

      value = (String) config.get(name + ".echoHandling");
      boolean echoHandling =
          value != null ? Boolean.valueOf(value) : MeterConfig.DEFAULT_ECHO_HANDLING;

      Meter meterConfig =
          createIec6205621MeterConfig(
              name, new MeterConfig(serialPort, baudRateChangeDelay, echoHandling));

      if (meterDeviceConfigurtions.put(meterConfig.getName(), meterConfig) != null) {
        logger.info(
            "Recreated reader {} with  {}!", meterConfig.getName(), meterConfig.getConfig());
      } else {
        logger.info("Created reader {} with  {}!", meterConfig.getName(), meterConfig.getConfig());
      }
    }

    if (config != null) {
      // to override the default refresh interval one has to add a
      // parameter to openhab.cfg like
      // <bindingName>:refresh=<intervalInMs>
      if (StringUtils.isNotBlank((String) config.get("refresh"))) {
        refreshInterval = Long.parseLong((String) config.get("refresh"));
      }
      setProperlyConfigured(true);
    }
  }
  /** @{inheritDoc */
  @Override
  protected void execute() {
    // the frequently executed code (polling) goes here ...
    Map<String, Map<String, DataSet>> cache = new HashMap<String, Map<String, DataSet>>();
    for (Iec6205621MeterBindingProvider provider : providers) {

      for (String itemName : provider.getItemNames()) {
        for (Entry<String, Meter> entry : meterDeviceConfigurtions.entrySet()) {
          Meter reader = entry.getValue();
          String meterName = provider.getMeterName(itemName);
          if (meterName != null && meterName.equals(entry.getKey())) {
            Map<String, DataSet> dataSets;
            if ((dataSets = cache.get(meterName)) == null) {
              if (logger.isDebugEnabled())
                logger.debug(
                    "Read meter: " + meterName + "; " + reader.getConfig().getSerialPort());
              dataSets = reader.read();
              cache.put(meterName, dataSets);
            }
            String obis = provider.getObis(itemName);
            if (obis != null && dataSets.containsKey(obis)) {
              DataSet dataSet = dataSets.get(obis);
              if (logger.isDebugEnabled())
                logger.debug(
                    "Updateing item "
                        + itemName
                        + " with OBIS code "
                        + obis
                        + " and value "
                        + dataSet.getValue());
              Class<? extends Item> itemType = provider.getItemType(itemName);
              if (itemType.isAssignableFrom(NumberItem.class)) {
                eventPublisher.postUpdate(itemName, new DecimalType(dataSet.getValue()));
              }
              if (itemType.isAssignableFrom(StringItem.class)) {
                String value = dataSet.getValue();
                eventPublisher.postUpdate(itemName, new StringType(value));
              }
            }
          }
        }
      }
    }
  }