net.solarnetwork.node.control.demandbalancer.SimpleDemandBalanceStrategy.java Source code

Java tutorial

Introduction

Here is the source code for net.solarnetwork.node.control.demandbalancer.SimpleDemandBalanceStrategy.java

Source

/* ==================================================================
s * SimpleDemandBalanceStrategy.java - Mar 23, 2014 7:46:01 PM
 * 
 * Copyright 2007-2014 SolarNetwork.net Dev Team
 * 
 * This program is free software; you can redistribute it and/or 
 * modify it under the terms of the GNU General Public License as 
 * published by the Free Software Foundation; either version 2 of 
 * the License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful, 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 
 * General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License 
 * along with this program; if not, write to the Free Software 
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 
 * 02111-1307 USA
 * ==================================================================
 */

package net.solarnetwork.node.control.demandbalancer;

import java.util.Collections;
import java.util.List;
import net.solarnetwork.node.settings.SettingSpecifier;
import net.solarnetwork.node.settings.SettingSpecifierProvider;
import net.solarnetwork.node.settings.support.BasicTextFieldSettingSpecifier;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.MessageSource;

/**
 * Very basic implementation of {@link DemandBalanceStrategy} that simply
 * enforces a generation limit on the current demand.
 * 
 * <p>
 * The configurable properties of this class are:
 * </p>
 * 
 * <dl class="class-properties">
 * <dt>unknownDemandLimit</dt>
 * <dd>If {@bold -1} is passed as the {@code demandWatts} to
 * {@link #evaluateBalance(String, int, int, int, int)} then this value will be
 * returned. Set to {@bold -1} to do nothing.</dd>
 * </dl>
 * 
 * @author matt
 * @version 1.1
 */
public class SimpleDemandBalanceStrategy implements DemandBalanceStrategy, SettingSpecifierProvider {

    /** The UID for this strategy: {@code Simple}. */
    public static final String UID = "Simple";

    private final Logger log = LoggerFactory.getLogger(getClass());

    private MessageSource messageSource;
    private int unknownDemandLimit = -1;

    @Override
    public String getUID() {
        return UID;
    }

    @Override
    public int evaluateBalance(final String powerControlId, final int demandWatts, final int generationWatts,
            final int generationCapacityWatts, final int currentLimit) {
        int desiredLimit = currentLimit;
        if (demandWatts < 0) {
            // unknown demand... set to unknownDemandLimit
            desiredLimit = unknownDemandLimit;
        } else if (demandWatts < generationCapacityWatts) {
            // demand is less than generation capacity... enforce limit
            desiredLimit = (int) Math.floor(100.0 * demandWatts / generationCapacityWatts);
            log.debug("Demand of {} is less than {} capacity of {}, limiting to {}%", demandWatts, powerControlId,
                    generationCapacityWatts, desiredLimit);
        } else {
            // go for it
            desiredLimit = 100;
        }
        return desiredLimit;
    }

    @Override
    public String getSettingUID() {
        return getClass().getName();
    }

    @Override
    public String getDisplayName() {
        return "Simple Demand Balance Strategy";
    }

    @Override
    public MessageSource getMessageSource() {
        return messageSource;
    }

    @Override
    public List<SettingSpecifier> getSettingSpecifiers() {
        SimpleDemandBalanceStrategy defaults = new SimpleDemandBalanceStrategy();
        return Collections.singletonList((SettingSpecifier) new BasicTextFieldSettingSpecifier("unknownDemandLimit",
                String.valueOf(defaults.getUnknownDemandLimit())));
    }

    public int getUnknownDemandLimit() {
        return unknownDemandLimit;
    }

    public void setUnknownDemandLimit(int unknownDemandLimit) {
        this.unknownDemandLimit = unknownDemandLimit;
    }

    public void setMessageSource(MessageSource messageSource) {
        this.messageSource = messageSource;
    }

}