/**
 * Copyright (c) 2010-2020 Contributors to the openHAB project
 *
 * See the NOTICE file(s) distributed with this work for additional
 * information.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0
 *
 * SPDX-License-Identifier: EPL-2.0
 */

 /* ***********************************************************
 * This file was automatically generated on 2022-01-03.      *
 *                                                           *
 * openHAB Bindings Version 2.0.0                            *
 *                                                           *
 * If you have a bugfix for this file and want to commit it, *
 * please fix the bug in the generator. You can find a link  *
 * to the generators git repository on tinkerforge.com       *
 *************************************************************/

package org.openhab.binding.tinkerforge.internal.device;

import java.net.URI;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import org.eclipse.smarthome.config.core.Configuration;
import org.eclipse.smarthome.config.core.ConfigDescription;
import org.eclipse.smarthome.config.core.ConfigDescriptionBuilder;
import org.eclipse.smarthome.config.core.ConfigDescriptionParameter.Type;
import org.eclipse.smarthome.config.core.ConfigDescriptionParameterBuilder;
import org.eclipse.smarthome.config.core.ConfigDescriptionParameterGroup;
import org.eclipse.smarthome.config.core.ParameterOption;
import org.eclipse.smarthome.core.types.State;
import org.eclipse.smarthome.core.types.StateOption;
import org.eclipse.smarthome.core.types.Command;
import org.eclipse.smarthome.core.types.CommandDescriptionBuilder;
import org.eclipse.smarthome.core.types.CommandOption;
import org.eclipse.smarthome.core.thing.ChannelUID;
import org.eclipse.smarthome.core.thing.ThingStatus;
import org.eclipse.smarthome.core.thing.ThingTypeUID;
import org.eclipse.smarthome.core.thing.binding.BaseThingHandler;
import org.eclipse.smarthome.core.thing.type.ChannelDefinitionBuilder;
import org.eclipse.smarthome.core.thing.type.ChannelType;
import org.eclipse.smarthome.core.thing.type.ChannelTypeBuilder;
import org.eclipse.smarthome.core.thing.type.ChannelTypeUID;
import org.eclipse.smarthome.core.types.RefreshType;
import org.eclipse.smarthome.core.thing.type.ThingType;
import org.eclipse.smarthome.core.thing.type.ThingTypeBuilder;
import org.eclipse.smarthome.core.types.StateDescriptionFragmentBuilder;
import org.openhab.binding.tinkerforge.internal.TinkerforgeBindingConstants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.eclipse.smarthome.core.library.types.DecimalType;
import org.eclipse.smarthome.core.library.types.QuantityType;
import org.eclipse.smarthome.core.library.unit.MetricPrefix;
import org.eclipse.smarthome.core.library.unit.SIUnits;
import org.eclipse.smarthome.core.library.unit.SmartHomeUnits;
import org.eclipse.smarthome.core.library.types.OnOffType;
import org.eclipse.smarthome.core.library.types.OpenClosedType;
import org.eclipse.smarthome.core.library.types.StringType;

import com.tinkerforge.BrickletIO16;
import com.tinkerforge.IPConnection;
import com.tinkerforge.TinkerforgeException;

import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;

/**
 * Wraps the Java Bindings of the IO-16 Bricklet.
 * @author Erik Fleckstein - Initial contribution
 */
@NonNullByDefault
public class BrickletIO16Wrapper extends BrickletIO16 implements StandardFlashable, DeviceWrapper {
    public static final DeviceInfo DEVICE_INFO = new DeviceInfo(BrickletIO16.DEVICE_DISPLAY_NAME, "brickletio16", BrickletIO16.DEVICE_IDENTIFIER, BrickletIO16Wrapper.class, BrickletIO16Actions.class, "2.0.3", false);

    public BrickletIO16Wrapper(String uid, IPConnection ipcon) {
        super(uid, ipcon);
    }

    private List<ScheduledFuture<?>> manualChannelUpdates = new ArrayList<>();
    private List<ListenerReg<?>> listenerRegs = new ArrayList<>();

    public void cancelManualUpdates() {
        manualChannelUpdates.forEach(f -> f.cancel(true));
    }

    public <T> T reg(T listener, Consumer<T> toRemove) {
        listenerRegs.add(new ListenerReg<T>(listener, toRemove));
        return listener;
    }

    
    private final Logger logger = LoggerFactory.getLogger(BrickletIO16Wrapper.class);

    @Override
    public void initialize(org.eclipse.smarthome.config.core.Configuration config, Function<String, org.eclipse.smarthome.config.core.Configuration> getChannelConfigFn, BiConsumer<String, org.eclipse.smarthome.core.types.State> updateStateFn, BiConsumer<String, String> triggerChannelFn, ScheduledExecutorService scheduler, BaseThingHandler handler) throws TinkerforgeException {
        this.setResponseExpectedAll(true);
        BrickletIO16Config cfg = (BrickletIO16Config) config.as(BrickletIO16Config.class);
        if(cfg.pinConfiguration0 > 1) {
this.addInterruptListener(this.reg((port, interruptMask, valueMask) -> {if(port == 'a' && (interruptMask & (1 << 0)) > 0) {updateStateFn.accept("BrickletIO16Input0", transformBrickletIO16Input0Callback0(port, interruptMask, valueMask, cfg));}}, this::removeInterruptListener));}
		if(cfg.pinConfiguration1 > 1) {
this.addInterruptListener(this.reg((port, interruptMask, valueMask) -> {if(port == 'a' && (interruptMask & (1 << 1)) > 0) {updateStateFn.accept("BrickletIO16Input1", transformBrickletIO16Input1Callback0(port, interruptMask, valueMask, cfg));}}, this::removeInterruptListener));}
		if(cfg.pinConfiguration2 > 1) {
this.addInterruptListener(this.reg((port, interruptMask, valueMask) -> {if(port == 'a' && (interruptMask & (1 << 2)) > 0) {updateStateFn.accept("BrickletIO16Input2", transformBrickletIO16Input2Callback0(port, interruptMask, valueMask, cfg));}}, this::removeInterruptListener));}
		if(cfg.pinConfiguration3 > 1) {
this.addInterruptListener(this.reg((port, interruptMask, valueMask) -> {if(port == 'a' && (interruptMask & (1 << 3)) > 0) {updateStateFn.accept("BrickletIO16Input3", transformBrickletIO16Input3Callback0(port, interruptMask, valueMask, cfg));}}, this::removeInterruptListener));}
		if(cfg.pinConfiguration4 > 1) {
this.addInterruptListener(this.reg((port, interruptMask, valueMask) -> {if(port == 'a' && (interruptMask & (1 << 4)) > 0) {updateStateFn.accept("BrickletIO16Input4", transformBrickletIO16Input4Callback0(port, interruptMask, valueMask, cfg));}}, this::removeInterruptListener));}
		if(cfg.pinConfiguration5 > 1) {
this.addInterruptListener(this.reg((port, interruptMask, valueMask) -> {if(port == 'a' && (interruptMask & (1 << 5)) > 0) {updateStateFn.accept("BrickletIO16Input5", transformBrickletIO16Input5Callback0(port, interruptMask, valueMask, cfg));}}, this::removeInterruptListener));}
		if(cfg.pinConfiguration6 > 1) {
this.addInterruptListener(this.reg((port, interruptMask, valueMask) -> {if(port == 'a' && (interruptMask & (1 << 6)) > 0) {updateStateFn.accept("BrickletIO16Input6", transformBrickletIO16Input6Callback0(port, interruptMask, valueMask, cfg));}}, this::removeInterruptListener));}
		if(cfg.pinConfiguration7 > 1) {
this.addInterruptListener(this.reg((port, interruptMask, valueMask) -> {if(port == 'a' && (interruptMask & (1 << 7)) > 0) {updateStateFn.accept("BrickletIO16Input7", transformBrickletIO16Input7Callback0(port, interruptMask, valueMask, cfg));}}, this::removeInterruptListener));}
		if(cfg.pinConfiguration8 > 1) {
this.addInterruptListener(this.reg((port, interruptMask, valueMask) -> {if(port == 'b' && (interruptMask & (1 << 0)) > 0) {updateStateFn.accept("BrickletIO16Input8", transformBrickletIO16Input8Callback0(port, interruptMask, valueMask, cfg));}}, this::removeInterruptListener));}
		if(cfg.pinConfiguration9 > 1) {
this.addInterruptListener(this.reg((port, interruptMask, valueMask) -> {if(port == 'b' && (interruptMask & (1 << 1)) > 0) {updateStateFn.accept("BrickletIO16Input9", transformBrickletIO16Input9Callback0(port, interruptMask, valueMask, cfg));}}, this::removeInterruptListener));}
		if(cfg.pinConfiguration10 > 1) {
this.addInterruptListener(this.reg((port, interruptMask, valueMask) -> {if(port == 'b' && (interruptMask & (1 << 2)) > 0) {updateStateFn.accept("BrickletIO16Input10", transformBrickletIO16Input10Callback0(port, interruptMask, valueMask, cfg));}}, this::removeInterruptListener));}
		if(cfg.pinConfiguration11 > 1) {
this.addInterruptListener(this.reg((port, interruptMask, valueMask) -> {if(port == 'b' && (interruptMask & (1 << 3)) > 0) {updateStateFn.accept("BrickletIO16Input11", transformBrickletIO16Input11Callback0(port, interruptMask, valueMask, cfg));}}, this::removeInterruptListener));}
		if(cfg.pinConfiguration12 > 1) {
this.addInterruptListener(this.reg((port, interruptMask, valueMask) -> {if(port == 'b' && (interruptMask & (1 << 4)) > 0) {updateStateFn.accept("BrickletIO16Input12", transformBrickletIO16Input12Callback0(port, interruptMask, valueMask, cfg));}}, this::removeInterruptListener));}
		if(cfg.pinConfiguration13 > 1) {
this.addInterruptListener(this.reg((port, interruptMask, valueMask) -> {if(port == 'b' && (interruptMask & (1 << 5)) > 0) {updateStateFn.accept("BrickletIO16Input13", transformBrickletIO16Input13Callback0(port, interruptMask, valueMask, cfg));}}, this::removeInterruptListener));}
		if(cfg.pinConfiguration14 > 1) {
this.addInterruptListener(this.reg((port, interruptMask, valueMask) -> {if(port == 'b' && (interruptMask & (1 << 6)) > 0) {updateStateFn.accept("BrickletIO16Input14", transformBrickletIO16Input14Callback0(port, interruptMask, valueMask, cfg));}}, this::removeInterruptListener));}
		if(cfg.pinConfiguration15 > 1) {
this.addInterruptListener(this.reg((port, interruptMask, valueMask) -> {if(port == 'b' && (interruptMask & (1 << 7)) > 0) {updateStateFn.accept("BrickletIO16Input15", transformBrickletIO16Input15Callback0(port, interruptMask, valueMask, cfg));}}, this::removeInterruptListener));}
		if(cfg.pinConfiguration0 <= 1) {
this.addMonoflopDoneListener(this.reg((port, selectionMask, valueMask) -> {if(port == 'a' && (selectionMask & (1 << 0)) > 0) {updateStateFn.accept("BrickletIO16Output0", transformBrickletIO16Output0Callback0(port, selectionMask, valueMask, cfg));}}, this::removeMonoflopDoneListener));}
		if(cfg.pinConfiguration1 <= 1) {
this.addMonoflopDoneListener(this.reg((port, selectionMask, valueMask) -> {if(port == 'a' && (selectionMask & (1 << 1)) > 0) {updateStateFn.accept("BrickletIO16Output1", transformBrickletIO16Output1Callback0(port, selectionMask, valueMask, cfg));}}, this::removeMonoflopDoneListener));}
		if(cfg.pinConfiguration2 <= 1) {
this.addMonoflopDoneListener(this.reg((port, selectionMask, valueMask) -> {if(port == 'a' && (selectionMask & (1 << 2)) > 0) {updateStateFn.accept("BrickletIO16Output2", transformBrickletIO16Output2Callback0(port, selectionMask, valueMask, cfg));}}, this::removeMonoflopDoneListener));}
		if(cfg.pinConfiguration3 <= 1) {
this.addMonoflopDoneListener(this.reg((port, selectionMask, valueMask) -> {if(port == 'a' && (selectionMask & (1 << 3)) > 0) {updateStateFn.accept("BrickletIO16Output3", transformBrickletIO16Output3Callback0(port, selectionMask, valueMask, cfg));}}, this::removeMonoflopDoneListener));}
		if(cfg.pinConfiguration4 <= 1) {
this.addMonoflopDoneListener(this.reg((port, selectionMask, valueMask) -> {if(port == 'a' && (selectionMask & (1 << 4)) > 0) {updateStateFn.accept("BrickletIO16Output4", transformBrickletIO16Output4Callback0(port, selectionMask, valueMask, cfg));}}, this::removeMonoflopDoneListener));}
		if(cfg.pinConfiguration5 <= 1) {
this.addMonoflopDoneListener(this.reg((port, selectionMask, valueMask) -> {if(port == 'a' && (selectionMask & (1 << 5)) > 0) {updateStateFn.accept("BrickletIO16Output5", transformBrickletIO16Output5Callback0(port, selectionMask, valueMask, cfg));}}, this::removeMonoflopDoneListener));}
		if(cfg.pinConfiguration6 <= 1) {
this.addMonoflopDoneListener(this.reg((port, selectionMask, valueMask) -> {if(port == 'a' && (selectionMask & (1 << 6)) > 0) {updateStateFn.accept("BrickletIO16Output6", transformBrickletIO16Output6Callback0(port, selectionMask, valueMask, cfg));}}, this::removeMonoflopDoneListener));}
		if(cfg.pinConfiguration7 <= 1) {
this.addMonoflopDoneListener(this.reg((port, selectionMask, valueMask) -> {if(port == 'a' && (selectionMask & (1 << 7)) > 0) {updateStateFn.accept("BrickletIO16Output7", transformBrickletIO16Output7Callback0(port, selectionMask, valueMask, cfg));}}, this::removeMonoflopDoneListener));}
		if(cfg.pinConfiguration8 <= 1) {
this.addMonoflopDoneListener(this.reg((port, selectionMask, valueMask) -> {if(port == 'b' && (selectionMask & (1 << 0)) > 0) {updateStateFn.accept("BrickletIO16Output8", transformBrickletIO16Output8Callback0(port, selectionMask, valueMask, cfg));}}, this::removeMonoflopDoneListener));}
		if(cfg.pinConfiguration9 <= 1) {
this.addMonoflopDoneListener(this.reg((port, selectionMask, valueMask) -> {if(port == 'b' && (selectionMask & (1 << 1)) > 0) {updateStateFn.accept("BrickletIO16Output9", transformBrickletIO16Output9Callback0(port, selectionMask, valueMask, cfg));}}, this::removeMonoflopDoneListener));}
		if(cfg.pinConfiguration10 <= 1) {
this.addMonoflopDoneListener(this.reg((port, selectionMask, valueMask) -> {if(port == 'b' && (selectionMask & (1 << 2)) > 0) {updateStateFn.accept("BrickletIO16Output10", transformBrickletIO16Output10Callback0(port, selectionMask, valueMask, cfg));}}, this::removeMonoflopDoneListener));}
		if(cfg.pinConfiguration11 <= 1) {
this.addMonoflopDoneListener(this.reg((port, selectionMask, valueMask) -> {if(port == 'b' && (selectionMask & (1 << 3)) > 0) {updateStateFn.accept("BrickletIO16Output11", transformBrickletIO16Output11Callback0(port, selectionMask, valueMask, cfg));}}, this::removeMonoflopDoneListener));}
		if(cfg.pinConfiguration12 <= 1) {
this.addMonoflopDoneListener(this.reg((port, selectionMask, valueMask) -> {if(port == 'b' && (selectionMask & (1 << 4)) > 0) {updateStateFn.accept("BrickletIO16Output12", transformBrickletIO16Output12Callback0(port, selectionMask, valueMask, cfg));}}, this::removeMonoflopDoneListener));}
		if(cfg.pinConfiguration13 <= 1) {
this.addMonoflopDoneListener(this.reg((port, selectionMask, valueMask) -> {if(port == 'b' && (selectionMask & (1 << 5)) > 0) {updateStateFn.accept("BrickletIO16Output13", transformBrickletIO16Output13Callback0(port, selectionMask, valueMask, cfg));}}, this::removeMonoflopDoneListener));}
		if(cfg.pinConfiguration14 <= 1) {
this.addMonoflopDoneListener(this.reg((port, selectionMask, valueMask) -> {if(port == 'b' && (selectionMask & (1 << 6)) > 0) {updateStateFn.accept("BrickletIO16Output14", transformBrickletIO16Output14Callback0(port, selectionMask, valueMask, cfg));}}, this::removeMonoflopDoneListener));}
		if(cfg.pinConfiguration15 <= 1) {
this.addMonoflopDoneListener(this.reg((port, selectionMask, valueMask) -> {if(port == 'b' && (selectionMask & (1 << 7)) > 0) {updateStateFn.accept("BrickletIO16Output15", transformBrickletIO16Output15Callback0(port, selectionMask, valueMask, cfg));}}, this::removeMonoflopDoneListener));}
        
		if (cfg.pinConfiguration0 > 1) {
		this.setPortConfiguration('a', (short)(1 << 0), 'i', cfg.pinConfiguration0 % 2 == 1);
		            this.setPortInterrupt('a', (short)(this.getPortInterrupt('a') | (1 << 0)));
		}
		if (cfg.pinConfiguration1 > 1) {
		this.setPortConfiguration('a', (short)(1 << 1), 'i', cfg.pinConfiguration1 % 2 == 1);
		            this.setPortInterrupt('a', (short)(this.getPortInterrupt('a') | (1 << 1)));
		}
		if (cfg.pinConfiguration2 > 1) {
		this.setPortConfiguration('a', (short)(1 << 2), 'i', cfg.pinConfiguration2 % 2 == 1);
		            this.setPortInterrupt('a', (short)(this.getPortInterrupt('a') | (1 << 2)));
		}
		if (cfg.pinConfiguration3 > 1) {
		this.setPortConfiguration('a', (short)(1 << 3), 'i', cfg.pinConfiguration3 % 2 == 1);
		            this.setPortInterrupt('a', (short)(this.getPortInterrupt('a') | (1 << 3)));
		}
		if (cfg.pinConfiguration4 > 1) {
		this.setPortConfiguration('a', (short)(1 << 4), 'i', cfg.pinConfiguration4 % 2 == 1);
		            this.setPortInterrupt('a', (short)(this.getPortInterrupt('a') | (1 << 4)));
		}
		if (cfg.pinConfiguration5 > 1) {
		this.setPortConfiguration('a', (short)(1 << 5), 'i', cfg.pinConfiguration5 % 2 == 1);
		            this.setPortInterrupt('a', (short)(this.getPortInterrupt('a') | (1 << 5)));
		}
		if (cfg.pinConfiguration6 > 1) {
		this.setPortConfiguration('a', (short)(1 << 6), 'i', cfg.pinConfiguration6 % 2 == 1);
		            this.setPortInterrupt('a', (short)(this.getPortInterrupt('a') | (1 << 6)));
		}
		if (cfg.pinConfiguration7 > 1) {
		this.setPortConfiguration('a', (short)(1 << 7), 'i', cfg.pinConfiguration7 % 2 == 1);
		            this.setPortInterrupt('a', (short)(this.getPortInterrupt('a') | (1 << 7)));
		}
		if (cfg.pinConfiguration8 > 1) {
		this.setPortConfiguration('b', (short)(1 << 0), 'i', cfg.pinConfiguration8 % 2 == 1);
		            this.setPortInterrupt('b', (short)(this.getPortInterrupt('b') | (1 << 0)));
		}
		if (cfg.pinConfiguration9 > 1) {
		this.setPortConfiguration('b', (short)(1 << 1), 'i', cfg.pinConfiguration9 % 2 == 1);
		            this.setPortInterrupt('b', (short)(this.getPortInterrupt('b') | (1 << 1)));
		}
		if (cfg.pinConfiguration10 > 1) {
		this.setPortConfiguration('b', (short)(1 << 2), 'i', cfg.pinConfiguration10 % 2 == 1);
		            this.setPortInterrupt('b', (short)(this.getPortInterrupt('b') | (1 << 2)));
		}
		if (cfg.pinConfiguration11 > 1) {
		this.setPortConfiguration('b', (short)(1 << 3), 'i', cfg.pinConfiguration11 % 2 == 1);
		            this.setPortInterrupt('b', (short)(this.getPortInterrupt('b') | (1 << 3)));
		}
		if (cfg.pinConfiguration12 > 1) {
		this.setPortConfiguration('b', (short)(1 << 4), 'i', cfg.pinConfiguration12 % 2 == 1);
		            this.setPortInterrupt('b', (short)(this.getPortInterrupt('b') | (1 << 4)));
		}
		if (cfg.pinConfiguration13 > 1) {
		this.setPortConfiguration('b', (short)(1 << 5), 'i', cfg.pinConfiguration13 % 2 == 1);
		            this.setPortInterrupt('b', (short)(this.getPortInterrupt('b') | (1 << 5)));
		}
		if (cfg.pinConfiguration14 > 1) {
		this.setPortConfiguration('b', (short)(1 << 6), 'i', cfg.pinConfiguration14 % 2 == 1);
		            this.setPortInterrupt('b', (short)(this.getPortInterrupt('b') | (1 << 6)));
		}
		if (cfg.pinConfiguration15 > 1) {
		this.setPortConfiguration('b', (short)(1 << 7), 'i', cfg.pinConfiguration15 % 2 == 1);
		            this.setPortInterrupt('b', (short)(this.getPortInterrupt('b') | (1 << 7)));
		}
		if (cfg.pinConfiguration0 <= 1) {
		this.setPortConfiguration('a', (short)(1 << 0), 'o', cfg.pinConfiguration0 % 2 == 1);
		}
		if (cfg.pinConfiguration1 <= 1) {
		this.setPortConfiguration('a', (short)(1 << 1), 'o', cfg.pinConfiguration1 % 2 == 1);
		}
		if (cfg.pinConfiguration2 <= 1) {
		this.setPortConfiguration('a', (short)(1 << 2), 'o', cfg.pinConfiguration2 % 2 == 1);
		}
		if (cfg.pinConfiguration3 <= 1) {
		this.setPortConfiguration('a', (short)(1 << 3), 'o', cfg.pinConfiguration3 % 2 == 1);
		}
		if (cfg.pinConfiguration4 <= 1) {
		this.setPortConfiguration('a', (short)(1 << 4), 'o', cfg.pinConfiguration4 % 2 == 1);
		}
		if (cfg.pinConfiguration5 <= 1) {
		this.setPortConfiguration('a', (short)(1 << 5), 'o', cfg.pinConfiguration5 % 2 == 1);
		}
		if (cfg.pinConfiguration6 <= 1) {
		this.setPortConfiguration('a', (short)(1 << 6), 'o', cfg.pinConfiguration6 % 2 == 1);
		}
		if (cfg.pinConfiguration7 <= 1) {
		this.setPortConfiguration('a', (short)(1 << 7), 'o', cfg.pinConfiguration7 % 2 == 1);
		}
		if (cfg.pinConfiguration8 <= 1) {
		this.setPortConfiguration('b', (short)(1 << 0), 'o', cfg.pinConfiguration8 % 2 == 1);
		}
		if (cfg.pinConfiguration9 <= 1) {
		this.setPortConfiguration('b', (short)(1 << 1), 'o', cfg.pinConfiguration9 % 2 == 1);
		}
		if (cfg.pinConfiguration10 <= 1) {
		this.setPortConfiguration('b', (short)(1 << 2), 'o', cfg.pinConfiguration10 % 2 == 1);
		}
		if (cfg.pinConfiguration11 <= 1) {
		this.setPortConfiguration('b', (short)(1 << 3), 'o', cfg.pinConfiguration11 % 2 == 1);
		}
		if (cfg.pinConfiguration12 <= 1) {
		this.setPortConfiguration('b', (short)(1 << 4), 'o', cfg.pinConfiguration12 % 2 == 1);
		}
		if (cfg.pinConfiguration13 <= 1) {
		this.setPortConfiguration('b', (short)(1 << 5), 'o', cfg.pinConfiguration13 % 2 == 1);
		}
		if (cfg.pinConfiguration14 <= 1) {
		this.setPortConfiguration('b', (short)(1 << 6), 'o', cfg.pinConfiguration14 % 2 == 1);
		}
		if (cfg.pinConfiguration15 <= 1) {
		this.setPortConfiguration('b', (short)(1 << 7), 'o', cfg.pinConfiguration15 % 2 == 1);
		}
		if (cfg.pinConfiguration0 > 1) {
		BrickletIO16EdgeCountConfig channelCfg = getChannelConfigFn.apply("BrickletIO16EdgeCount0").as(BrickletIO16EdgeCountConfig.class);
		this.setEdgeCountConfig((short)(0), channelCfg.edgeType.shortValue(), channelCfg.debounce.shortValue());
		if(channelCfg.updateInterval > 0) {
    this.manualChannelUpdates.add(scheduler.scheduleWithFixedDelay(() -> {if(handler.getThing().getStatus() == ThingStatus.ONLINE) {handler.handleCommand(new ChannelUID(handler.getThing().getUID(), "BrickletIO16EdgeCount0"), RefreshType.REFRESH);}}, channelCfg.updateInterval, channelCfg.updateInterval, TimeUnit.MILLISECONDS));
}
		}
		if (cfg.pinConfiguration1 > 1) {
		BrickletIO16EdgeCountConfig channelCfg = getChannelConfigFn.apply("BrickletIO16EdgeCount1").as(BrickletIO16EdgeCountConfig.class);
		this.setEdgeCountConfig((short)(1), channelCfg.edgeType.shortValue(), channelCfg.debounce.shortValue());
		if(channelCfg.updateInterval > 0) {
    this.manualChannelUpdates.add(scheduler.scheduleWithFixedDelay(() -> {if(handler.getThing().getStatus() == ThingStatus.ONLINE) {handler.handleCommand(new ChannelUID(handler.getThing().getUID(), "BrickletIO16EdgeCount1"), RefreshType.REFRESH);}}, channelCfg.updateInterval, channelCfg.updateInterval, TimeUnit.MILLISECONDS));
}
		}
    }

    @Override
    public void dispose(org.eclipse.smarthome.config.core.Configuration config) throws TinkerforgeException {
        listenerRegs.forEach(ListenerReg::deregister);

        BrickletIO16Config cfg = (BrickletIO16Config) config.as(BrickletIO16Config.class);
        if(cfg.pinConfiguration0 > 1) {
this.setPortInterrupt('a', (short)(this.getPortInterrupt('a') & ~(1 << 0)));}
		if(cfg.pinConfiguration1 > 1) {
this.setPortInterrupt('a', (short)(this.getPortInterrupt('a') & ~(1 << 1)));}
		if(cfg.pinConfiguration2 > 1) {
this.setPortInterrupt('a', (short)(this.getPortInterrupt('a') & ~(1 << 2)));}
		if(cfg.pinConfiguration3 > 1) {
this.setPortInterrupt('a', (short)(this.getPortInterrupt('a') & ~(1 << 3)));}
		if(cfg.pinConfiguration4 > 1) {
this.setPortInterrupt('a', (short)(this.getPortInterrupt('a') & ~(1 << 4)));}
		if(cfg.pinConfiguration5 > 1) {
this.setPortInterrupt('a', (short)(this.getPortInterrupt('a') & ~(1 << 5)));}
		if(cfg.pinConfiguration6 > 1) {
this.setPortInterrupt('a', (short)(this.getPortInterrupt('a') & ~(1 << 6)));}
		if(cfg.pinConfiguration7 > 1) {
this.setPortInterrupt('a', (short)(this.getPortInterrupt('a') & ~(1 << 7)));}
		if(cfg.pinConfiguration8 > 1) {
this.setPortInterrupt('b', (short)(this.getPortInterrupt('b') & ~(1 << 0)));}
		if(cfg.pinConfiguration9 > 1) {
this.setPortInterrupt('b', (short)(this.getPortInterrupt('b') & ~(1 << 1)));}
		if(cfg.pinConfiguration10 > 1) {
this.setPortInterrupt('b', (short)(this.getPortInterrupt('b') & ~(1 << 2)));}
		if(cfg.pinConfiguration11 > 1) {
this.setPortInterrupt('b', (short)(this.getPortInterrupt('b') & ~(1 << 3)));}
		if(cfg.pinConfiguration12 > 1) {
this.setPortInterrupt('b', (short)(this.getPortInterrupt('b') & ~(1 << 4)));}
		if(cfg.pinConfiguration13 > 1) {
this.setPortInterrupt('b', (short)(this.getPortInterrupt('b') & ~(1 << 5)));}
		if(cfg.pinConfiguration14 > 1) {
this.setPortInterrupt('b', (short)(this.getPortInterrupt('b') & ~(1 << 6)));}
		if(cfg.pinConfiguration15 > 1) {
this.setPortInterrupt('b', (short)(this.getPortInterrupt('b') & ~(1 << 7)));}
		
    }

    @Override
    public List<String> getEnabledChannels(org.eclipse.smarthome.config.core.Configuration config) throws TinkerforgeException{
        BrickletIO16Config cfg = (BrickletIO16Config) config.as(BrickletIO16Config.class);
List<String> result = new ArrayList<String>();
        if (cfg.pinConfiguration0 > 1) {
                result.add("BrickletIO16Input0");
            }
		if (cfg.pinConfiguration1 > 1) {
                result.add("BrickletIO16Input1");
            }
		if (cfg.pinConfiguration2 > 1) {
                result.add("BrickletIO16Input2");
            }
		if (cfg.pinConfiguration3 > 1) {
                result.add("BrickletIO16Input3");
            }
		if (cfg.pinConfiguration4 > 1) {
                result.add("BrickletIO16Input4");
            }
		if (cfg.pinConfiguration5 > 1) {
                result.add("BrickletIO16Input5");
            }
		if (cfg.pinConfiguration6 > 1) {
                result.add("BrickletIO16Input6");
            }
		if (cfg.pinConfiguration7 > 1) {
                result.add("BrickletIO16Input7");
            }
		if (cfg.pinConfiguration8 > 1) {
                result.add("BrickletIO16Input8");
            }
		if (cfg.pinConfiguration9 > 1) {
                result.add("BrickletIO16Input9");
            }
		if (cfg.pinConfiguration10 > 1) {
                result.add("BrickletIO16Input10");
            }
		if (cfg.pinConfiguration11 > 1) {
                result.add("BrickletIO16Input11");
            }
		if (cfg.pinConfiguration12 > 1) {
                result.add("BrickletIO16Input12");
            }
		if (cfg.pinConfiguration13 > 1) {
                result.add("BrickletIO16Input13");
            }
		if (cfg.pinConfiguration14 > 1) {
                result.add("BrickletIO16Input14");
            }
		if (cfg.pinConfiguration15 > 1) {
                result.add("BrickletIO16Input15");
            }
		if (cfg.pinConfiguration0 <= 1) {
                result.add("BrickletIO16Output0");
            }
		if (cfg.pinConfiguration1 <= 1) {
                result.add("BrickletIO16Output1");
            }
		if (cfg.pinConfiguration2 <= 1) {
                result.add("BrickletIO16Output2");
            }
		if (cfg.pinConfiguration3 <= 1) {
                result.add("BrickletIO16Output3");
            }
		if (cfg.pinConfiguration4 <= 1) {
                result.add("BrickletIO16Output4");
            }
		if (cfg.pinConfiguration5 <= 1) {
                result.add("BrickletIO16Output5");
            }
		if (cfg.pinConfiguration6 <= 1) {
                result.add("BrickletIO16Output6");
            }
		if (cfg.pinConfiguration7 <= 1) {
                result.add("BrickletIO16Output7");
            }
		if (cfg.pinConfiguration8 <= 1) {
                result.add("BrickletIO16Output8");
            }
		if (cfg.pinConfiguration9 <= 1) {
                result.add("BrickletIO16Output9");
            }
		if (cfg.pinConfiguration10 <= 1) {
                result.add("BrickletIO16Output10");
            }
		if (cfg.pinConfiguration11 <= 1) {
                result.add("BrickletIO16Output11");
            }
		if (cfg.pinConfiguration12 <= 1) {
                result.add("BrickletIO16Output12");
            }
		if (cfg.pinConfiguration13 <= 1) {
                result.add("BrickletIO16Output13");
            }
		if (cfg.pinConfiguration14 <= 1) {
                result.add("BrickletIO16Output14");
            }
		if (cfg.pinConfiguration15 <= 1) {
                result.add("BrickletIO16Output15");
            }
		if (cfg.pinConfiguration0 <= 1) {
                result.add("BrickletIO16Monoflop0");
            }
		if (cfg.pinConfiguration1 <= 1) {
                result.add("BrickletIO16Monoflop1");
            }
		if (cfg.pinConfiguration2 <= 1) {
                result.add("BrickletIO16Monoflop2");
            }
		if (cfg.pinConfiguration3 <= 1) {
                result.add("BrickletIO16Monoflop3");
            }
		if (cfg.pinConfiguration4 <= 1) {
                result.add("BrickletIO16Monoflop4");
            }
		if (cfg.pinConfiguration5 <= 1) {
                result.add("BrickletIO16Monoflop5");
            }
		if (cfg.pinConfiguration6 <= 1) {
                result.add("BrickletIO16Monoflop6");
            }
		if (cfg.pinConfiguration7 <= 1) {
                result.add("BrickletIO16Monoflop7");
            }
		if (cfg.pinConfiguration8 <= 1) {
                result.add("BrickletIO16Monoflop8");
            }
		if (cfg.pinConfiguration9 <= 1) {
                result.add("BrickletIO16Monoflop9");
            }
		if (cfg.pinConfiguration10 <= 1) {
                result.add("BrickletIO16Monoflop10");
            }
		if (cfg.pinConfiguration11 <= 1) {
                result.add("BrickletIO16Monoflop11");
            }
		if (cfg.pinConfiguration12 <= 1) {
                result.add("BrickletIO16Monoflop12");
            }
		if (cfg.pinConfiguration13 <= 1) {
                result.add("BrickletIO16Monoflop13");
            }
		if (cfg.pinConfiguration14 <= 1) {
                result.add("BrickletIO16Monoflop14");
            }
		if (cfg.pinConfiguration15 <= 1) {
                result.add("BrickletIO16Monoflop15");
            }
		if (cfg.pinConfiguration0 > 1) {
                result.add("BrickletIO16EdgeCount0");
            }
		if (cfg.pinConfiguration1 > 1) {
                result.add("BrickletIO16EdgeCount1");
            }
        return result;
    }

    public static @Nullable ChannelType getChannelType(ChannelTypeUID channelTypeUID) {
        switch(channelTypeUID.getId()) {
            case "BrickletIO16InputPin":
                return ChannelTypeBuilder.state(new ChannelTypeUID("tinkerforge", "BrickletIO16InputPin"), "NOT USED", "Contact").withConfigDescriptionURI(URI.create("channel-type:tinkerforge:BrickletIO16InputPin")).withDescription("The logic level that is currently measured on the pin.").build();
            case "BrickletIO16OutputPin":
                return ChannelTypeBuilder.state(new ChannelTypeUID("tinkerforge", "BrickletIO16OutputPin"), "Output Value", "Switch").withConfigDescriptionURI(URI.create("channel-type:tinkerforge:BrickletIO16OutputPin")).withDescription("The logic level that is currently set on the pin.").build();
            case "BrickletIO16Monoflop":
                return ChannelTypeBuilder.state(new ChannelTypeUID("tinkerforge", "BrickletIO16Monoflop"), "NOT USED", "String").withConfigDescriptionURI(URI.create("channel-type:tinkerforge:BrickletIO16Monoflop")).withDescription("Triggers a monoflop as configured.")
.withCommandDescription(CommandDescriptionBuilder.create().withCommandOption(new CommandOption("TRIGGER", "Trigger")).build()).build();
            case "BrickletIO16EdgeCount":
                return ChannelTypeBuilder.state(new ChannelTypeUID("tinkerforge", "BrickletIO16EdgeCount"), "NOT USED", "Number:Dimensionless").withConfigDescriptionURI(URI.create("channel-type:tinkerforge:BrickletIO16EdgeCount")).withDescription("The current value of the edge counter of the pin.")
.withStateDescription(StateDescriptionFragmentBuilder.create().withPattern("%d").withReadOnly(true).build().toStateDescription()).build();
default:
                break;
        }

        return null;
    }

    public static ThingType getThingType(ThingTypeUID thingTypeUID) {
             Map<String, String> thingTypeProperties = ThingTypeBuilder.instance(thingTypeUID, "unused").build().getProperties();
             Map<String, String> props = new HashMap<String, String>(thingTypeProperties);
             props.putIfAbsent(TinkerforgeBindingConstants.PROPERTY_MINIMUM_FIRMWARE_VERSION, DEVICE_INFO.minimumFWVersion);
        return ThingTypeBuilder.instance(thingTypeUID, "Tinkerforge IO-16 Bricklet").isListed(false).withSupportedBridgeTypeUIDs(Arrays.asList(TinkerforgeBindingConstants.THING_TYPE_BRICK_DAEMON.toString())).withConfigDescriptionURI(URI.create("thing-type:tinkerforge:" + thingTypeUID.getId())).withDescription("16-channel digital input/output").withChannelDefinitions(Arrays.asList(new ChannelDefinitionBuilder("BrickletIO16Input0", new ChannelTypeUID("tinkerforge", "BrickletIO16InputPin")).withLabel("Input Value 0").build(), new ChannelDefinitionBuilder("BrickletIO16Input1", new ChannelTypeUID("tinkerforge", "BrickletIO16InputPin")).withLabel("Input Value 1").build(), new ChannelDefinitionBuilder("BrickletIO16Input2", new ChannelTypeUID("tinkerforge", "BrickletIO16InputPin")).withLabel("Input Value 2").build(), new ChannelDefinitionBuilder("BrickletIO16Input3", new ChannelTypeUID("tinkerforge", "BrickletIO16InputPin")).withLabel("Input Value 3").build(), new ChannelDefinitionBuilder("BrickletIO16Input4", new ChannelTypeUID("tinkerforge", "BrickletIO16InputPin")).withLabel("Input Value 4").build(), new ChannelDefinitionBuilder("BrickletIO16Input5", new ChannelTypeUID("tinkerforge", "BrickletIO16InputPin")).withLabel("Input Value 5").build(), new ChannelDefinitionBuilder("BrickletIO16Input6", new ChannelTypeUID("tinkerforge", "BrickletIO16InputPin")).withLabel("Input Value 6").build(), new ChannelDefinitionBuilder("BrickletIO16Input7", new ChannelTypeUID("tinkerforge", "BrickletIO16InputPin")).withLabel("Input Value 7").build(), new ChannelDefinitionBuilder("BrickletIO16Input8", new ChannelTypeUID("tinkerforge", "BrickletIO16InputPin")).withLabel("Input Value 8").build(), new ChannelDefinitionBuilder("BrickletIO16Input9", new ChannelTypeUID("tinkerforge", "BrickletIO16InputPin")).withLabel("Input Value 9").build(), new ChannelDefinitionBuilder("BrickletIO16Input10", new ChannelTypeUID("tinkerforge", "BrickletIO16InputPin")).withLabel("Input Value 10").build(), new ChannelDefinitionBuilder("BrickletIO16Input11", new ChannelTypeUID("tinkerforge", "BrickletIO16InputPin")).withLabel("Input Value 11").build(), new ChannelDefinitionBuilder("BrickletIO16Input12", new ChannelTypeUID("tinkerforge", "BrickletIO16InputPin")).withLabel("Input Value 12").build(), new ChannelDefinitionBuilder("BrickletIO16Input13", new ChannelTypeUID("tinkerforge", "BrickletIO16InputPin")).withLabel("Input Value 13").build(), new ChannelDefinitionBuilder("BrickletIO16Input14", new ChannelTypeUID("tinkerforge", "BrickletIO16InputPin")).withLabel("Input Value 14").build(), new ChannelDefinitionBuilder("BrickletIO16Input15", new ChannelTypeUID("tinkerforge", "BrickletIO16InputPin")).withLabel("Input Value 15").build(), new ChannelDefinitionBuilder("BrickletIO16Output0", new ChannelTypeUID("tinkerforge", "BrickletIO16OutputPin")).withLabel("Output Value 0").build(), new ChannelDefinitionBuilder("BrickletIO16Output1", new ChannelTypeUID("tinkerforge", "BrickletIO16OutputPin")).withLabel("Output Value 1").build(), new ChannelDefinitionBuilder("BrickletIO16Output2", new ChannelTypeUID("tinkerforge", "BrickletIO16OutputPin")).withLabel("Output Value 2").build(), new ChannelDefinitionBuilder("BrickletIO16Output3", new ChannelTypeUID("tinkerforge", "BrickletIO16OutputPin")).withLabel("Output Value 3").build(), new ChannelDefinitionBuilder("BrickletIO16Output4", new ChannelTypeUID("tinkerforge", "BrickletIO16OutputPin")).withLabel("Output Value 4").build(), new ChannelDefinitionBuilder("BrickletIO16Output5", new ChannelTypeUID("tinkerforge", "BrickletIO16OutputPin")).withLabel("Output Value 5").build(), new ChannelDefinitionBuilder("BrickletIO16Output6", new ChannelTypeUID("tinkerforge", "BrickletIO16OutputPin")).withLabel("Output Value 6").build(), new ChannelDefinitionBuilder("BrickletIO16Output7", new ChannelTypeUID("tinkerforge", "BrickletIO16OutputPin")).withLabel("Output Value 7").build(), new ChannelDefinitionBuilder("BrickletIO16Output8", new ChannelTypeUID("tinkerforge", "BrickletIO16OutputPin")).withLabel("Output Value 8").build(), new ChannelDefinitionBuilder("BrickletIO16Output9", new ChannelTypeUID("tinkerforge", "BrickletIO16OutputPin")).withLabel("Output Value 9").build(), new ChannelDefinitionBuilder("BrickletIO16Output10", new ChannelTypeUID("tinkerforge", "BrickletIO16OutputPin")).withLabel("Output Value 10").build(), new ChannelDefinitionBuilder("BrickletIO16Output11", new ChannelTypeUID("tinkerforge", "BrickletIO16OutputPin")).withLabel("Output Value 11").build(), new ChannelDefinitionBuilder("BrickletIO16Output12", new ChannelTypeUID("tinkerforge", "BrickletIO16OutputPin")).withLabel("Output Value 12").build(), new ChannelDefinitionBuilder("BrickletIO16Output13", new ChannelTypeUID("tinkerforge", "BrickletIO16OutputPin")).withLabel("Output Value 13").build(), new ChannelDefinitionBuilder("BrickletIO16Output14", new ChannelTypeUID("tinkerforge", "BrickletIO16OutputPin")).withLabel("Output Value 14").build(), new ChannelDefinitionBuilder("BrickletIO16Output15", new ChannelTypeUID("tinkerforge", "BrickletIO16OutputPin")).withLabel("Output Value 15").build(), new ChannelDefinitionBuilder("BrickletIO16Monoflop0", new ChannelTypeUID("tinkerforge", "BrickletIO16Monoflop")).withLabel("Monoflop 0").build(), new ChannelDefinitionBuilder("BrickletIO16Monoflop1", new ChannelTypeUID("tinkerforge", "BrickletIO16Monoflop")).withLabel("Monoflop 1").build(), new ChannelDefinitionBuilder("BrickletIO16Monoflop2", new ChannelTypeUID("tinkerforge", "BrickletIO16Monoflop")).withLabel("Monoflop 2").build(), new ChannelDefinitionBuilder("BrickletIO16Monoflop3", new ChannelTypeUID("tinkerforge", "BrickletIO16Monoflop")).withLabel("Monoflop 3").build(), new ChannelDefinitionBuilder("BrickletIO16Monoflop4", new ChannelTypeUID("tinkerforge", "BrickletIO16Monoflop")).withLabel("Monoflop 4").build(), new ChannelDefinitionBuilder("BrickletIO16Monoflop5", new ChannelTypeUID("tinkerforge", "BrickletIO16Monoflop")).withLabel("Monoflop 5").build(), new ChannelDefinitionBuilder("BrickletIO16Monoflop6", new ChannelTypeUID("tinkerforge", "BrickletIO16Monoflop")).withLabel("Monoflop 6").build(), new ChannelDefinitionBuilder("BrickletIO16Monoflop7", new ChannelTypeUID("tinkerforge", "BrickletIO16Monoflop")).withLabel("Monoflop 7").build(), new ChannelDefinitionBuilder("BrickletIO16Monoflop8", new ChannelTypeUID("tinkerforge", "BrickletIO16Monoflop")).withLabel("Monoflop 8").build(), new ChannelDefinitionBuilder("BrickletIO16Monoflop9", new ChannelTypeUID("tinkerforge", "BrickletIO16Monoflop")).withLabel("Monoflop 9").build(), new ChannelDefinitionBuilder("BrickletIO16Monoflop10", new ChannelTypeUID("tinkerforge", "BrickletIO16Monoflop")).withLabel("Monoflop 10").build(), new ChannelDefinitionBuilder("BrickletIO16Monoflop11", new ChannelTypeUID("tinkerforge", "BrickletIO16Monoflop")).withLabel("Monoflop 11").build(), new ChannelDefinitionBuilder("BrickletIO16Monoflop12", new ChannelTypeUID("tinkerforge", "BrickletIO16Monoflop")).withLabel("Monoflop 12").build(), new ChannelDefinitionBuilder("BrickletIO16Monoflop13", new ChannelTypeUID("tinkerforge", "BrickletIO16Monoflop")).withLabel("Monoflop 13").build(), new ChannelDefinitionBuilder("BrickletIO16Monoflop14", new ChannelTypeUID("tinkerforge", "BrickletIO16Monoflop")).withLabel("Monoflop 14").build(), new ChannelDefinitionBuilder("BrickletIO16Monoflop15", new ChannelTypeUID("tinkerforge", "BrickletIO16Monoflop")).withLabel("Monoflop 15").build(), new ChannelDefinitionBuilder("BrickletIO16EdgeCount0", new ChannelTypeUID("tinkerforge", "BrickletIO16EdgeCount")).withLabel("Edge Count 0").build(), new ChannelDefinitionBuilder("BrickletIO16EdgeCount1", new ChannelTypeUID("tinkerforge", "BrickletIO16EdgeCount")).withLabel("Edge Count 1").build())).withProperties(props).build();
    }

    public static @Nullable ConfigDescription getConfigDescription(URI uri) {
        switch(uri.toASCIIString()) {
            case "thing-type:tinkerforge:brickletio16":
                return ConfigDescriptionBuilder.create(uri).withParameters(Arrays.asList(ConfigDescriptionParameterBuilder.create("pinConfiguration0", Type.INTEGER).withDefault("3").withDescription("Configures pin 0 as input or output. Inputs without pull-up will be floating if nothing is connected. Outputs can have an initial state of low or high.").withLabel("Pin Configuration 0").withLimitToOptions(true).withOptions(Arrays.asList(new ParameterOption("3", "Input with pull-up"), new ParameterOption("2", "Input without pull-up"), new ParameterOption("1", "Output (Initial high)"), new ParameterOption("0", "Output (Initial low)"))).build(), ConfigDescriptionParameterBuilder.create("pinConfiguration1", Type.INTEGER).withDefault("3").withDescription("Configures pin 1 as input or output. Inputs without pull-up will be floating if nothing is connected. Outputs can have an initial state of low or high.").withLabel("Pin Configuration 1").withLimitToOptions(true).withOptions(Arrays.asList(new ParameterOption("3", "Input with pull-up"), new ParameterOption("2", "Input without pull-up"), new ParameterOption("1", "Output (Initial high)"), new ParameterOption("0", "Output (Initial low)"))).build(), ConfigDescriptionParameterBuilder.create("pinConfiguration2", Type.INTEGER).withDefault("3").withDescription("Configures pin 2 as input or output. Inputs without pull-up will be floating if nothing is connected. Outputs can have an initial state of low or high.").withLabel("Pin Configuration 2").withLimitToOptions(true).withOptions(Arrays.asList(new ParameterOption("3", "Input with pull-up"), new ParameterOption("2", "Input without pull-up"), new ParameterOption("1", "Output (Initial high)"), new ParameterOption("0", "Output (Initial low)"))).build(), ConfigDescriptionParameterBuilder.create("pinConfiguration3", Type.INTEGER).withDefault("3").withDescription("Configures pin 3 as input or output. Inputs without pull-up will be floating if nothing is connected. Outputs can have an initial state of low or high.").withLabel("Pin Configuration 3").withLimitToOptions(true).withOptions(Arrays.asList(new ParameterOption("3", "Input with pull-up"), new ParameterOption("2", "Input without pull-up"), new ParameterOption("1", "Output (Initial high)"), new ParameterOption("0", "Output (Initial low)"))).build(), ConfigDescriptionParameterBuilder.create("pinConfiguration4", Type.INTEGER).withDefault("3").withDescription("Configures pin 4 as input or output. Inputs without pull-up will be floating if nothing is connected. Outputs can have an initial state of low or high.").withLabel("Pin Configuration 4").withLimitToOptions(true).withOptions(Arrays.asList(new ParameterOption("3", "Input with pull-up"), new ParameterOption("2", "Input without pull-up"), new ParameterOption("1", "Output (Initial high)"), new ParameterOption("0", "Output (Initial low)"))).build(), ConfigDescriptionParameterBuilder.create("pinConfiguration5", Type.INTEGER).withDefault("3").withDescription("Configures pin 5 as input or output. Inputs without pull-up will be floating if nothing is connected. Outputs can have an initial state of low or high.").withLabel("Pin Configuration 5").withLimitToOptions(true).withOptions(Arrays.asList(new ParameterOption("3", "Input with pull-up"), new ParameterOption("2", "Input without pull-up"), new ParameterOption("1", "Output (Initial high)"), new ParameterOption("0", "Output (Initial low)"))).build(), ConfigDescriptionParameterBuilder.create("pinConfiguration6", Type.INTEGER).withDefault("3").withDescription("Configures pin 6 as input or output. Inputs without pull-up will be floating if nothing is connected. Outputs can have an initial state of low or high.").withLabel("Pin Configuration 6").withLimitToOptions(true).withOptions(Arrays.asList(new ParameterOption("3", "Input with pull-up"), new ParameterOption("2", "Input without pull-up"), new ParameterOption("1", "Output (Initial high)"), new ParameterOption("0", "Output (Initial low)"))).build(), ConfigDescriptionParameterBuilder.create("pinConfiguration7", Type.INTEGER).withDefault("3").withDescription("Configures pin 7 as input or output. Inputs without pull-up will be floating if nothing is connected. Outputs can have an initial state of low or high.").withLabel("Pin Configuration 7").withLimitToOptions(true).withOptions(Arrays.asList(new ParameterOption("3", "Input with pull-up"), new ParameterOption("2", "Input without pull-up"), new ParameterOption("1", "Output (Initial high)"), new ParameterOption("0", "Output (Initial low)"))).build(), ConfigDescriptionParameterBuilder.create("pinConfiguration8", Type.INTEGER).withDefault("3").withDescription("Configures pin 8 as input or output. Inputs without pull-up will be floating if nothing is connected. Outputs can have an initial state of low or high.").withLabel("Pin Configuration 8").withLimitToOptions(true).withOptions(Arrays.asList(new ParameterOption("3", "Input with pull-up"), new ParameterOption("2", "Input without pull-up"), new ParameterOption("1", "Output (Initial high)"), new ParameterOption("0", "Output (Initial low)"))).build(), ConfigDescriptionParameterBuilder.create("pinConfiguration9", Type.INTEGER).withDefault("3").withDescription("Configures pin 9 as input or output. Inputs without pull-up will be floating if nothing is connected. Outputs can have an initial state of low or high.").withLabel("Pin Configuration 9").withLimitToOptions(true).withOptions(Arrays.asList(new ParameterOption("3", "Input with pull-up"), new ParameterOption("2", "Input without pull-up"), new ParameterOption("1", "Output (Initial high)"), new ParameterOption("0", "Output (Initial low)"))).build(), ConfigDescriptionParameterBuilder.create("pinConfiguration10", Type.INTEGER).withDefault("3").withDescription("Configures pin 10 as input or output. Inputs without pull-up will be floating if nothing is connected. Outputs can have an initial state of low or high.").withLabel("Pin Configuration 10").withLimitToOptions(true).withOptions(Arrays.asList(new ParameterOption("3", "Input with pull-up"), new ParameterOption("2", "Input without pull-up"), new ParameterOption("1", "Output (Initial high)"), new ParameterOption("0", "Output (Initial low)"))).build(), ConfigDescriptionParameterBuilder.create("pinConfiguration11", Type.INTEGER).withDefault("3").withDescription("Configures pin 11 as input or output. Inputs without pull-up will be floating if nothing is connected. Outputs can have an initial state of low or high.").withLabel("Pin Configuration 11").withLimitToOptions(true).withOptions(Arrays.asList(new ParameterOption("3", "Input with pull-up"), new ParameterOption("2", "Input without pull-up"), new ParameterOption("1", "Output (Initial high)"), new ParameterOption("0", "Output (Initial low)"))).build(), ConfigDescriptionParameterBuilder.create("pinConfiguration12", Type.INTEGER).withDefault("3").withDescription("Configures pin 12 as input or output. Inputs without pull-up will be floating if nothing is connected. Outputs can have an initial state of low or high.").withLabel("Pin Configuration 12").withLimitToOptions(true).withOptions(Arrays.asList(new ParameterOption("3", "Input with pull-up"), new ParameterOption("2", "Input without pull-up"), new ParameterOption("1", "Output (Initial high)"), new ParameterOption("0", "Output (Initial low)"))).build(), ConfigDescriptionParameterBuilder.create("pinConfiguration13", Type.INTEGER).withDefault("3").withDescription("Configures pin 13 as input or output. Inputs without pull-up will be floating if nothing is connected. Outputs can have an initial state of low or high.").withLabel("Pin Configuration 13").withLimitToOptions(true).withOptions(Arrays.asList(new ParameterOption("3", "Input with pull-up"), new ParameterOption("2", "Input without pull-up"), new ParameterOption("1", "Output (Initial high)"), new ParameterOption("0", "Output (Initial low)"))).build(), ConfigDescriptionParameterBuilder.create("pinConfiguration14", Type.INTEGER).withDefault("3").withDescription("Configures pin 14 as input or output. Inputs without pull-up will be floating if nothing is connected. Outputs can have an initial state of low or high.").withLabel("Pin Configuration 14").withLimitToOptions(true).withOptions(Arrays.asList(new ParameterOption("3", "Input with pull-up"), new ParameterOption("2", "Input without pull-up"), new ParameterOption("1", "Output (Initial high)"), new ParameterOption("0", "Output (Initial low)"))).build(), ConfigDescriptionParameterBuilder.create("pinConfiguration15", Type.INTEGER).withDefault("3").withDescription("Configures pin 15 as input or output. Inputs without pull-up will be floating if nothing is connected. Outputs can have an initial state of low or high.").withLabel("Pin Configuration 15").withLimitToOptions(true).withOptions(Arrays.asList(new ParameterOption("3", "Input with pull-up"), new ParameterOption("2", "Input without pull-up"), new ParameterOption("1", "Output (Initial high)"), new ParameterOption("0", "Output (Initial low)"))).build())).withParameterGroups(Arrays.asList()).build();
            case "channel-type:tinkerforge:BrickletIO16InputPin":
                return ConfigDescriptionBuilder.create(uri).withParameters(Arrays.asList()).withParameterGroups(Arrays.asList()).build();
            case "channel-type:tinkerforge:BrickletIO16OutputPin":
                return ConfigDescriptionBuilder.create(uri).withParameters(Arrays.asList()).withParameterGroups(Arrays.asList()).build();
            case "channel-type:tinkerforge:BrickletIO16Monoflop":
                return ConfigDescriptionBuilder.create(uri).withParameters(Arrays.asList(ConfigDescriptionParameterBuilder.create("monoflopDuration", Type.INTEGER).withDefault("1000").withDescription("The time that the pin should hold the configured value.").withLabel("Monoflop Duration").withUnit("ms").withAdvanced(true).withMinimum(BigDecimal.valueOf(0)).withMaximum(BigDecimal.valueOf(4294967295L)).build(), ConfigDescriptionParameterBuilder.create("monoflopValue", Type.BOOLEAN).withDefault("true").withDescription("The desired value of the pin.").withLabel("Monoflop Value").withAdvanced(true).build())).withParameterGroups(Arrays.asList()).build();
            case "channel-type:tinkerforge:BrickletIO16EdgeCount":
                return ConfigDescriptionBuilder.create(uri).withParameters(Arrays.asList(ConfigDescriptionParameterBuilder.create("edgeType", Type.INTEGER).withDefault("0").withDescription("Configures if rising edges, falling edges or both are counted.").withLabel("Edge Type").withAdvanced(true).withLimitToOptions(true).withOptions(Arrays.asList(new ParameterOption("0", "Rising"), new ParameterOption("1", "Falling"), new ParameterOption("2", "Both"))).build(), ConfigDescriptionParameterBuilder.create("debounce", Type.INTEGER).withDefault("100").withDescription("The debounce time is the minimum time between two count increments.").withLabel("Debounce Time").withMinimum(BigDecimal.valueOf(0)).withMaximum(BigDecimal.valueOf(4294967295L)).build(), ConfigDescriptionParameterBuilder.create("resetOnRead", Type.BOOLEAN).withDefault("false").withDescription("Enabling this will reset the edge counter after openHAB reads its value. Use this if you want relative counts per update.").withLabel("Reset Edge Counter On Update").build(), ConfigDescriptionParameterBuilder.create("updateInterval", Type.INTEGER).withDefault("1000").withDescription("Specifies the update interval in milliseconds. A value of 0 disables automatic updates.").withLabel("Update Interval").withUnit("ms").build())).withParameterGroups(Arrays.asList()).build();
            default:
                break;
        }
        return null;
    }

        @Override
    public void refreshValue(String channel, org.eclipse.smarthome.config.core.Configuration config, org.eclipse.smarthome.config.core.Configuration channelConfig, BiConsumer<String, org.eclipse.smarthome.core.types.State> updateStateFn, BiConsumer<String, String> triggerChannelFn) throws TinkerforgeException {
        BrickletIO16Config cfg = (BrickletIO16Config) config.as(BrickletIO16Config.class);
switch(channel) {
            case "BrickletIO16Input0":
                   {
            short value = this.getPort('a');
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Input0Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Input1":
                   {
            short value = this.getPort('a');
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Input1Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Input2":
                   {
            short value = this.getPort('a');
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Input2Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Input3":
                   {
            short value = this.getPort('a');
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Input3Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Input4":
                   {
            short value = this.getPort('a');
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Input4Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Input5":
                   {
            short value = this.getPort('a');
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Input5Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Input6":
                   {
            short value = this.getPort('a');
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Input6Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Input7":
                   {
            short value = this.getPort('a');
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Input7Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Input8":
                   {
            short value = this.getPort('b');
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Input8Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Input9":
                   {
            short value = this.getPort('b');
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Input9Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Input10":
                   {
            short value = this.getPort('b');
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Input10Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Input11":
                   {
            short value = this.getPort('b');
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Input11Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Input12":
                   {
            short value = this.getPort('b');
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Input12Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Input13":
                   {
            short value = this.getPort('b');
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Input13Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Input14":
                   {
            short value = this.getPort('b');
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Input14Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Input15":
                   {
            short value = this.getPort('b');
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Input15Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Output0":
                   {
            short value = this.getPort('a');
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Output0Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Output1":
                   {
            short value = this.getPort('a');
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Output1Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Output2":
                   {
            short value = this.getPort('a');
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Output2Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Output3":
                   {
            short value = this.getPort('a');
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Output3Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Output4":
                   {
            short value = this.getPort('a');
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Output4Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Output5":
                   {
            short value = this.getPort('a');
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Output5Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Output6":
                   {
            short value = this.getPort('a');
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Output6Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Output7":
                   {
            short value = this.getPort('a');
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Output7Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Output8":
                   {
            short value = this.getPort('b');
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Output8Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Output9":
                   {
            short value = this.getPort('b');
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Output9Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Output10":
                   {
            short value = this.getPort('b');
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Output10Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Output11":
                   {
            short value = this.getPort('b');
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Output11Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Output12":
                   {
            short value = this.getPort('b');
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Output12Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Output13":
                   {
            short value = this.getPort('b');
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Output13Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Output14":
                   {
            short value = this.getPort('b');
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Output14Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Output15":
                   {
            short value = this.getPort('b');
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Output15Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Monoflop0":
                   {
            BrickletIO16.PortMonoflop value = this.getPortMonoflop('a', (short)0);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Monoflop0Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Monoflop1":
                   {
            BrickletIO16.PortMonoflop value = this.getPortMonoflop('a', (short)1);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Monoflop1Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Monoflop2":
                   {
            BrickletIO16.PortMonoflop value = this.getPortMonoflop('a', (short)2);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Monoflop2Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Monoflop3":
                   {
            BrickletIO16.PortMonoflop value = this.getPortMonoflop('a', (short)3);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Monoflop3Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Monoflop4":
                   {
            BrickletIO16.PortMonoflop value = this.getPortMonoflop('a', (short)4);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Monoflop4Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Monoflop5":
                   {
            BrickletIO16.PortMonoflop value = this.getPortMonoflop('a', (short)5);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Monoflop5Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Monoflop6":
                   {
            BrickletIO16.PortMonoflop value = this.getPortMonoflop('a', (short)6);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Monoflop6Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Monoflop7":
                   {
            BrickletIO16.PortMonoflop value = this.getPortMonoflop('a', (short)7);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Monoflop7Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Monoflop8":
                   {
            BrickletIO16.PortMonoflop value = this.getPortMonoflop('b', (short)0);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Monoflop8Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Monoflop9":
                   {
            BrickletIO16.PortMonoflop value = this.getPortMonoflop('b', (short)1);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Monoflop9Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Monoflop10":
                   {
            BrickletIO16.PortMonoflop value = this.getPortMonoflop('b', (short)2);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Monoflop10Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Monoflop11":
                   {
            BrickletIO16.PortMonoflop value = this.getPortMonoflop('b', (short)3);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Monoflop11Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Monoflop12":
                   {
            BrickletIO16.PortMonoflop value = this.getPortMonoflop('b', (short)4);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Monoflop12Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Monoflop13":
                   {
            BrickletIO16.PortMonoflop value = this.getPortMonoflop('b', (short)5);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Monoflop13Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Monoflop14":
                   {
            BrickletIO16.PortMonoflop value = this.getPortMonoflop('b', (short)6);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Monoflop14Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16Monoflop15":
                   {
            BrickletIO16.PortMonoflop value = this.getPortMonoflop('b', (short)7);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16Monoflop15Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16EdgeCount0": {
                   BrickletIO16EdgeCountConfig channelCfg = channelConfig.as(BrickletIO16EdgeCountConfig.class);
                   {
            long value = this.getEdgeCount((short)0, channelCfg.resetOnRead);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16EdgeCount0Getter0(value, cfg));
        }
                   return;
               }
            case "BrickletIO16EdgeCount1": {
                   BrickletIO16EdgeCountConfig channelCfg = channelConfig.as(BrickletIO16EdgeCountConfig.class);
                   {
            long value = this.getEdgeCount((short)1, channelCfg.resetOnRead);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16EdgeCount1Getter0(value, cfg));
        }
                   return;
               }
default:
                logger.warn("Refresh for unknown channel {}", channel);
                break;
        }
    }
    

        @Override
    public List<SetterRefresh> handleCommand(org.eclipse.smarthome.config.core.Configuration config, org.eclipse.smarthome.config.core.Configuration channelConfig, String channel, Command command) throws TinkerforgeException {
        List<SetterRefresh> result = new ArrayList<SetterRefresh>();
        
        switch(channel) {
            case "BrickletIO16Output0":
                if (command instanceof OnOffType) {
                    OnOffType cmd = (OnOffType) command;
this.setSelectedValues('a', (short)(1 << 0), cmd == OnOffType.ON ? (short)0xFF : (short)0);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of OnOffType.", command.getClass().getName(), channel);
                }
                
                break;
            case "BrickletIO16Output1":
                if (command instanceof OnOffType) {
                    OnOffType cmd = (OnOffType) command;
this.setSelectedValues('a', (short)(1 << 1), cmd == OnOffType.ON ? (short)0xFF : (short)0);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of OnOffType.", command.getClass().getName(), channel);
                }
                
                break;
            case "BrickletIO16Output2":
                if (command instanceof OnOffType) {
                    OnOffType cmd = (OnOffType) command;
this.setSelectedValues('a', (short)(1 << 2), cmd == OnOffType.ON ? (short)0xFF : (short)0);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of OnOffType.", command.getClass().getName(), channel);
                }
                
                break;
            case "BrickletIO16Output3":
                if (command instanceof OnOffType) {
                    OnOffType cmd = (OnOffType) command;
this.setSelectedValues('a', (short)(1 << 3), cmd == OnOffType.ON ? (short)0xFF : (short)0);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of OnOffType.", command.getClass().getName(), channel);
                }
                
                break;
            case "BrickletIO16Output4":
                if (command instanceof OnOffType) {
                    OnOffType cmd = (OnOffType) command;
this.setSelectedValues('a', (short)(1 << 4), cmd == OnOffType.ON ? (short)0xFF : (short)0);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of OnOffType.", command.getClass().getName(), channel);
                }
                
                break;
            case "BrickletIO16Output5":
                if (command instanceof OnOffType) {
                    OnOffType cmd = (OnOffType) command;
this.setSelectedValues('a', (short)(1 << 5), cmd == OnOffType.ON ? (short)0xFF : (short)0);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of OnOffType.", command.getClass().getName(), channel);
                }
                
                break;
            case "BrickletIO16Output6":
                if (command instanceof OnOffType) {
                    OnOffType cmd = (OnOffType) command;
this.setSelectedValues('a', (short)(1 << 6), cmd == OnOffType.ON ? (short)0xFF : (short)0);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of OnOffType.", command.getClass().getName(), channel);
                }
                
                break;
            case "BrickletIO16Output7":
                if (command instanceof OnOffType) {
                    OnOffType cmd = (OnOffType) command;
this.setSelectedValues('a', (short)(1 << 7), cmd == OnOffType.ON ? (short)0xFF : (short)0);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of OnOffType.", command.getClass().getName(), channel);
                }
                
                break;
            case "BrickletIO16Output8":
                if (command instanceof OnOffType) {
                    OnOffType cmd = (OnOffType) command;
this.setSelectedValues('b', (short)(1 << 0), cmd == OnOffType.ON ? (short)0xFF : (short)0);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of OnOffType.", command.getClass().getName(), channel);
                }
                
                break;
            case "BrickletIO16Output9":
                if (command instanceof OnOffType) {
                    OnOffType cmd = (OnOffType) command;
this.setSelectedValues('b', (short)(1 << 1), cmd == OnOffType.ON ? (short)0xFF : (short)0);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of OnOffType.", command.getClass().getName(), channel);
                }
                
                break;
            case "BrickletIO16Output10":
                if (command instanceof OnOffType) {
                    OnOffType cmd = (OnOffType) command;
this.setSelectedValues('b', (short)(1 << 2), cmd == OnOffType.ON ? (short)0xFF : (short)0);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of OnOffType.", command.getClass().getName(), channel);
                }
                
                break;
            case "BrickletIO16Output11":
                if (command instanceof OnOffType) {
                    OnOffType cmd = (OnOffType) command;
this.setSelectedValues('b', (short)(1 << 3), cmd == OnOffType.ON ? (short)0xFF : (short)0);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of OnOffType.", command.getClass().getName(), channel);
                }
                
                break;
            case "BrickletIO16Output12":
                if (command instanceof OnOffType) {
                    OnOffType cmd = (OnOffType) command;
this.setSelectedValues('b', (short)(1 << 4), cmd == OnOffType.ON ? (short)0xFF : (short)0);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of OnOffType.", command.getClass().getName(), channel);
                }
                
                break;
            case "BrickletIO16Output13":
                if (command instanceof OnOffType) {
                    OnOffType cmd = (OnOffType) command;
this.setSelectedValues('b', (short)(1 << 5), cmd == OnOffType.ON ? (short)0xFF : (short)0);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of OnOffType.", command.getClass().getName(), channel);
                }
                
                break;
            case "BrickletIO16Output14":
                if (command instanceof OnOffType) {
                    OnOffType cmd = (OnOffType) command;
this.setSelectedValues('b', (short)(1 << 6), cmd == OnOffType.ON ? (short)0xFF : (short)0);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of OnOffType.", command.getClass().getName(), channel);
                }
                
                break;
            case "BrickletIO16Output15":
                if (command instanceof OnOffType) {
                    OnOffType cmd = (OnOffType) command;
this.setSelectedValues('b', (short)(1 << 7), cmd == OnOffType.ON ? (short)0xFF : (short)0);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of OnOffType.", command.getClass().getName(), channel);
                }
                
                break;
            case "BrickletIO16Monoflop0":
                if (command instanceof StringType) {
                    BrickletIO16MonoflopConfig channelCfg = channelConfig.as(BrickletIO16MonoflopConfig.class);
this.setPortMonoflop('a', (short)(1 << 0), channelCfg.monoflopValue.booleanValue() ? (short)0xFF : (short)0, channelCfg.monoflopDuration.longValue());
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of StringType.", command.getClass().getName(), channel);
                }
                result.add(new SetterRefresh("BrickletIO16Output0", 0));
                break;
            case "BrickletIO16Monoflop1":
                if (command instanceof StringType) {
                    BrickletIO16MonoflopConfig channelCfg = channelConfig.as(BrickletIO16MonoflopConfig.class);
this.setPortMonoflop('a', (short)(1 << 1), channelCfg.monoflopValue.booleanValue() ? (short)0xFF : (short)0, channelCfg.monoflopDuration.longValue());
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of StringType.", command.getClass().getName(), channel);
                }
                result.add(new SetterRefresh("BrickletIO16Output1", 0));
                break;
            case "BrickletIO16Monoflop2":
                if (command instanceof StringType) {
                    BrickletIO16MonoflopConfig channelCfg = channelConfig.as(BrickletIO16MonoflopConfig.class);
this.setPortMonoflop('a', (short)(1 << 2), channelCfg.monoflopValue.booleanValue() ? (short)0xFF : (short)0, channelCfg.monoflopDuration.longValue());
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of StringType.", command.getClass().getName(), channel);
                }
                result.add(new SetterRefresh("BrickletIO16Output2", 0));
                break;
            case "BrickletIO16Monoflop3":
                if (command instanceof StringType) {
                    BrickletIO16MonoflopConfig channelCfg = channelConfig.as(BrickletIO16MonoflopConfig.class);
this.setPortMonoflop('a', (short)(1 << 3), channelCfg.monoflopValue.booleanValue() ? (short)0xFF : (short)0, channelCfg.monoflopDuration.longValue());
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of StringType.", command.getClass().getName(), channel);
                }
                result.add(new SetterRefresh("BrickletIO16Output3", 0));
                break;
            case "BrickletIO16Monoflop4":
                if (command instanceof StringType) {
                    BrickletIO16MonoflopConfig channelCfg = channelConfig.as(BrickletIO16MonoflopConfig.class);
this.setPortMonoflop('a', (short)(1 << 4), channelCfg.monoflopValue.booleanValue() ? (short)0xFF : (short)0, channelCfg.monoflopDuration.longValue());
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of StringType.", command.getClass().getName(), channel);
                }
                result.add(new SetterRefresh("BrickletIO16Output4", 0));
                break;
            case "BrickletIO16Monoflop5":
                if (command instanceof StringType) {
                    BrickletIO16MonoflopConfig channelCfg = channelConfig.as(BrickletIO16MonoflopConfig.class);
this.setPortMonoflop('a', (short)(1 << 5), channelCfg.monoflopValue.booleanValue() ? (short)0xFF : (short)0, channelCfg.monoflopDuration.longValue());
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of StringType.", command.getClass().getName(), channel);
                }
                result.add(new SetterRefresh("BrickletIO16Output5", 0));
                break;
            case "BrickletIO16Monoflop6":
                if (command instanceof StringType) {
                    BrickletIO16MonoflopConfig channelCfg = channelConfig.as(BrickletIO16MonoflopConfig.class);
this.setPortMonoflop('a', (short)(1 << 6), channelCfg.monoflopValue.booleanValue() ? (short)0xFF : (short)0, channelCfg.monoflopDuration.longValue());
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of StringType.", command.getClass().getName(), channel);
                }
                result.add(new SetterRefresh("BrickletIO16Output6", 0));
                break;
            case "BrickletIO16Monoflop7":
                if (command instanceof StringType) {
                    BrickletIO16MonoflopConfig channelCfg = channelConfig.as(BrickletIO16MonoflopConfig.class);
this.setPortMonoflop('a', (short)(1 << 7), channelCfg.monoflopValue.booleanValue() ? (short)0xFF : (short)0, channelCfg.monoflopDuration.longValue());
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of StringType.", command.getClass().getName(), channel);
                }
                result.add(new SetterRefresh("BrickletIO16Output7", 0));
                break;
            case "BrickletIO16Monoflop8":
                if (command instanceof StringType) {
                    BrickletIO16MonoflopConfig channelCfg = channelConfig.as(BrickletIO16MonoflopConfig.class);
this.setPortMonoflop('b', (short)(1 << 0), channelCfg.monoflopValue.booleanValue() ? (short)0xFF : (short)0, channelCfg.monoflopDuration.longValue());
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of StringType.", command.getClass().getName(), channel);
                }
                result.add(new SetterRefresh("BrickletIO16Output8", 0));
                break;
            case "BrickletIO16Monoflop9":
                if (command instanceof StringType) {
                    BrickletIO16MonoflopConfig channelCfg = channelConfig.as(BrickletIO16MonoflopConfig.class);
this.setPortMonoflop('b', (short)(1 << 1), channelCfg.monoflopValue.booleanValue() ? (short)0xFF : (short)0, channelCfg.monoflopDuration.longValue());
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of StringType.", command.getClass().getName(), channel);
                }
                result.add(new SetterRefresh("BrickletIO16Output9", 0));
                break;
            case "BrickletIO16Monoflop10":
                if (command instanceof StringType) {
                    BrickletIO16MonoflopConfig channelCfg = channelConfig.as(BrickletIO16MonoflopConfig.class);
this.setPortMonoflop('b', (short)(1 << 2), channelCfg.monoflopValue.booleanValue() ? (short)0xFF : (short)0, channelCfg.monoflopDuration.longValue());
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of StringType.", command.getClass().getName(), channel);
                }
                result.add(new SetterRefresh("BrickletIO16Output10", 0));
                break;
            case "BrickletIO16Monoflop11":
                if (command instanceof StringType) {
                    BrickletIO16MonoflopConfig channelCfg = channelConfig.as(BrickletIO16MonoflopConfig.class);
this.setPortMonoflop('b', (short)(1 << 3), channelCfg.monoflopValue.booleanValue() ? (short)0xFF : (short)0, channelCfg.monoflopDuration.longValue());
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of StringType.", command.getClass().getName(), channel);
                }
                result.add(new SetterRefresh("BrickletIO16Output11", 0));
                break;
            case "BrickletIO16Monoflop12":
                if (command instanceof StringType) {
                    BrickletIO16MonoflopConfig channelCfg = channelConfig.as(BrickletIO16MonoflopConfig.class);
this.setPortMonoflop('b', (short)(1 << 4), channelCfg.monoflopValue.booleanValue() ? (short)0xFF : (short)0, channelCfg.monoflopDuration.longValue());
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of StringType.", command.getClass().getName(), channel);
                }
                result.add(new SetterRefresh("BrickletIO16Output12", 0));
                break;
            case "BrickletIO16Monoflop13":
                if (command instanceof StringType) {
                    BrickletIO16MonoflopConfig channelCfg = channelConfig.as(BrickletIO16MonoflopConfig.class);
this.setPortMonoflop('b', (short)(1 << 5), channelCfg.monoflopValue.booleanValue() ? (short)0xFF : (short)0, channelCfg.monoflopDuration.longValue());
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of StringType.", command.getClass().getName(), channel);
                }
                result.add(new SetterRefresh("BrickletIO16Output13", 0));
                break;
            case "BrickletIO16Monoflop14":
                if (command instanceof StringType) {
                    BrickletIO16MonoflopConfig channelCfg = channelConfig.as(BrickletIO16MonoflopConfig.class);
this.setPortMonoflop('b', (short)(1 << 6), channelCfg.monoflopValue.booleanValue() ? (short)0xFF : (short)0, channelCfg.monoflopDuration.longValue());
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of StringType.", command.getClass().getName(), channel);
                }
                result.add(new SetterRefresh("BrickletIO16Output14", 0));
                break;
            case "BrickletIO16Monoflop15":
                if (command instanceof StringType) {
                    BrickletIO16MonoflopConfig channelCfg = channelConfig.as(BrickletIO16MonoflopConfig.class);
this.setPortMonoflop('b', (short)(1 << 7), channelCfg.monoflopValue.booleanValue() ? (short)0xFF : (short)0, channelCfg.monoflopDuration.longValue());
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of StringType.", command.getClass().getName(), channel);
                }
                result.add(new SetterRefresh("BrickletIO16Output15", 0));
                break;
default:
                logger.warn("Command for unknown channel {}", channel);
        }
        return result;
    }

        private org.eclipse.smarthome.core.types.State transformBrickletIO16Input0Callback0(char port, short interruptMask, short valueMask, BrickletIO16Config cfg) {
        return (valueMask & (1 << 0)) > 0 ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Input1Callback0(char port, short interruptMask, short valueMask, BrickletIO16Config cfg) {
        return (valueMask & (1 << 1)) > 0 ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Input2Callback0(char port, short interruptMask, short valueMask, BrickletIO16Config cfg) {
        return (valueMask & (1 << 2)) > 0 ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Input3Callback0(char port, short interruptMask, short valueMask, BrickletIO16Config cfg) {
        return (valueMask & (1 << 3)) > 0 ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Input4Callback0(char port, short interruptMask, short valueMask, BrickletIO16Config cfg) {
        return (valueMask & (1 << 4)) > 0 ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Input5Callback0(char port, short interruptMask, short valueMask, BrickletIO16Config cfg) {
        return (valueMask & (1 << 5)) > 0 ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Input6Callback0(char port, short interruptMask, short valueMask, BrickletIO16Config cfg) {
        return (valueMask & (1 << 6)) > 0 ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Input7Callback0(char port, short interruptMask, short valueMask, BrickletIO16Config cfg) {
        return (valueMask & (1 << 7)) > 0 ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Input8Callback0(char port, short interruptMask, short valueMask, BrickletIO16Config cfg) {
        return (valueMask & (1 << 0)) > 0 ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Input9Callback0(char port, short interruptMask, short valueMask, BrickletIO16Config cfg) {
        return (valueMask & (1 << 1)) > 0 ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Input10Callback0(char port, short interruptMask, short valueMask, BrickletIO16Config cfg) {
        return (valueMask & (1 << 2)) > 0 ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Input11Callback0(char port, short interruptMask, short valueMask, BrickletIO16Config cfg) {
        return (valueMask & (1 << 3)) > 0 ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Input12Callback0(char port, short interruptMask, short valueMask, BrickletIO16Config cfg) {
        return (valueMask & (1 << 4)) > 0 ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Input13Callback0(char port, short interruptMask, short valueMask, BrickletIO16Config cfg) {
        return (valueMask & (1 << 5)) > 0 ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Input14Callback0(char port, short interruptMask, short valueMask, BrickletIO16Config cfg) {
        return (valueMask & (1 << 6)) > 0 ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Input15Callback0(char port, short interruptMask, short valueMask, BrickletIO16Config cfg) {
        return (valueMask & (1 << 7)) > 0 ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Output0Callback0(char port, short selectionMask, short valueMask, BrickletIO16Config cfg) {
        return (valueMask & (1 << 0)) > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Output1Callback0(char port, short selectionMask, short valueMask, BrickletIO16Config cfg) {
        return (valueMask & (1 << 1)) > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Output2Callback0(char port, short selectionMask, short valueMask, BrickletIO16Config cfg) {
        return (valueMask & (1 << 2)) > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Output3Callback0(char port, short selectionMask, short valueMask, BrickletIO16Config cfg) {
        return (valueMask & (1 << 3)) > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Output4Callback0(char port, short selectionMask, short valueMask, BrickletIO16Config cfg) {
        return (valueMask & (1 << 4)) > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Output5Callback0(char port, short selectionMask, short valueMask, BrickletIO16Config cfg) {
        return (valueMask & (1 << 5)) > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Output6Callback0(char port, short selectionMask, short valueMask, BrickletIO16Config cfg) {
        return (valueMask & (1 << 6)) > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Output7Callback0(char port, short selectionMask, short valueMask, BrickletIO16Config cfg) {
        return (valueMask & (1 << 7)) > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Output8Callback0(char port, short selectionMask, short valueMask, BrickletIO16Config cfg) {
        return (valueMask & (1 << 0)) > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Output9Callback0(char port, short selectionMask, short valueMask, BrickletIO16Config cfg) {
        return (valueMask & (1 << 1)) > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Output10Callback0(char port, short selectionMask, short valueMask, BrickletIO16Config cfg) {
        return (valueMask & (1 << 2)) > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Output11Callback0(char port, short selectionMask, short valueMask, BrickletIO16Config cfg) {
        return (valueMask & (1 << 3)) > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Output12Callback0(char port, short selectionMask, short valueMask, BrickletIO16Config cfg) {
        return (valueMask & (1 << 4)) > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Output13Callback0(char port, short selectionMask, short valueMask, BrickletIO16Config cfg) {
        return (valueMask & (1 << 5)) > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Output14Callback0(char port, short selectionMask, short valueMask, BrickletIO16Config cfg) {
        return (valueMask & (1 << 6)) > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Output15Callback0(char port, short selectionMask, short valueMask, BrickletIO16Config cfg) {
        return (valueMask & (1 << 7)) > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Input0Getter0(short value, BrickletIO16Config cfg) {
        return (value & (1 << 0)) > 0 ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Input1Getter0(short value, BrickletIO16Config cfg) {
        return (value & (1 << 1)) > 0 ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Input2Getter0(short value, BrickletIO16Config cfg) {
        return (value & (1 << 2)) > 0 ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Input3Getter0(short value, BrickletIO16Config cfg) {
        return (value & (1 << 3)) > 0 ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Input4Getter0(short value, BrickletIO16Config cfg) {
        return (value & (1 << 4)) > 0 ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Input5Getter0(short value, BrickletIO16Config cfg) {
        return (value & (1 << 5)) > 0 ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Input6Getter0(short value, BrickletIO16Config cfg) {
        return (value & (1 << 6)) > 0 ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Input7Getter0(short value, BrickletIO16Config cfg) {
        return (value & (1 << 7)) > 0 ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Input8Getter0(short value, BrickletIO16Config cfg) {
        return (value & (1 << 0)) > 0 ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Input9Getter0(short value, BrickletIO16Config cfg) {
        return (value & (1 << 1)) > 0 ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Input10Getter0(short value, BrickletIO16Config cfg) {
        return (value & (1 << 2)) > 0 ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Input11Getter0(short value, BrickletIO16Config cfg) {
        return (value & (1 << 3)) > 0 ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Input12Getter0(short value, BrickletIO16Config cfg) {
        return (value & (1 << 4)) > 0 ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Input13Getter0(short value, BrickletIO16Config cfg) {
        return (value & (1 << 5)) > 0 ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Input14Getter0(short value, BrickletIO16Config cfg) {
        return (value & (1 << 6)) > 0 ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Input15Getter0(short value, BrickletIO16Config cfg) {
        return (value & (1 << 7)) > 0 ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Output0Getter0(short value, BrickletIO16Config cfg) {
        return (value & (1 << 0)) > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Output1Getter0(short value, BrickletIO16Config cfg) {
        return (value & (1 << 1)) > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Output2Getter0(short value, BrickletIO16Config cfg) {
        return (value & (1 << 2)) > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Output3Getter0(short value, BrickletIO16Config cfg) {
        return (value & (1 << 3)) > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Output4Getter0(short value, BrickletIO16Config cfg) {
        return (value & (1 << 4)) > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Output5Getter0(short value, BrickletIO16Config cfg) {
        return (value & (1 << 5)) > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Output6Getter0(short value, BrickletIO16Config cfg) {
        return (value & (1 << 6)) > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Output7Getter0(short value, BrickletIO16Config cfg) {
        return (value & (1 << 7)) > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Output8Getter0(short value, BrickletIO16Config cfg) {
        return (value & (1 << 0)) > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Output9Getter0(short value, BrickletIO16Config cfg) {
        return (value & (1 << 1)) > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Output10Getter0(short value, BrickletIO16Config cfg) {
        return (value & (1 << 2)) > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Output11Getter0(short value, BrickletIO16Config cfg) {
        return (value & (1 << 3)) > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Output12Getter0(short value, BrickletIO16Config cfg) {
        return (value & (1 << 4)) > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Output13Getter0(short value, BrickletIO16Config cfg) {
        return (value & (1 << 5)) > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Output14Getter0(short value, BrickletIO16Config cfg) {
        return (value & (1 << 6)) > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Output15Getter0(short value, BrickletIO16Config cfg) {
        return (value & (1 << 7)) > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Monoflop0Getter0(BrickletIO16.PortMonoflop value, BrickletIO16Config cfg) {
        return value.value > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Monoflop1Getter0(BrickletIO16.PortMonoflop value, BrickletIO16Config cfg) {
        return value.value > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Monoflop2Getter0(BrickletIO16.PortMonoflop value, BrickletIO16Config cfg) {
        return value.value > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Monoflop3Getter0(BrickletIO16.PortMonoflop value, BrickletIO16Config cfg) {
        return value.value > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Monoflop4Getter0(BrickletIO16.PortMonoflop value, BrickletIO16Config cfg) {
        return value.value > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Monoflop5Getter0(BrickletIO16.PortMonoflop value, BrickletIO16Config cfg) {
        return value.value > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Monoflop6Getter0(BrickletIO16.PortMonoflop value, BrickletIO16Config cfg) {
        return value.value > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Monoflop7Getter0(BrickletIO16.PortMonoflop value, BrickletIO16Config cfg) {
        return value.value > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Monoflop8Getter0(BrickletIO16.PortMonoflop value, BrickletIO16Config cfg) {
        return value.value > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Monoflop9Getter0(BrickletIO16.PortMonoflop value, BrickletIO16Config cfg) {
        return value.value > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Monoflop10Getter0(BrickletIO16.PortMonoflop value, BrickletIO16Config cfg) {
        return value.value > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Monoflop11Getter0(BrickletIO16.PortMonoflop value, BrickletIO16Config cfg) {
        return value.value > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Monoflop12Getter0(BrickletIO16.PortMonoflop value, BrickletIO16Config cfg) {
        return value.value > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Monoflop13Getter0(BrickletIO16.PortMonoflop value, BrickletIO16Config cfg) {
        return value.value > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Monoflop14Getter0(BrickletIO16.PortMonoflop value, BrickletIO16Config cfg) {
        return value.value > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16Monoflop15Getter0(BrickletIO16.PortMonoflop value, BrickletIO16Config cfg) {
        return value.value > 0 ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16EdgeCount0Getter0(long value, BrickletIO16Config cfg) {
        return new DecimalType(value);
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16EdgeCount1Getter0(long value, BrickletIO16Config cfg) {
        return new DecimalType(value);
    }

}