/** * Copyright (c) 2010-2016 by the respective copyright holders. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html */ package org.openhab.binding.enphaseenergy.internal; import java.util.Dictionary; import java.util.HashSet; import java.util.Set; import org.apache.commons.lang.StringUtils; import org.openhab.binding.enphaseenergy.EnphaseenergyBindingProvider; import org.openhab.binding.enphaseenergy.internal.messages.SystemsRequest; import org.openhab.binding.enphaseenergy.internal.messages.SystemsResponse; import org.openhab.core.binding.AbstractActiveBinding; import org.openhab.core.library.types.DateTimeType; import org.openhab.core.library.types.DecimalType; import org.openhab.core.library.types.StringType; import org.openhab.core.types.State; import org.osgi.service.cm.ConfigurationException; import org.osgi.service.cm.ManagedService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Binding that gets measurements from the Enphase Energy API every couple of minutes. * * @author Markus Fritze * @since 1.7.0 */ public class EnphaseenergyBinding extends AbstractActiveBinding<EnphaseenergyBindingProvider>implements ManagedService { private static final Logger logger = LoggerFactory.getLogger(EnphaseenergyBinding.class); private String user_id; private String key; /** * The refresh interval which is used to poll values from the Enphase Energy server * (optional, defaults to 900000ms) */ private long refreshInterval = 900000; /** * {@inheritDoc} */ @Override protected String getName() { return "Enphaseenergy Refresh Service"; } /** * {@inheritDoc} */ @Override protected long getRefreshInterval() { return this.refreshInterval; } /** * {@inheritDoc} */ @Override protected void execute() { logger.debug("Querying Enphase Energy API"); try { // Find all systemId for active items Set<Integer> systemIds = new HashSet<Integer>(); for (final EnphaseenergyBindingProvider provider : this.providers) { for (final String itemName : provider.getItemNames()) { final Integer systemId = provider.getSystemId(itemName); systemIds.add(systemId); } } for (final Integer systemId : systemIds) { final SystemsRequest request = new SystemsRequest(this.key, this.user_id, systemId); logger.debug("Request: {} as {}", request, request.prepare()); final SystemsResponse response = request.execute(); logger.debug("Response: {}", response); for (final EnphaseenergyBindingProvider provider : this.providers) { for (final String itemName : provider.getItemNames()) { final Integer itemSystemId = provider.getSystemId(itemName); if (!systemId.equals(itemSystemId)) { continue; } final EnphaseenergyItemType itemType = provider.getItemType(itemName); logger.debug("itemName {} for {} and {}", itemName, systemId, itemType); final State state = createStateFromType(itemType, response); if (state != null) { this.eventPublisher.postUpdate(itemName, state); } } } } } catch (EnphaseenergyException ne) { logger.error(ne.getMessage()); } } /** * {@inheritDoc} */ @Override public void updated(final Dictionary<String, ?> config) throws ConfigurationException { if (config != null) { String useridString = (String) config.get("user_id"); if (StringUtils.isNotBlank(useridString)) { this.user_id = useridString; } String keyString = (String) config.get("key"); if (StringUtils.isNotBlank(keyString)) { this.key = keyString; } String refreshIntervalString = (String) config.get("refresh"); if (StringUtils.isNotBlank(refreshIntervalString)) { this.refreshInterval = Long.parseLong(refreshIntervalString); } setProperlyConfigured(true); } } protected void addBindingProvider(EnphaseenergyBindingProvider bindingProvider) { super.addBindingProvider(bindingProvider); } protected void removeBindingProvider(EnphaseenergyBindingProvider bindingProvider) { super.removeBindingProvider(bindingProvider); } /** * Convert an enphase energy item type to a openHAB state * * @param response */ private State createStateFromType(final EnphaseenergyItemType itemType, SystemsResponse response) { State state = null; switch (itemType) { case MODULES: state = new DecimalType(response.getModules()); break; case SIZE_W: state = new DecimalType(response.getSize_w()); break; case CURRENT_POWER: state = new DecimalType(response.getCurrent_power()); break; case ENERGY_TODAY: state = new DecimalType(response.getEnergy_today() * 0.001); break; case ENERGY_LIFETIME: state = new DecimalType(response.getEnergy_lifetime() * 0.001 * 0.001); break; case SUMMARY_DATE: state = new DateTimeType(response.getSummary_date()); break; case SOURCE: state = new StringType(response.getSource()); break; case STATUS: state = new StringType(response.getStatus()); break; case OPERATIONAL_AT: state = new DateTimeType(response.getOperational_at()); break; case LAST_REPORT_AT: state = new DateTimeType(response.getLast_report_at()); break; } return state; } }