/** * 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.omnilink.internal.model; import org.openhab.binding.omnilink.internal.OmniLinkBindingConfig; import org.openhab.core.events.EventPublisher; import org.openhab.core.items.Item; import org.openhab.core.library.items.NumberItem; import org.openhab.core.library.items.StringItem; import org.openhab.core.library.items.SwitchItem; import org.openhab.core.library.types.DecimalType; import org.openhab.core.library.types.OnOffType; import org.openhab.core.library.types.StringType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.digitaldan.jomnilinkII.MessageUtils; import com.digitaldan.jomnilinkII.MessageTypes.properties.ThermostatProperties; /** * Basic thermostat * * @author Dan Cunningham * @since 1.5.0 */ public class Thermostat extends OmnilinkDevice { private static final Logger logger = LoggerFactory.getLogger(Thermostat.class); private ThermostatProperties properties; private boolean celsius; private static String[] MODES = { "Off", "Heat", "Cool", "Auto", "Emergency" }; public Thermostat(ThermostatProperties properties, boolean celsius) { this.properties = properties; this.celsius = celsius; } @Override public ThermostatProperties getProperties() { return properties; } public void setProperties(ThermostatProperties properties) { this.properties = properties; } /** * Returns the users preferred measurement type. * * @return */ public boolean isCelsius() { return celsius; } /** * Sets the users preferred measurement type. * * @param celsius */ public void setCelsius(boolean celsius) { this.celsius = celsius; } @Override public void updateItem(Item item, OmniLinkBindingConfig config, EventPublisher publisher) { int setting = 0; String mode = null; switch (config.getObjectType()) { case THERMO_COOL_POINT: setting = celsius ? MessageUtils.omniToC(properties.getCoolSetpoint()) : MessageUtils.omniToF(properties.getCoolSetpoint()); break; case THERMO_TEMP: setting = celsius ? MessageUtils.omniToC(properties.getTemperature()) : MessageUtils.omniToF(properties.getTemperature()); break; case THERMO_HEAT_POINT: setting = celsius ? MessageUtils.omniToC(properties.getHeatSetpoint()) : MessageUtils.omniToF(properties.getHeatSetpoint()); break; case THERMO_FAN_MODE: setting = properties.isFan() ? 1 : 0; break; case THERMO_HOLD_MODE: setting = properties.isHold() ? 1 : 0; break; case THERMO_SYSTEM_MODE: setting = properties.getMode(); if (setting < MODES.length) { mode = MODES[setting]; } break; default: return; } logger.debug("updating item {} for type {} to {}", item.getName(), config.getObjectType(), setting); if (item instanceof NumberItem) { publisher.postUpdate(item.getName(), new DecimalType(setting)); } else if (item instanceof SwitchItem) { publisher.postUpdate(item.getName(), setting > 0 ? OnOffType.ON : OnOffType.OFF); } else if (item instanceof StringItem && mode != null) { publisher.postUpdate(item.getName(), new StringType(mode)); } } public static int getModeForString(String modeString) { for (int i = 0; i < MODES.length; i++) { if (modeString.equalsIgnoreCase(MODES[i])) { return i; } } return -1; } }