/** * 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.souliss.internal; import org.openhab.binding.souliss.SoulissBindingProvider; import org.openhab.binding.souliss.internal.network.typicals.Constants; import org.openhab.binding.souliss.internal.network.typicals.SoulissGenericTypical; import org.openhab.binding.souliss.internal.network.typicals.SoulissNetworkParameter; import org.openhab.binding.souliss.internal.network.typicals.SoulissT12; import org.openhab.binding.souliss.internal.network.typicals.SoulissT31; import org.openhab.binding.souliss.internal.network.typicals.SoulissTypicals; import org.openhab.binding.souliss.internal.network.typicals.StateTraslator; import org.openhab.binding.souliss.internal.network.typicals.TypicalFactory; import org.openhab.core.items.Item; import org.openhab.model.item.binding.AbstractGenericBindingProvider; import org.openhab.model.item.binding.BindingConfigParseException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * This class can parse information from the generic binding format and provides * souliss binding information from it * * eg, from {souliss="T11:1:2" , autoupdate="false"} * it extract these informations: * -Typical T11 * -Node 1 * -Slot 2 * * @author Tonino Fazio * @since 1.7.0 */ public class SoulissGenericBindingProvider extends AbstractGenericBindingProvider implements SoulissBindingProvider { private static Logger logger = LoggerFactory.getLogger(TypicalFactory.class); public static SoulissTypicals SoulissTypicalsRecipients = new SoulissTypicals(); @Override public String getBindingType() { return "souliss"; } /** * This method create typicals and add it to hastable * * @author Tonino Fazio * @since 1.7.0 */ @Override public void processBindingConfiguration(String context, Item item, String bindingConfig) throws BindingConfigParseException { // Create Souliss Typicals // // ...from wiki of Dario De Maio // In Souliss the logics that drive your lights, curtains, LED, and // others are pre-configured into so called Typicals. A Typical is a // logic with a predefined set of inputs and outputs and a know // behavior, are used to standardize the user interface and have a // configuration-less behavior. final String itemName = item.getName(); logger.trace("Starting to load Souliss config for item {}", itemName); super.processBindingConfiguration(context, item, bindingConfig); String[] sNameArray = bindingConfig.split("\\:"); String sTypical = sNameArray[0]; int iNodeID = Integer.parseInt(sNameArray[1]); int iSlot = Integer.parseInt(sNameArray[2]); byte iBit = 0; String sUseSlot = ""; // gestisce i casi particolari per T31 e T1A, per la presenza del terzo // parametro if (sNameArray.length > 3) { if ((StateTraslator.stringToSOULISSTypicalCode(sTypical) == Constants.Souliss_T31) || (StateTraslator.stringToSOULISSTypicalCode(sTypical) == Constants.Souliss_T12)) { sUseSlot = sNameArray[3]; } else { iBit = Byte.parseByte(sNameArray[3]); } } String sNote = item.getClass().getSimpleName(); SoulissGenericTypical soulissTypicalNew = null; // gestisce il caso particolare del T31. // nel caso del T31 tre definizioni OH devono confluire in un unico // Tipico Souliss if ((StateTraslator.stringToSOULISSTypicalCode(sTypical) == Constants.Souliss_T31) || (StateTraslator.stringToSOULISSTypicalCode(sTypical) == Constants.Souliss_T12)) { soulissTypicalNew = SoulissTypicalsRecipients.getTypicalFromAddress(iNodeID, iSlot, 0); // creazione tipico, solo se non si tratta di un T31 al quale è stato aggiunto un parametro if (soulissTypicalNew == null) { soulissTypicalNew = TypicalFactory.getClass(StateTraslator.stringToSOULISSTypicalCode(sTypical), SoulissNetworkParameter.datagramsocket, SoulissNetworkParameter.IPAddressOnLAN, iNodeID, iSlot, sNote, iBit, sUseSlot); } if (soulissTypicalNew != null) { // in base al campo use slot inserisco nel tipico il nome item di riferimento switch (sUseSlot) { case Constants.Souliss_T12_Use_Of_Slot_AUTOMODE: ((SoulissT12) soulissTypicalNew).setsItemNameAutoModeValue(item.getName()); ((SoulissT12) soulissTypicalNew).setsItemTypeAutoModeValue(sNote); break; case Constants.Souliss_T12_Use_Of_Slot_SWITCH: ((SoulissT12) soulissTypicalNew).setsItemNameSwitchValue(item.getName()); ((SoulissT12) soulissTypicalNew).setsItemTypeSwitchValue(sNote); break; case Constants.Souliss_T31_Use_Of_Slot_SETPOINT: ((SoulissT31) soulissTypicalNew).setsItemNameSetpointValue(item.getName()); ((SoulissT31) soulissTypicalNew).setsItemTypeSetpointValue(sNote); break; case Constants.Souliss_T31_Use_Of_Slot_MEASURED: ((SoulissT31) soulissTypicalNew).setsItemNameMeasuredValue(item.getName()); ((SoulissT31) soulissTypicalNew).setsItemTypeMeasuredValue(sNote); break; case Constants.Souliss_T31_Use_Of_Slot_SETASMEASURED: ((SoulissT31) soulissTypicalNew).setAsMeasured.setName(item.getName()); ((SoulissT31) soulissTypicalNew).setAsMeasured.setNote(sNote); break; case Constants.Souliss_T31_Use_Of_Slot_HEATING: ((SoulissT31) soulissTypicalNew).heating.setName(item.getName()); ((SoulissT31) soulissTypicalNew).heating.setNote(sNote); break; case Constants.Souliss_T31_Use_Of_Slot_COOLING: ((SoulissT31) soulissTypicalNew).cooling.setName(item.getName()); ((SoulissT31) soulissTypicalNew).cooling.setNote(sNote); break; case Constants.Souliss_T31_Use_Of_Slot_FANOFF: ((SoulissT31) soulissTypicalNew).fanOff.setName(item.getName()); ((SoulissT31) soulissTypicalNew).fanOff.setNote(sNote); break; case Constants.Souliss_T31_Use_Of_Slot_FANLOW: ((SoulissT31) soulissTypicalNew).fanLow.setName(item.getName()); ((SoulissT31) soulissTypicalNew).fanLow.setNote(sNote); break; case Constants.Souliss_T31_Use_Of_Slot_FANMED: ((SoulissT31) soulissTypicalNew).fanMed.setName(item.getName()); ((SoulissT31) soulissTypicalNew).fanMed.setNote(sNote); break; case Constants.Souliss_T31_Use_Of_Slot_FANHIGH: ((SoulissT31) soulissTypicalNew).fanHigh.setName(item.getName()); ((SoulissT31) soulissTypicalNew).fanHigh.setNote(sNote); break; case Constants.Souliss_T31_Use_Of_Slot_HEATING_COOLING: ((SoulissT31) soulissTypicalNew).heatingCoolingModeValue.setName(item.getName()); ((SoulissT31) soulissTypicalNew).heatingCoolingModeValue.setNote(sNote); break; case Constants.Souliss_T31_Use_Of_Slot_FANAUTOMODE: ((SoulissT31) soulissTypicalNew).fanAutoMode.setName(item.getName()); ((SoulissT31) soulissTypicalNew).fanAutoMode.setNote(sNote); break; case Constants.Souliss_T31_Use_Of_Slot_POWER: ((SoulissT31) soulissTypicalNew).power.setName(item.getName()); ((SoulissT31) soulissTypicalNew).power.setNote(sNote); break; } logger.info("Add parameter to T31/T12 : " + sUseSlot); } } // creazione tipico, solo se non si tratta di un T31 / T12 al quale è stato aggiunto un parametro if (soulissTypicalNew == null) { soulissTypicalNew = TypicalFactory.getClass(StateTraslator.stringToSOULISSTypicalCode(sTypical), SoulissNetworkParameter.datagramsocket, SoulissNetworkParameter.IPAddressOnLAN, iNodeID, iSlot, sNote, iBit, sUseSlot); } if (soulissTypicalNew != null) { SoulissTypicalsRecipients.addTypical(item.getName(), soulissTypicalNew); SoulissNetworkParameter.nodes = SoulissTypicalsRecipients.getNodeNumbers(); } } @Override public void validateItemType(Item item, String bindingConfig) throws BindingConfigParseException { logger.trace("validateItemType for item {} called with bindingConfig={}", item.getName(), bindingConfig); } }