/**
 * 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.BrickletIO16V2;
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 2.0.
 * @author Erik Fleckstein - Initial contribution
 */
@NonNullByDefault
public class BrickletIO16V2Wrapper extends BrickletIO16V2 implements CoMCUFlashable, DeviceWrapper {
    public static final DeviceInfo DEVICE_INFO = new DeviceInfo(BrickletIO16V2.DEVICE_DISPLAY_NAME, "brickletio16v2", BrickletIO16V2.DEVICE_IDENTIFIER, BrickletIO16V2Wrapper.class, BrickletIO16V2Actions.class, "2.0.0", true);

    public BrickletIO16V2Wrapper(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(BrickletIO16V2Wrapper.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);
        BrickletIO16V2Config cfg = (BrickletIO16V2Config) config.as(BrickletIO16V2Config.class);
        if(cfg.pinConfiguration0 > 1) {
this.addInputValueListener(this.reg((channel, changed, value) -> {if(channel == 0) {updateStateFn.accept("BrickletIO16V2Input0", transformBrickletIO16V2Input0Callback0(channel, changed, value, cfg));}}, this::removeInputValueListener));}
		if(cfg.pinConfiguration1 > 1) {
this.addInputValueListener(this.reg((channel, changed, value) -> {if(channel == 1) {updateStateFn.accept("BrickletIO16V2Input1", transformBrickletIO16V2Input1Callback0(channel, changed, value, cfg));}}, this::removeInputValueListener));}
		if(cfg.pinConfiguration2 > 1) {
this.addInputValueListener(this.reg((channel, changed, value) -> {if(channel == 2) {updateStateFn.accept("BrickletIO16V2Input2", transformBrickletIO16V2Input2Callback0(channel, changed, value, cfg));}}, this::removeInputValueListener));}
		if(cfg.pinConfiguration3 > 1) {
this.addInputValueListener(this.reg((channel, changed, value) -> {if(channel == 3) {updateStateFn.accept("BrickletIO16V2Input3", transformBrickletIO16V2Input3Callback0(channel, changed, value, cfg));}}, this::removeInputValueListener));}
		if(cfg.pinConfiguration4 > 1) {
this.addInputValueListener(this.reg((channel, changed, value) -> {if(channel == 4) {updateStateFn.accept("BrickletIO16V2Input4", transformBrickletIO16V2Input4Callback0(channel, changed, value, cfg));}}, this::removeInputValueListener));}
		if(cfg.pinConfiguration5 > 1) {
this.addInputValueListener(this.reg((channel, changed, value) -> {if(channel == 5) {updateStateFn.accept("BrickletIO16V2Input5", transformBrickletIO16V2Input5Callback0(channel, changed, value, cfg));}}, this::removeInputValueListener));}
		if(cfg.pinConfiguration6 > 1) {
this.addInputValueListener(this.reg((channel, changed, value) -> {if(channel == 6) {updateStateFn.accept("BrickletIO16V2Input6", transformBrickletIO16V2Input6Callback0(channel, changed, value, cfg));}}, this::removeInputValueListener));}
		if(cfg.pinConfiguration7 > 1) {
this.addInputValueListener(this.reg((channel, changed, value) -> {if(channel == 7) {updateStateFn.accept("BrickletIO16V2Input7", transformBrickletIO16V2Input7Callback0(channel, changed, value, cfg));}}, this::removeInputValueListener));}
		if(cfg.pinConfiguration8 > 1) {
this.addInputValueListener(this.reg((channel, changed, value) -> {if(channel == 8) {updateStateFn.accept("BrickletIO16V2Input8", transformBrickletIO16V2Input8Callback0(channel, changed, value, cfg));}}, this::removeInputValueListener));}
		if(cfg.pinConfiguration9 > 1) {
this.addInputValueListener(this.reg((channel, changed, value) -> {if(channel == 9) {updateStateFn.accept("BrickletIO16V2Input9", transformBrickletIO16V2Input9Callback0(channel, changed, value, cfg));}}, this::removeInputValueListener));}
		if(cfg.pinConfiguration10 > 1) {
this.addInputValueListener(this.reg((channel, changed, value) -> {if(channel == 10) {updateStateFn.accept("BrickletIO16V2Input10", transformBrickletIO16V2Input10Callback0(channel, changed, value, cfg));}}, this::removeInputValueListener));}
		if(cfg.pinConfiguration11 > 1) {
this.addInputValueListener(this.reg((channel, changed, value) -> {if(channel == 11) {updateStateFn.accept("BrickletIO16V2Input11", transformBrickletIO16V2Input11Callback0(channel, changed, value, cfg));}}, this::removeInputValueListener));}
		if(cfg.pinConfiguration12 > 1) {
this.addInputValueListener(this.reg((channel, changed, value) -> {if(channel == 12) {updateStateFn.accept("BrickletIO16V2Input12", transformBrickletIO16V2Input12Callback0(channel, changed, value, cfg));}}, this::removeInputValueListener));}
		if(cfg.pinConfiguration13 > 1) {
this.addInputValueListener(this.reg((channel, changed, value) -> {if(channel == 13) {updateStateFn.accept("BrickletIO16V2Input13", transformBrickletIO16V2Input13Callback0(channel, changed, value, cfg));}}, this::removeInputValueListener));}
		if(cfg.pinConfiguration14 > 1) {
this.addInputValueListener(this.reg((channel, changed, value) -> {if(channel == 14) {updateStateFn.accept("BrickletIO16V2Input14", transformBrickletIO16V2Input14Callback0(channel, changed, value, cfg));}}, this::removeInputValueListener));}
		if(cfg.pinConfiguration15 > 1) {
this.addInputValueListener(this.reg((channel, changed, value) -> {if(channel == 15) {updateStateFn.accept("BrickletIO16V2Input15", transformBrickletIO16V2Input15Callback0(channel, changed, value, cfg));}}, this::removeInputValueListener));}
		if(cfg.pinConfiguration0 <= 1) {
this.addMonoflopDoneListener(this.reg((channel, value) -> {if(channel == 0) {updateStateFn.accept("BrickletIO16V2Output0", transformBrickletIO16V2Output0Callback0(channel, value, cfg));}}, this::removeMonoflopDoneListener));}
		if(cfg.pinConfiguration1 <= 1) {
this.addMonoflopDoneListener(this.reg((channel, value) -> {if(channel == 1) {updateStateFn.accept("BrickletIO16V2Output1", transformBrickletIO16V2Output1Callback0(channel, value, cfg));}}, this::removeMonoflopDoneListener));}
		if(cfg.pinConfiguration2 <= 1) {
this.addMonoflopDoneListener(this.reg((channel, value) -> {if(channel == 2) {updateStateFn.accept("BrickletIO16V2Output2", transformBrickletIO16V2Output2Callback0(channel, value, cfg));}}, this::removeMonoflopDoneListener));}
		if(cfg.pinConfiguration3 <= 1) {
this.addMonoflopDoneListener(this.reg((channel, value) -> {if(channel == 3) {updateStateFn.accept("BrickletIO16V2Output3", transformBrickletIO16V2Output3Callback0(channel, value, cfg));}}, this::removeMonoflopDoneListener));}
		if(cfg.pinConfiguration4 <= 1) {
this.addMonoflopDoneListener(this.reg((channel, value) -> {if(channel == 4) {updateStateFn.accept("BrickletIO16V2Output4", transformBrickletIO16V2Output4Callback0(channel, value, cfg));}}, this::removeMonoflopDoneListener));}
		if(cfg.pinConfiguration5 <= 1) {
this.addMonoflopDoneListener(this.reg((channel, value) -> {if(channel == 5) {updateStateFn.accept("BrickletIO16V2Output5", transformBrickletIO16V2Output5Callback0(channel, value, cfg));}}, this::removeMonoflopDoneListener));}
		if(cfg.pinConfiguration6 <= 1) {
this.addMonoflopDoneListener(this.reg((channel, value) -> {if(channel == 6) {updateStateFn.accept("BrickletIO16V2Output6", transformBrickletIO16V2Output6Callback0(channel, value, cfg));}}, this::removeMonoflopDoneListener));}
		if(cfg.pinConfiguration7 <= 1) {
this.addMonoflopDoneListener(this.reg((channel, value) -> {if(channel == 7) {updateStateFn.accept("BrickletIO16V2Output7", transformBrickletIO16V2Output7Callback0(channel, value, cfg));}}, this::removeMonoflopDoneListener));}
		if(cfg.pinConfiguration8 <= 1) {
this.addMonoflopDoneListener(this.reg((channel, value) -> {if(channel == 8) {updateStateFn.accept("BrickletIO16V2Output8", transformBrickletIO16V2Output8Callback0(channel, value, cfg));}}, this::removeMonoflopDoneListener));}
		if(cfg.pinConfiguration9 <= 1) {
this.addMonoflopDoneListener(this.reg((channel, value) -> {if(channel == 9) {updateStateFn.accept("BrickletIO16V2Output9", transformBrickletIO16V2Output9Callback0(channel, value, cfg));}}, this::removeMonoflopDoneListener));}
		if(cfg.pinConfiguration10 <= 1) {
this.addMonoflopDoneListener(this.reg((channel, value) -> {if(channel == 10) {updateStateFn.accept("BrickletIO16V2Output10", transformBrickletIO16V2Output10Callback0(channel, value, cfg));}}, this::removeMonoflopDoneListener));}
		if(cfg.pinConfiguration11 <= 1) {
this.addMonoflopDoneListener(this.reg((channel, value) -> {if(channel == 11) {updateStateFn.accept("BrickletIO16V2Output11", transformBrickletIO16V2Output11Callback0(channel, value, cfg));}}, this::removeMonoflopDoneListener));}
		if(cfg.pinConfiguration12 <= 1) {
this.addMonoflopDoneListener(this.reg((channel, value) -> {if(channel == 12) {updateStateFn.accept("BrickletIO16V2Output12", transformBrickletIO16V2Output12Callback0(channel, value, cfg));}}, this::removeMonoflopDoneListener));}
		if(cfg.pinConfiguration13 <= 1) {
this.addMonoflopDoneListener(this.reg((channel, value) -> {if(channel == 13) {updateStateFn.accept("BrickletIO16V2Output13", transformBrickletIO16V2Output13Callback0(channel, value, cfg));}}, this::removeMonoflopDoneListener));}
		if(cfg.pinConfiguration14 <= 1) {
this.addMonoflopDoneListener(this.reg((channel, value) -> {if(channel == 14) {updateStateFn.accept("BrickletIO16V2Output14", transformBrickletIO16V2Output14Callback0(channel, value, cfg));}}, this::removeMonoflopDoneListener));}
		if(cfg.pinConfiguration15 <= 1) {
this.addMonoflopDoneListener(this.reg((channel, value) -> {if(channel == 15) {updateStateFn.accept("BrickletIO16V2Output15", transformBrickletIO16V2Output15Callback0(channel, value, cfg));}}, this::removeMonoflopDoneListener));}
        
		this.setStatusLEDConfig(cfg.statusLEDConfig);
		if (cfg.pinConfiguration0 > 1) {
		BrickletIO16V2InputValueConfig channelCfg = getChannelConfigFn.apply("BrickletIO16V2Input0").as(BrickletIO16V2InputValueConfig.class);
		this.setConfiguration(0, 'i', cfg.pinConfiguration0 % 2 == 1);
		            this.setInputValueCallbackConfiguration(0, channelCfg.updateInterval, true);
		}
		if (cfg.pinConfiguration1 > 1) {
		BrickletIO16V2InputValueConfig channelCfg = getChannelConfigFn.apply("BrickletIO16V2Input1").as(BrickletIO16V2InputValueConfig.class);
		this.setConfiguration(1, 'i', cfg.pinConfiguration1 % 2 == 1);
		            this.setInputValueCallbackConfiguration(1, channelCfg.updateInterval, true);
		}
		if (cfg.pinConfiguration2 > 1) {
		BrickletIO16V2InputValueConfig channelCfg = getChannelConfigFn.apply("BrickletIO16V2Input2").as(BrickletIO16V2InputValueConfig.class);
		this.setConfiguration(2, 'i', cfg.pinConfiguration2 % 2 == 1);
		            this.setInputValueCallbackConfiguration(2, channelCfg.updateInterval, true);
		}
		if (cfg.pinConfiguration3 > 1) {
		BrickletIO16V2InputValueConfig channelCfg = getChannelConfigFn.apply("BrickletIO16V2Input3").as(BrickletIO16V2InputValueConfig.class);
		this.setConfiguration(3, 'i', cfg.pinConfiguration3 % 2 == 1);
		            this.setInputValueCallbackConfiguration(3, channelCfg.updateInterval, true);
		}
		if (cfg.pinConfiguration4 > 1) {
		BrickletIO16V2InputValueConfig channelCfg = getChannelConfigFn.apply("BrickletIO16V2Input4").as(BrickletIO16V2InputValueConfig.class);
		this.setConfiguration(4, 'i', cfg.pinConfiguration4 % 2 == 1);
		            this.setInputValueCallbackConfiguration(4, channelCfg.updateInterval, true);
		}
		if (cfg.pinConfiguration5 > 1) {
		BrickletIO16V2InputValueConfig channelCfg = getChannelConfigFn.apply("BrickletIO16V2Input5").as(BrickletIO16V2InputValueConfig.class);
		this.setConfiguration(5, 'i', cfg.pinConfiguration5 % 2 == 1);
		            this.setInputValueCallbackConfiguration(5, channelCfg.updateInterval, true);
		}
		if (cfg.pinConfiguration6 > 1) {
		BrickletIO16V2InputValueConfig channelCfg = getChannelConfigFn.apply("BrickletIO16V2Input6").as(BrickletIO16V2InputValueConfig.class);
		this.setConfiguration(6, 'i', cfg.pinConfiguration6 % 2 == 1);
		            this.setInputValueCallbackConfiguration(6, channelCfg.updateInterval, true);
		}
		if (cfg.pinConfiguration7 > 1) {
		BrickletIO16V2InputValueConfig channelCfg = getChannelConfigFn.apply("BrickletIO16V2Input7").as(BrickletIO16V2InputValueConfig.class);
		this.setConfiguration(7, 'i', cfg.pinConfiguration7 % 2 == 1);
		            this.setInputValueCallbackConfiguration(7, channelCfg.updateInterval, true);
		}
		if (cfg.pinConfiguration8 > 1) {
		BrickletIO16V2InputValueConfig channelCfg = getChannelConfigFn.apply("BrickletIO16V2Input8").as(BrickletIO16V2InputValueConfig.class);
		this.setConfiguration(8, 'i', cfg.pinConfiguration8 % 2 == 1);
		            this.setInputValueCallbackConfiguration(8, channelCfg.updateInterval, true);
		}
		if (cfg.pinConfiguration9 > 1) {
		BrickletIO16V2InputValueConfig channelCfg = getChannelConfigFn.apply("BrickletIO16V2Input9").as(BrickletIO16V2InputValueConfig.class);
		this.setConfiguration(9, 'i', cfg.pinConfiguration9 % 2 == 1);
		            this.setInputValueCallbackConfiguration(9, channelCfg.updateInterval, true);
		}
		if (cfg.pinConfiguration10 > 1) {
		BrickletIO16V2InputValueConfig channelCfg = getChannelConfigFn.apply("BrickletIO16V2Input10").as(BrickletIO16V2InputValueConfig.class);
		this.setConfiguration(10, 'i', cfg.pinConfiguration10 % 2 == 1);
		            this.setInputValueCallbackConfiguration(10, channelCfg.updateInterval, true);
		}
		if (cfg.pinConfiguration11 > 1) {
		BrickletIO16V2InputValueConfig channelCfg = getChannelConfigFn.apply("BrickletIO16V2Input11").as(BrickletIO16V2InputValueConfig.class);
		this.setConfiguration(11, 'i', cfg.pinConfiguration11 % 2 == 1);
		            this.setInputValueCallbackConfiguration(11, channelCfg.updateInterval, true);
		}
		if (cfg.pinConfiguration12 > 1) {
		BrickletIO16V2InputValueConfig channelCfg = getChannelConfigFn.apply("BrickletIO16V2Input12").as(BrickletIO16V2InputValueConfig.class);
		this.setConfiguration(12, 'i', cfg.pinConfiguration12 % 2 == 1);
		            this.setInputValueCallbackConfiguration(12, channelCfg.updateInterval, true);
		}
		if (cfg.pinConfiguration13 > 1) {
		BrickletIO16V2InputValueConfig channelCfg = getChannelConfigFn.apply("BrickletIO16V2Input13").as(BrickletIO16V2InputValueConfig.class);
		this.setConfiguration(13, 'i', cfg.pinConfiguration13 % 2 == 1);
		            this.setInputValueCallbackConfiguration(13, channelCfg.updateInterval, true);
		}
		if (cfg.pinConfiguration14 > 1) {
		BrickletIO16V2InputValueConfig channelCfg = getChannelConfigFn.apply("BrickletIO16V2Input14").as(BrickletIO16V2InputValueConfig.class);
		this.setConfiguration(14, 'i', cfg.pinConfiguration14 % 2 == 1);
		            this.setInputValueCallbackConfiguration(14, channelCfg.updateInterval, true);
		}
		if (cfg.pinConfiguration15 > 1) {
		BrickletIO16V2InputValueConfig channelCfg = getChannelConfigFn.apply("BrickletIO16V2Input15").as(BrickletIO16V2InputValueConfig.class);
		this.setConfiguration(15, 'i', cfg.pinConfiguration15 % 2 == 1);
		            this.setInputValueCallbackConfiguration(15, channelCfg.updateInterval, true);
		}
		if (cfg.pinConfiguration0 <= 1) {
		this.setConfiguration(0, 'o', cfg.pinConfiguration0 % 2 == 1);
		}
		if (cfg.pinConfiguration1 <= 1) {
		this.setConfiguration(1, 'o', cfg.pinConfiguration1 % 2 == 1);
		}
		if (cfg.pinConfiguration2 <= 1) {
		this.setConfiguration(2, 'o', cfg.pinConfiguration2 % 2 == 1);
		}
		if (cfg.pinConfiguration3 <= 1) {
		this.setConfiguration(3, 'o', cfg.pinConfiguration3 % 2 == 1);
		}
		if (cfg.pinConfiguration4 <= 1) {
		this.setConfiguration(4, 'o', cfg.pinConfiguration4 % 2 == 1);
		}
		if (cfg.pinConfiguration5 <= 1) {
		this.setConfiguration(5, 'o', cfg.pinConfiguration5 % 2 == 1);
		}
		if (cfg.pinConfiguration6 <= 1) {
		this.setConfiguration(6, 'o', cfg.pinConfiguration6 % 2 == 1);
		}
		if (cfg.pinConfiguration7 <= 1) {
		this.setConfiguration(7, 'o', cfg.pinConfiguration7 % 2 == 1);
		}
		if (cfg.pinConfiguration8 <= 1) {
		this.setConfiguration(8, 'o', cfg.pinConfiguration8 % 2 == 1);
		}
		if (cfg.pinConfiguration9 <= 1) {
		this.setConfiguration(9, 'o', cfg.pinConfiguration9 % 2 == 1);
		}
		if (cfg.pinConfiguration10 <= 1) {
		this.setConfiguration(10, 'o', cfg.pinConfiguration10 % 2 == 1);
		}
		if (cfg.pinConfiguration11 <= 1) {
		this.setConfiguration(11, 'o', cfg.pinConfiguration11 % 2 == 1);
		}
		if (cfg.pinConfiguration12 <= 1) {
		this.setConfiguration(12, 'o', cfg.pinConfiguration12 % 2 == 1);
		}
		if (cfg.pinConfiguration13 <= 1) {
		this.setConfiguration(13, 'o', cfg.pinConfiguration13 % 2 == 1);
		}
		if (cfg.pinConfiguration14 <= 1) {
		this.setConfiguration(14, 'o', cfg.pinConfiguration14 % 2 == 1);
		}
		if (cfg.pinConfiguration15 <= 1) {
		this.setConfiguration(15, 'o', cfg.pinConfiguration15 % 2 == 1);
		}
		if (cfg.pinConfiguration0 > 1) {
		BrickletIO16V2EdgeCountConfig channelCfg = getChannelConfigFn.apply("BrickletIO16V2EdgeCount0").as(BrickletIO16V2EdgeCountConfig.class);
		this.setEdgeCountConfiguration(0, channelCfg.edgeType, channelCfg.debounce);
		if(channelCfg.updateInterval > 0) {
    this.manualChannelUpdates.add(scheduler.scheduleWithFixedDelay(() -> {if(handler.getThing().getStatus() == ThingStatus.ONLINE) {handler.handleCommand(new ChannelUID(handler.getThing().getUID(), "BrickletIO16V2EdgeCount0"), RefreshType.REFRESH);}}, channelCfg.updateInterval, channelCfg.updateInterval, TimeUnit.MILLISECONDS));
}
		}
		if (cfg.pinConfiguration1 > 1) {
		BrickletIO16V2EdgeCountConfig channelCfg = getChannelConfigFn.apply("BrickletIO16V2EdgeCount1").as(BrickletIO16V2EdgeCountConfig.class);
		this.setEdgeCountConfiguration(1, channelCfg.edgeType, channelCfg.debounce);
		if(channelCfg.updateInterval > 0) {
    this.manualChannelUpdates.add(scheduler.scheduleWithFixedDelay(() -> {if(handler.getThing().getStatus() == ThingStatus.ONLINE) {handler.handleCommand(new ChannelUID(handler.getThing().getUID(), "BrickletIO16V2EdgeCount1"), RefreshType.REFRESH);}}, channelCfg.updateInterval, channelCfg.updateInterval, TimeUnit.MILLISECONDS));
}
		}
		if (cfg.pinConfiguration2 > 1) {
		BrickletIO16V2EdgeCountConfig channelCfg = getChannelConfigFn.apply("BrickletIO16V2EdgeCount2").as(BrickletIO16V2EdgeCountConfig.class);
		this.setEdgeCountConfiguration(2, channelCfg.edgeType, channelCfg.debounce);
		if(channelCfg.updateInterval > 0) {
    this.manualChannelUpdates.add(scheduler.scheduleWithFixedDelay(() -> {if(handler.getThing().getStatus() == ThingStatus.ONLINE) {handler.handleCommand(new ChannelUID(handler.getThing().getUID(), "BrickletIO16V2EdgeCount2"), RefreshType.REFRESH);}}, channelCfg.updateInterval, channelCfg.updateInterval, TimeUnit.MILLISECONDS));
}
		}
		if (cfg.pinConfiguration3 > 1) {
		BrickletIO16V2EdgeCountConfig channelCfg = getChannelConfigFn.apply("BrickletIO16V2EdgeCount3").as(BrickletIO16V2EdgeCountConfig.class);
		this.setEdgeCountConfiguration(3, channelCfg.edgeType, channelCfg.debounce);
		if(channelCfg.updateInterval > 0) {
    this.manualChannelUpdates.add(scheduler.scheduleWithFixedDelay(() -> {if(handler.getThing().getStatus() == ThingStatus.ONLINE) {handler.handleCommand(new ChannelUID(handler.getThing().getUID(), "BrickletIO16V2EdgeCount3"), RefreshType.REFRESH);}}, channelCfg.updateInterval, channelCfg.updateInterval, TimeUnit.MILLISECONDS));
}
		}
		if (cfg.pinConfiguration4 > 1) {
		BrickletIO16V2EdgeCountConfig channelCfg = getChannelConfigFn.apply("BrickletIO16V2EdgeCount4").as(BrickletIO16V2EdgeCountConfig.class);
		this.setEdgeCountConfiguration(4, channelCfg.edgeType, channelCfg.debounce);
		if(channelCfg.updateInterval > 0) {
    this.manualChannelUpdates.add(scheduler.scheduleWithFixedDelay(() -> {if(handler.getThing().getStatus() == ThingStatus.ONLINE) {handler.handleCommand(new ChannelUID(handler.getThing().getUID(), "BrickletIO16V2EdgeCount4"), RefreshType.REFRESH);}}, channelCfg.updateInterval, channelCfg.updateInterval, TimeUnit.MILLISECONDS));
}
		}
		if (cfg.pinConfiguration5 > 1) {
		BrickletIO16V2EdgeCountConfig channelCfg = getChannelConfigFn.apply("BrickletIO16V2EdgeCount5").as(BrickletIO16V2EdgeCountConfig.class);
		this.setEdgeCountConfiguration(5, channelCfg.edgeType, channelCfg.debounce);
		if(channelCfg.updateInterval > 0) {
    this.manualChannelUpdates.add(scheduler.scheduleWithFixedDelay(() -> {if(handler.getThing().getStatus() == ThingStatus.ONLINE) {handler.handleCommand(new ChannelUID(handler.getThing().getUID(), "BrickletIO16V2EdgeCount5"), RefreshType.REFRESH);}}, channelCfg.updateInterval, channelCfg.updateInterval, TimeUnit.MILLISECONDS));
}
		}
		if (cfg.pinConfiguration6 > 1) {
		BrickletIO16V2EdgeCountConfig channelCfg = getChannelConfigFn.apply("BrickletIO16V2EdgeCount6").as(BrickletIO16V2EdgeCountConfig.class);
		this.setEdgeCountConfiguration(6, channelCfg.edgeType, channelCfg.debounce);
		if(channelCfg.updateInterval > 0) {
    this.manualChannelUpdates.add(scheduler.scheduleWithFixedDelay(() -> {if(handler.getThing().getStatus() == ThingStatus.ONLINE) {handler.handleCommand(new ChannelUID(handler.getThing().getUID(), "BrickletIO16V2EdgeCount6"), RefreshType.REFRESH);}}, channelCfg.updateInterval, channelCfg.updateInterval, TimeUnit.MILLISECONDS));
}
		}
		if (cfg.pinConfiguration7 > 1) {
		BrickletIO16V2EdgeCountConfig channelCfg = getChannelConfigFn.apply("BrickletIO16V2EdgeCount7").as(BrickletIO16V2EdgeCountConfig.class);
		this.setEdgeCountConfiguration(7, channelCfg.edgeType, channelCfg.debounce);
		if(channelCfg.updateInterval > 0) {
    this.manualChannelUpdates.add(scheduler.scheduleWithFixedDelay(() -> {if(handler.getThing().getStatus() == ThingStatus.ONLINE) {handler.handleCommand(new ChannelUID(handler.getThing().getUID(), "BrickletIO16V2EdgeCount7"), RefreshType.REFRESH);}}, channelCfg.updateInterval, channelCfg.updateInterval, TimeUnit.MILLISECONDS));
}
		}
		if (cfg.pinConfiguration8 > 1) {
		BrickletIO16V2EdgeCountConfig channelCfg = getChannelConfigFn.apply("BrickletIO16V2EdgeCount8").as(BrickletIO16V2EdgeCountConfig.class);
		this.setEdgeCountConfiguration(8, channelCfg.edgeType, channelCfg.debounce);
		if(channelCfg.updateInterval > 0) {
    this.manualChannelUpdates.add(scheduler.scheduleWithFixedDelay(() -> {if(handler.getThing().getStatus() == ThingStatus.ONLINE) {handler.handleCommand(new ChannelUID(handler.getThing().getUID(), "BrickletIO16V2EdgeCount8"), RefreshType.REFRESH);}}, channelCfg.updateInterval, channelCfg.updateInterval, TimeUnit.MILLISECONDS));
}
		}
		if (cfg.pinConfiguration9 > 1) {
		BrickletIO16V2EdgeCountConfig channelCfg = getChannelConfigFn.apply("BrickletIO16V2EdgeCount9").as(BrickletIO16V2EdgeCountConfig.class);
		this.setEdgeCountConfiguration(9, channelCfg.edgeType, channelCfg.debounce);
		if(channelCfg.updateInterval > 0) {
    this.manualChannelUpdates.add(scheduler.scheduleWithFixedDelay(() -> {if(handler.getThing().getStatus() == ThingStatus.ONLINE) {handler.handleCommand(new ChannelUID(handler.getThing().getUID(), "BrickletIO16V2EdgeCount9"), RefreshType.REFRESH);}}, channelCfg.updateInterval, channelCfg.updateInterval, TimeUnit.MILLISECONDS));
}
		}
		if (cfg.pinConfiguration10 > 1) {
		BrickletIO16V2EdgeCountConfig channelCfg = getChannelConfigFn.apply("BrickletIO16V2EdgeCount10").as(BrickletIO16V2EdgeCountConfig.class);
		this.setEdgeCountConfiguration(10, channelCfg.edgeType, channelCfg.debounce);
		if(channelCfg.updateInterval > 0) {
    this.manualChannelUpdates.add(scheduler.scheduleWithFixedDelay(() -> {if(handler.getThing().getStatus() == ThingStatus.ONLINE) {handler.handleCommand(new ChannelUID(handler.getThing().getUID(), "BrickletIO16V2EdgeCount10"), RefreshType.REFRESH);}}, channelCfg.updateInterval, channelCfg.updateInterval, TimeUnit.MILLISECONDS));
}
		}
		if (cfg.pinConfiguration11 > 1) {
		BrickletIO16V2EdgeCountConfig channelCfg = getChannelConfigFn.apply("BrickletIO16V2EdgeCount11").as(BrickletIO16V2EdgeCountConfig.class);
		this.setEdgeCountConfiguration(11, channelCfg.edgeType, channelCfg.debounce);
		if(channelCfg.updateInterval > 0) {
    this.manualChannelUpdates.add(scheduler.scheduleWithFixedDelay(() -> {if(handler.getThing().getStatus() == ThingStatus.ONLINE) {handler.handleCommand(new ChannelUID(handler.getThing().getUID(), "BrickletIO16V2EdgeCount11"), RefreshType.REFRESH);}}, channelCfg.updateInterval, channelCfg.updateInterval, TimeUnit.MILLISECONDS));
}
		}
		if (cfg.pinConfiguration12 > 1) {
		BrickletIO16V2EdgeCountConfig channelCfg = getChannelConfigFn.apply("BrickletIO16V2EdgeCount12").as(BrickletIO16V2EdgeCountConfig.class);
		this.setEdgeCountConfiguration(12, channelCfg.edgeType, channelCfg.debounce);
		if(channelCfg.updateInterval > 0) {
    this.manualChannelUpdates.add(scheduler.scheduleWithFixedDelay(() -> {if(handler.getThing().getStatus() == ThingStatus.ONLINE) {handler.handleCommand(new ChannelUID(handler.getThing().getUID(), "BrickletIO16V2EdgeCount12"), RefreshType.REFRESH);}}, channelCfg.updateInterval, channelCfg.updateInterval, TimeUnit.MILLISECONDS));
}
		}
		if (cfg.pinConfiguration13 > 1) {
		BrickletIO16V2EdgeCountConfig channelCfg = getChannelConfigFn.apply("BrickletIO16V2EdgeCount13").as(BrickletIO16V2EdgeCountConfig.class);
		this.setEdgeCountConfiguration(13, channelCfg.edgeType, channelCfg.debounce);
		if(channelCfg.updateInterval > 0) {
    this.manualChannelUpdates.add(scheduler.scheduleWithFixedDelay(() -> {if(handler.getThing().getStatus() == ThingStatus.ONLINE) {handler.handleCommand(new ChannelUID(handler.getThing().getUID(), "BrickletIO16V2EdgeCount13"), RefreshType.REFRESH);}}, channelCfg.updateInterval, channelCfg.updateInterval, TimeUnit.MILLISECONDS));
}
		}
		if (cfg.pinConfiguration14 > 1) {
		BrickletIO16V2EdgeCountConfig channelCfg = getChannelConfigFn.apply("BrickletIO16V2EdgeCount14").as(BrickletIO16V2EdgeCountConfig.class);
		this.setEdgeCountConfiguration(14, channelCfg.edgeType, channelCfg.debounce);
		if(channelCfg.updateInterval > 0) {
    this.manualChannelUpdates.add(scheduler.scheduleWithFixedDelay(() -> {if(handler.getThing().getStatus() == ThingStatus.ONLINE) {handler.handleCommand(new ChannelUID(handler.getThing().getUID(), "BrickletIO16V2EdgeCount14"), RefreshType.REFRESH);}}, channelCfg.updateInterval, channelCfg.updateInterval, TimeUnit.MILLISECONDS));
}
		}
		if (cfg.pinConfiguration15 > 1) {
		BrickletIO16V2EdgeCountConfig channelCfg = getChannelConfigFn.apply("BrickletIO16V2EdgeCount15").as(BrickletIO16V2EdgeCountConfig.class);
		this.setEdgeCountConfiguration(15, channelCfg.edgeType, channelCfg.debounce);
		if(channelCfg.updateInterval > 0) {
    this.manualChannelUpdates.add(scheduler.scheduleWithFixedDelay(() -> {if(handler.getThing().getStatus() == ThingStatus.ONLINE) {handler.handleCommand(new ChannelUID(handler.getThing().getUID(), "BrickletIO16V2EdgeCount15"), 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);

        BrickletIO16V2Config cfg = (BrickletIO16V2Config) config.as(BrickletIO16V2Config.class);
        if(cfg.pinConfiguration0 > 1) {
this.setInputValueCallbackConfiguration(0, 0, false);}
		if(cfg.pinConfiguration1 > 1) {
this.setInputValueCallbackConfiguration(1, 0, false);}
		if(cfg.pinConfiguration2 > 1) {
this.setInputValueCallbackConfiguration(2, 0, false);}
		if(cfg.pinConfiguration3 > 1) {
this.setInputValueCallbackConfiguration(3, 0, false);}
		if(cfg.pinConfiguration4 > 1) {
this.setInputValueCallbackConfiguration(4, 0, false);}
		if(cfg.pinConfiguration5 > 1) {
this.setInputValueCallbackConfiguration(5, 0, false);}
		if(cfg.pinConfiguration6 > 1) {
this.setInputValueCallbackConfiguration(6, 0, false);}
		if(cfg.pinConfiguration7 > 1) {
this.setInputValueCallbackConfiguration(7, 0, false);}
		if(cfg.pinConfiguration8 > 1) {
this.setInputValueCallbackConfiguration(8, 0, false);}
		if(cfg.pinConfiguration9 > 1) {
this.setInputValueCallbackConfiguration(9, 0, false);}
		if(cfg.pinConfiguration10 > 1) {
this.setInputValueCallbackConfiguration(10, 0, false);}
		if(cfg.pinConfiguration11 > 1) {
this.setInputValueCallbackConfiguration(11, 0, false);}
		if(cfg.pinConfiguration12 > 1) {
this.setInputValueCallbackConfiguration(12, 0, false);}
		if(cfg.pinConfiguration13 > 1) {
this.setInputValueCallbackConfiguration(13, 0, false);}
		if(cfg.pinConfiguration14 > 1) {
this.setInputValueCallbackConfiguration(14, 0, false);}
		if(cfg.pinConfiguration15 > 1) {
this.setInputValueCallbackConfiguration(15, 0, false);}
		
    }

    @Override
    public List<String> getEnabledChannels(org.eclipse.smarthome.config.core.Configuration config) throws TinkerforgeException{
        BrickletIO16V2Config cfg = (BrickletIO16V2Config) config.as(BrickletIO16V2Config.class);
List<String> result = new ArrayList<String>();
        if (cfg.pinConfiguration0 > 1) {
                result.add("BrickletIO16V2Input0");
            }
		if (cfg.pinConfiguration1 > 1) {
                result.add("BrickletIO16V2Input1");
            }
		if (cfg.pinConfiguration2 > 1) {
                result.add("BrickletIO16V2Input2");
            }
		if (cfg.pinConfiguration3 > 1) {
                result.add("BrickletIO16V2Input3");
            }
		if (cfg.pinConfiguration4 > 1) {
                result.add("BrickletIO16V2Input4");
            }
		if (cfg.pinConfiguration5 > 1) {
                result.add("BrickletIO16V2Input5");
            }
		if (cfg.pinConfiguration6 > 1) {
                result.add("BrickletIO16V2Input6");
            }
		if (cfg.pinConfiguration7 > 1) {
                result.add("BrickletIO16V2Input7");
            }
		if (cfg.pinConfiguration8 > 1) {
                result.add("BrickletIO16V2Input8");
            }
		if (cfg.pinConfiguration9 > 1) {
                result.add("BrickletIO16V2Input9");
            }
		if (cfg.pinConfiguration10 > 1) {
                result.add("BrickletIO16V2Input10");
            }
		if (cfg.pinConfiguration11 > 1) {
                result.add("BrickletIO16V2Input11");
            }
		if (cfg.pinConfiguration12 > 1) {
                result.add("BrickletIO16V2Input12");
            }
		if (cfg.pinConfiguration13 > 1) {
                result.add("BrickletIO16V2Input13");
            }
		if (cfg.pinConfiguration14 > 1) {
                result.add("BrickletIO16V2Input14");
            }
		if (cfg.pinConfiguration15 > 1) {
                result.add("BrickletIO16V2Input15");
            }
		if (cfg.pinConfiguration0 <= 1) {
                result.add("BrickletIO16V2Output0");
            }
		if (cfg.pinConfiguration1 <= 1) {
                result.add("BrickletIO16V2Output1");
            }
		if (cfg.pinConfiguration2 <= 1) {
                result.add("BrickletIO16V2Output2");
            }
		if (cfg.pinConfiguration3 <= 1) {
                result.add("BrickletIO16V2Output3");
            }
		if (cfg.pinConfiguration4 <= 1) {
                result.add("BrickletIO16V2Output4");
            }
		if (cfg.pinConfiguration5 <= 1) {
                result.add("BrickletIO16V2Output5");
            }
		if (cfg.pinConfiguration6 <= 1) {
                result.add("BrickletIO16V2Output6");
            }
		if (cfg.pinConfiguration7 <= 1) {
                result.add("BrickletIO16V2Output7");
            }
		if (cfg.pinConfiguration8 <= 1) {
                result.add("BrickletIO16V2Output8");
            }
		if (cfg.pinConfiguration9 <= 1) {
                result.add("BrickletIO16V2Output9");
            }
		if (cfg.pinConfiguration10 <= 1) {
                result.add("BrickletIO16V2Output10");
            }
		if (cfg.pinConfiguration11 <= 1) {
                result.add("BrickletIO16V2Output11");
            }
		if (cfg.pinConfiguration12 <= 1) {
                result.add("BrickletIO16V2Output12");
            }
		if (cfg.pinConfiguration13 <= 1) {
                result.add("BrickletIO16V2Output13");
            }
		if (cfg.pinConfiguration14 <= 1) {
                result.add("BrickletIO16V2Output14");
            }
		if (cfg.pinConfiguration15 <= 1) {
                result.add("BrickletIO16V2Output15");
            }
		if (cfg.pinConfiguration0 <= 1) {
                result.add("BrickletIO16V2Monoflop0");
            }
		if (cfg.pinConfiguration1 <= 1) {
                result.add("BrickletIO16V2Monoflop1");
            }
		if (cfg.pinConfiguration2 <= 1) {
                result.add("BrickletIO16V2Monoflop2");
            }
		if (cfg.pinConfiguration3 <= 1) {
                result.add("BrickletIO16V2Monoflop3");
            }
		if (cfg.pinConfiguration4 <= 1) {
                result.add("BrickletIO16V2Monoflop4");
            }
		if (cfg.pinConfiguration5 <= 1) {
                result.add("BrickletIO16V2Monoflop5");
            }
		if (cfg.pinConfiguration6 <= 1) {
                result.add("BrickletIO16V2Monoflop6");
            }
		if (cfg.pinConfiguration7 <= 1) {
                result.add("BrickletIO16V2Monoflop7");
            }
		if (cfg.pinConfiguration8 <= 1) {
                result.add("BrickletIO16V2Monoflop8");
            }
		if (cfg.pinConfiguration9 <= 1) {
                result.add("BrickletIO16V2Monoflop9");
            }
		if (cfg.pinConfiguration10 <= 1) {
                result.add("BrickletIO16V2Monoflop10");
            }
		if (cfg.pinConfiguration11 <= 1) {
                result.add("BrickletIO16V2Monoflop11");
            }
		if (cfg.pinConfiguration12 <= 1) {
                result.add("BrickletIO16V2Monoflop12");
            }
		if (cfg.pinConfiguration13 <= 1) {
                result.add("BrickletIO16V2Monoflop13");
            }
		if (cfg.pinConfiguration14 <= 1) {
                result.add("BrickletIO16V2Monoflop14");
            }
		if (cfg.pinConfiguration15 <= 1) {
                result.add("BrickletIO16V2Monoflop15");
            }
		if (cfg.pinConfiguration0 > 1) {
                result.add("BrickletIO16V2EdgeCount0");
            }
		if (cfg.pinConfiguration1 > 1) {
                result.add("BrickletIO16V2EdgeCount1");
            }
		if (cfg.pinConfiguration2 > 1) {
                result.add("BrickletIO16V2EdgeCount2");
            }
		if (cfg.pinConfiguration3 > 1) {
                result.add("BrickletIO16V2EdgeCount3");
            }
		if (cfg.pinConfiguration4 > 1) {
                result.add("BrickletIO16V2EdgeCount4");
            }
		if (cfg.pinConfiguration5 > 1) {
                result.add("BrickletIO16V2EdgeCount5");
            }
		if (cfg.pinConfiguration6 > 1) {
                result.add("BrickletIO16V2EdgeCount6");
            }
		if (cfg.pinConfiguration7 > 1) {
                result.add("BrickletIO16V2EdgeCount7");
            }
		if (cfg.pinConfiguration8 > 1) {
                result.add("BrickletIO16V2EdgeCount8");
            }
		if (cfg.pinConfiguration9 > 1) {
                result.add("BrickletIO16V2EdgeCount9");
            }
		if (cfg.pinConfiguration10 > 1) {
                result.add("BrickletIO16V2EdgeCount10");
            }
		if (cfg.pinConfiguration11 > 1) {
                result.add("BrickletIO16V2EdgeCount11");
            }
		if (cfg.pinConfiguration12 > 1) {
                result.add("BrickletIO16V2EdgeCount12");
            }
		if (cfg.pinConfiguration13 > 1) {
                result.add("BrickletIO16V2EdgeCount13");
            }
		if (cfg.pinConfiguration14 > 1) {
                result.add("BrickletIO16V2EdgeCount14");
            }
		if (cfg.pinConfiguration15 > 1) {
                result.add("BrickletIO16V2EdgeCount15");
            }
        return result;
    }

    public static @Nullable ChannelType getChannelType(ChannelTypeUID channelTypeUID) {
        switch(channelTypeUID.getId()) {
            case "BrickletIO16V2InputValue":
                return ChannelTypeBuilder.state(new ChannelTypeUID("tinkerforge", "BrickletIO16V2InputValue"), "NOT USED", "Contact").withConfigDescriptionURI(URI.create("channel-type:tinkerforge:BrickletIO16V2InputValue")).withDescription("The logic level that is currently measured on the pin.").build();
            case "BrickletIO16V2OutputPin":
                return ChannelTypeBuilder.state(new ChannelTypeUID("tinkerforge", "BrickletIO16V2OutputPin"), "NOT USED", "Switch").withConfigDescriptionURI(URI.create("channel-type:tinkerforge:BrickletIO16V2OutputPin")).withDescription("The logic level that is currently set on the pin.").build();
            case "BrickletIO16V2Monoflop":
                return ChannelTypeBuilder.state(new ChannelTypeUID("tinkerforge", "BrickletIO16V2Monoflop"), "NOT USED", "String").withConfigDescriptionURI(URI.create("channel-type:tinkerforge:BrickletIO16V2Monoflop")).withDescription("Triggers a monoflop as configured.")
.withCommandDescription(CommandDescriptionBuilder.create().withCommandOption(new CommandOption("TRIGGER", "Trigger")).build()).build();
            case "BrickletIO16V2EdgeCount":
                return ChannelTypeBuilder.state(new ChannelTypeUID("tinkerforge", "BrickletIO16V2EdgeCount"), "NOT USED", "Number:Dimensionless").withConfigDescriptionURI(URI.create("channel-type:tinkerforge:BrickletIO16V2EdgeCount")).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 2.0").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("BrickletIO16V2Input0", new ChannelTypeUID("tinkerforge", "BrickletIO16V2InputValue")).withLabel("Input Value 0").build(), new ChannelDefinitionBuilder("BrickletIO16V2Input1", new ChannelTypeUID("tinkerforge", "BrickletIO16V2InputValue")).withLabel("Input Value 1").build(), new ChannelDefinitionBuilder("BrickletIO16V2Input2", new ChannelTypeUID("tinkerforge", "BrickletIO16V2InputValue")).withLabel("Input Value 2").build(), new ChannelDefinitionBuilder("BrickletIO16V2Input3", new ChannelTypeUID("tinkerforge", "BrickletIO16V2InputValue")).withLabel("Input Value 3").build(), new ChannelDefinitionBuilder("BrickletIO16V2Input4", new ChannelTypeUID("tinkerforge", "BrickletIO16V2InputValue")).withLabel("Input Value 4").build(), new ChannelDefinitionBuilder("BrickletIO16V2Input5", new ChannelTypeUID("tinkerforge", "BrickletIO16V2InputValue")).withLabel("Input Value 5").build(), new ChannelDefinitionBuilder("BrickletIO16V2Input6", new ChannelTypeUID("tinkerforge", "BrickletIO16V2InputValue")).withLabel("Input Value 6").build(), new ChannelDefinitionBuilder("BrickletIO16V2Input7", new ChannelTypeUID("tinkerforge", "BrickletIO16V2InputValue")).withLabel("Input Value 7").build(), new ChannelDefinitionBuilder("BrickletIO16V2Input8", new ChannelTypeUID("tinkerforge", "BrickletIO16V2InputValue")).withLabel("Input Value 8").build(), new ChannelDefinitionBuilder("BrickletIO16V2Input9", new ChannelTypeUID("tinkerforge", "BrickletIO16V2InputValue")).withLabel("Input Value 9").build(), new ChannelDefinitionBuilder("BrickletIO16V2Input10", new ChannelTypeUID("tinkerforge", "BrickletIO16V2InputValue")).withLabel("Input Value 10").build(), new ChannelDefinitionBuilder("BrickletIO16V2Input11", new ChannelTypeUID("tinkerforge", "BrickletIO16V2InputValue")).withLabel("Input Value 11").build(), new ChannelDefinitionBuilder("BrickletIO16V2Input12", new ChannelTypeUID("tinkerforge", "BrickletIO16V2InputValue")).withLabel("Input Value 12").build(), new ChannelDefinitionBuilder("BrickletIO16V2Input13", new ChannelTypeUID("tinkerforge", "BrickletIO16V2InputValue")).withLabel("Input Value 13").build(), new ChannelDefinitionBuilder("BrickletIO16V2Input14", new ChannelTypeUID("tinkerforge", "BrickletIO16V2InputValue")).withLabel("Input Value 14").build(), new ChannelDefinitionBuilder("BrickletIO16V2Input15", new ChannelTypeUID("tinkerforge", "BrickletIO16V2InputValue")).withLabel("Input Value 15").build(), new ChannelDefinitionBuilder("BrickletIO16V2Output0", new ChannelTypeUID("tinkerforge", "BrickletIO16V2OutputPin")).withLabel("Output Value 0").build(), new ChannelDefinitionBuilder("BrickletIO16V2Output1", new ChannelTypeUID("tinkerforge", "BrickletIO16V2OutputPin")).withLabel("Output Value 1").build(), new ChannelDefinitionBuilder("BrickletIO16V2Output2", new ChannelTypeUID("tinkerforge", "BrickletIO16V2OutputPin")).withLabel("Output Value 2").build(), new ChannelDefinitionBuilder("BrickletIO16V2Output3", new ChannelTypeUID("tinkerforge", "BrickletIO16V2OutputPin")).withLabel("Output Value 3").build(), new ChannelDefinitionBuilder("BrickletIO16V2Output4", new ChannelTypeUID("tinkerforge", "BrickletIO16V2OutputPin")).withLabel("Output Value 4").build(), new ChannelDefinitionBuilder("BrickletIO16V2Output5", new ChannelTypeUID("tinkerforge", "BrickletIO16V2OutputPin")).withLabel("Output Value 5").build(), new ChannelDefinitionBuilder("BrickletIO16V2Output6", new ChannelTypeUID("tinkerforge", "BrickletIO16V2OutputPin")).withLabel("Output Value 6").build(), new ChannelDefinitionBuilder("BrickletIO16V2Output7", new ChannelTypeUID("tinkerforge", "BrickletIO16V2OutputPin")).withLabel("Output Value 7").build(), new ChannelDefinitionBuilder("BrickletIO16V2Output8", new ChannelTypeUID("tinkerforge", "BrickletIO16V2OutputPin")).withLabel("Output Value 8").build(), new ChannelDefinitionBuilder("BrickletIO16V2Output9", new ChannelTypeUID("tinkerforge", "BrickletIO16V2OutputPin")).withLabel("Output Value 9").build(), new ChannelDefinitionBuilder("BrickletIO16V2Output10", new ChannelTypeUID("tinkerforge", "BrickletIO16V2OutputPin")).withLabel("Output Value 10").build(), new ChannelDefinitionBuilder("BrickletIO16V2Output11", new ChannelTypeUID("tinkerforge", "BrickletIO16V2OutputPin")).withLabel("Output Value 11").build(), new ChannelDefinitionBuilder("BrickletIO16V2Output12", new ChannelTypeUID("tinkerforge", "BrickletIO16V2OutputPin")).withLabel("Output Value 12").build(), new ChannelDefinitionBuilder("BrickletIO16V2Output13", new ChannelTypeUID("tinkerforge", "BrickletIO16V2OutputPin")).withLabel("Output Value 13").build(), new ChannelDefinitionBuilder("BrickletIO16V2Output14", new ChannelTypeUID("tinkerforge", "BrickletIO16V2OutputPin")).withLabel("Output Value 14").build(), new ChannelDefinitionBuilder("BrickletIO16V2Output15", new ChannelTypeUID("tinkerforge", "BrickletIO16V2OutputPin")).withLabel("Output Value 15").build(), new ChannelDefinitionBuilder("BrickletIO16V2Monoflop0", new ChannelTypeUID("tinkerforge", "BrickletIO16V2Monoflop")).withLabel("Monoflop 0").build(), new ChannelDefinitionBuilder("BrickletIO16V2Monoflop1", new ChannelTypeUID("tinkerforge", "BrickletIO16V2Monoflop")).withLabel("Monoflop 1").build(), new ChannelDefinitionBuilder("BrickletIO16V2Monoflop2", new ChannelTypeUID("tinkerforge", "BrickletIO16V2Monoflop")).withLabel("Monoflop 2").build(), new ChannelDefinitionBuilder("BrickletIO16V2Monoflop3", new ChannelTypeUID("tinkerforge", "BrickletIO16V2Monoflop")).withLabel("Monoflop 3").build(), new ChannelDefinitionBuilder("BrickletIO16V2Monoflop4", new ChannelTypeUID("tinkerforge", "BrickletIO16V2Monoflop")).withLabel("Monoflop 4").build(), new ChannelDefinitionBuilder("BrickletIO16V2Monoflop5", new ChannelTypeUID("tinkerforge", "BrickletIO16V2Monoflop")).withLabel("Monoflop 5").build(), new ChannelDefinitionBuilder("BrickletIO16V2Monoflop6", new ChannelTypeUID("tinkerforge", "BrickletIO16V2Monoflop")).withLabel("Monoflop 6").build(), new ChannelDefinitionBuilder("BrickletIO16V2Monoflop7", new ChannelTypeUID("tinkerforge", "BrickletIO16V2Monoflop")).withLabel("Monoflop 7").build(), new ChannelDefinitionBuilder("BrickletIO16V2Monoflop8", new ChannelTypeUID("tinkerforge", "BrickletIO16V2Monoflop")).withLabel("Monoflop 8").build(), new ChannelDefinitionBuilder("BrickletIO16V2Monoflop9", new ChannelTypeUID("tinkerforge", "BrickletIO16V2Monoflop")).withLabel("Monoflop 9").build(), new ChannelDefinitionBuilder("BrickletIO16V2Monoflop10", new ChannelTypeUID("tinkerforge", "BrickletIO16V2Monoflop")).withLabel("Monoflop 10").build(), new ChannelDefinitionBuilder("BrickletIO16V2Monoflop11", new ChannelTypeUID("tinkerforge", "BrickletIO16V2Monoflop")).withLabel("Monoflop 11").build(), new ChannelDefinitionBuilder("BrickletIO16V2Monoflop12", new ChannelTypeUID("tinkerforge", "BrickletIO16V2Monoflop")).withLabel("Monoflop 12").build(), new ChannelDefinitionBuilder("BrickletIO16V2Monoflop13", new ChannelTypeUID("tinkerforge", "BrickletIO16V2Monoflop")).withLabel("Monoflop 13").build(), new ChannelDefinitionBuilder("BrickletIO16V2Monoflop14", new ChannelTypeUID("tinkerforge", "BrickletIO16V2Monoflop")).withLabel("Monoflop 14").build(), new ChannelDefinitionBuilder("BrickletIO16V2Monoflop15", new ChannelTypeUID("tinkerforge", "BrickletIO16V2Monoflop")).withLabel("Monoflop 15").build(), new ChannelDefinitionBuilder("BrickletIO16V2EdgeCount0", new ChannelTypeUID("tinkerforge", "BrickletIO16V2EdgeCount")).withLabel("Edge Count 0").build(), new ChannelDefinitionBuilder("BrickletIO16V2EdgeCount1", new ChannelTypeUID("tinkerforge", "BrickletIO16V2EdgeCount")).withLabel("Edge Count 1").build(), new ChannelDefinitionBuilder("BrickletIO16V2EdgeCount2", new ChannelTypeUID("tinkerforge", "BrickletIO16V2EdgeCount")).withLabel("Edge Count 2").build(), new ChannelDefinitionBuilder("BrickletIO16V2EdgeCount3", new ChannelTypeUID("tinkerforge", "BrickletIO16V2EdgeCount")).withLabel("Edge Count 3").build(), new ChannelDefinitionBuilder("BrickletIO16V2EdgeCount4", new ChannelTypeUID("tinkerforge", "BrickletIO16V2EdgeCount")).withLabel("Edge Count 4").build(), new ChannelDefinitionBuilder("BrickletIO16V2EdgeCount5", new ChannelTypeUID("tinkerforge", "BrickletIO16V2EdgeCount")).withLabel("Edge Count 5").build(), new ChannelDefinitionBuilder("BrickletIO16V2EdgeCount6", new ChannelTypeUID("tinkerforge", "BrickletIO16V2EdgeCount")).withLabel("Edge Count 6").build(), new ChannelDefinitionBuilder("BrickletIO16V2EdgeCount7", new ChannelTypeUID("tinkerforge", "BrickletIO16V2EdgeCount")).withLabel("Edge Count 7").build(), new ChannelDefinitionBuilder("BrickletIO16V2EdgeCount8", new ChannelTypeUID("tinkerforge", "BrickletIO16V2EdgeCount")).withLabel("Edge Count 8").build(), new ChannelDefinitionBuilder("BrickletIO16V2EdgeCount9", new ChannelTypeUID("tinkerforge", "BrickletIO16V2EdgeCount")).withLabel("Edge Count 9").build(), new ChannelDefinitionBuilder("BrickletIO16V2EdgeCount10", new ChannelTypeUID("tinkerforge", "BrickletIO16V2EdgeCount")).withLabel("Edge Count 10").build(), new ChannelDefinitionBuilder("BrickletIO16V2EdgeCount11", new ChannelTypeUID("tinkerforge", "BrickletIO16V2EdgeCount")).withLabel("Edge Count 11").build(), new ChannelDefinitionBuilder("BrickletIO16V2EdgeCount12", new ChannelTypeUID("tinkerforge", "BrickletIO16V2EdgeCount")).withLabel("Edge Count 12").build(), new ChannelDefinitionBuilder("BrickletIO16V2EdgeCount13", new ChannelTypeUID("tinkerforge", "BrickletIO16V2EdgeCount")).withLabel("Edge Count 13").build(), new ChannelDefinitionBuilder("BrickletIO16V2EdgeCount14", new ChannelTypeUID("tinkerforge", "BrickletIO16V2EdgeCount")).withLabel("Edge Count 14").build(), new ChannelDefinitionBuilder("BrickletIO16V2EdgeCount15", new ChannelTypeUID("tinkerforge", "BrickletIO16V2EdgeCount")).withLabel("Edge Count 15").build())).withProperties(props).build();
    }

    public static @Nullable ConfigDescription getConfigDescription(URI uri) {
        switch(uri.toASCIIString()) {
            case "thing-type:tinkerforge:brickletio16v2":
                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(), ConfigDescriptionParameterBuilder.create("statusLEDConfig", Type.INTEGER).withDefault("3").withDescription("The status LED configuration. By default the LED shows communication traffic between Brick and Bricklet, it flickers once for every 10 received data packets.<br/><br/>You can also turn the LED permanently on/off or show a heartbeat.<br/><br/>If the Bricklet is in bootloader mode, the LED is will show heartbeat by default.").withLabel("Status LED Configuration").withAdvanced(true).withLimitToOptions(true).withOptions(Arrays.asList(new ParameterOption("0", "Off"), new ParameterOption("1", "On"), new ParameterOption("2", "Show Heartbeat"), new ParameterOption("3", "Show Status"))).build())).withParameterGroups(Arrays.asList()).build();
            case "channel-type:tinkerforge:BrickletIO16V2InputValue":
                return ConfigDescriptionBuilder.create(uri).withParameters(Arrays.asList(ConfigDescriptionParameterBuilder.create("updateInterval", Type.INTEGER).withDefault("1000").withDescription("Specifies the update interval in milliseconds. A value of 0 disables automatic updates.").withGroupName("update_intervals").withLabel("Update Interval").withUnit("ms").withMinimum(BigDecimal.valueOf(0)).withMaximum(BigDecimal.valueOf(4294967295L)).build())).withParameterGroups(Arrays.asList()).build();
            case "channel-type:tinkerforge:BrickletIO16V2OutputPin":
                return ConfigDescriptionBuilder.create(uri).withParameters(Arrays.asList()).withParameterGroups(Arrays.asList()).build();
            case "channel-type:tinkerforge:BrickletIO16V2Monoflop":
                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:BrickletIO16V2EdgeCount":
                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").withAdvanced(true).withMinimum(BigDecimal.valueOf(0)).withMaximum(BigDecimal.valueOf(255)).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").withAdvanced(true).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 {
        BrickletIO16V2Config cfg = (BrickletIO16V2Config) config.as(BrickletIO16V2Config.class);
switch(channel) {
            case "BrickletIO16V2Input0":
                   {
            boolean[] value = this.getValue();
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Input0Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Input1":
                   {
            boolean[] value = this.getValue();
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Input1Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Input2":
                   {
            boolean[] value = this.getValue();
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Input2Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Input3":
                   {
            boolean[] value = this.getValue();
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Input3Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Input4":
                   {
            boolean[] value = this.getValue();
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Input4Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Input5":
                   {
            boolean[] value = this.getValue();
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Input5Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Input6":
                   {
            boolean[] value = this.getValue();
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Input6Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Input7":
                   {
            boolean[] value = this.getValue();
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Input7Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Input8":
                   {
            boolean[] value = this.getValue();
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Input8Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Input9":
                   {
            boolean[] value = this.getValue();
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Input9Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Input10":
                   {
            boolean[] value = this.getValue();
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Input10Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Input11":
                   {
            boolean[] value = this.getValue();
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Input11Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Input12":
                   {
            boolean[] value = this.getValue();
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Input12Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Input13":
                   {
            boolean[] value = this.getValue();
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Input13Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Input14":
                   {
            boolean[] value = this.getValue();
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Input14Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Input15":
                   {
            boolean[] value = this.getValue();
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Input15Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Output0":
                   {
            boolean[] value = this.getValue();
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Output0Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Output1":
                   {
            boolean[] value = this.getValue();
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Output1Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Output2":
                   {
            boolean[] value = this.getValue();
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Output2Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Output3":
                   {
            boolean[] value = this.getValue();
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Output3Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Output4":
                   {
            boolean[] value = this.getValue();
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Output4Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Output5":
                   {
            boolean[] value = this.getValue();
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Output5Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Output6":
                   {
            boolean[] value = this.getValue();
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Output6Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Output7":
                   {
            boolean[] value = this.getValue();
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Output7Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Output8":
                   {
            boolean[] value = this.getValue();
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Output8Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Output9":
                   {
            boolean[] value = this.getValue();
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Output9Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Output10":
                   {
            boolean[] value = this.getValue();
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Output10Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Output11":
                   {
            boolean[] value = this.getValue();
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Output11Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Output12":
                   {
            boolean[] value = this.getValue();
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Output12Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Output13":
                   {
            boolean[] value = this.getValue();
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Output13Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Output14":
                   {
            boolean[] value = this.getValue();
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Output14Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Output15":
                   {
            boolean[] value = this.getValue();
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Output15Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Monoflop0":
                   {
            BrickletIO16V2.Monoflop value = this.getMonoflop(0);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Monoflop0Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Monoflop1":
                   {
            BrickletIO16V2.Monoflop value = this.getMonoflop(1);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Monoflop1Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Monoflop2":
                   {
            BrickletIO16V2.Monoflop value = this.getMonoflop(2);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Monoflop2Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Monoflop3":
                   {
            BrickletIO16V2.Monoflop value = this.getMonoflop(3);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Monoflop3Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Monoflop4":
                   {
            BrickletIO16V2.Monoflop value = this.getMonoflop(4);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Monoflop4Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Monoflop5":
                   {
            BrickletIO16V2.Monoflop value = this.getMonoflop(5);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Monoflop5Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Monoflop6":
                   {
            BrickletIO16V2.Monoflop value = this.getMonoflop(6);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Monoflop6Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Monoflop7":
                   {
            BrickletIO16V2.Monoflop value = this.getMonoflop(7);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Monoflop7Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Monoflop8":
                   {
            BrickletIO16V2.Monoflop value = this.getMonoflop(8);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Monoflop8Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Monoflop9":
                   {
            BrickletIO16V2.Monoflop value = this.getMonoflop(9);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Monoflop9Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Monoflop10":
                   {
            BrickletIO16V2.Monoflop value = this.getMonoflop(10);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Monoflop10Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Monoflop11":
                   {
            BrickletIO16V2.Monoflop value = this.getMonoflop(11);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Monoflop11Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Monoflop12":
                   {
            BrickletIO16V2.Monoflop value = this.getMonoflop(12);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Monoflop12Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Monoflop13":
                   {
            BrickletIO16V2.Monoflop value = this.getMonoflop(13);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Monoflop13Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Monoflop14":
                   {
            BrickletIO16V2.Monoflop value = this.getMonoflop(14);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Monoflop14Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2Monoflop15":
                   {
            BrickletIO16V2.Monoflop value = this.getMonoflop(15);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2Monoflop15Getter0(value, cfg));
        }
                   return;
            case "BrickletIO16V2EdgeCount0": {
                   BrickletIO16V2EdgeCountConfig channelCfg = channelConfig.as(BrickletIO16V2EdgeCountConfig.class);
                   {
            long value = this.getEdgeCount(0, channelCfg.resetOnRead);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2EdgeCount0Getter0(value, cfg));
        }
                   return;
               }
            case "BrickletIO16V2EdgeCount1": {
                   BrickletIO16V2EdgeCountConfig channelCfg = channelConfig.as(BrickletIO16V2EdgeCountConfig.class);
                   {
            long value = this.getEdgeCount(1, channelCfg.resetOnRead);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2EdgeCount1Getter0(value, cfg));
        }
                   return;
               }
            case "BrickletIO16V2EdgeCount2": {
                   BrickletIO16V2EdgeCountConfig channelCfg = channelConfig.as(BrickletIO16V2EdgeCountConfig.class);
                   {
            long value = this.getEdgeCount(2, channelCfg.resetOnRead);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2EdgeCount2Getter0(value, cfg));
        }
                   return;
               }
            case "BrickletIO16V2EdgeCount3": {
                   BrickletIO16V2EdgeCountConfig channelCfg = channelConfig.as(BrickletIO16V2EdgeCountConfig.class);
                   {
            long value = this.getEdgeCount(3, channelCfg.resetOnRead);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2EdgeCount3Getter0(value, cfg));
        }
                   return;
               }
            case "BrickletIO16V2EdgeCount4": {
                   BrickletIO16V2EdgeCountConfig channelCfg = channelConfig.as(BrickletIO16V2EdgeCountConfig.class);
                   {
            long value = this.getEdgeCount(4, channelCfg.resetOnRead);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2EdgeCount4Getter0(value, cfg));
        }
                   return;
               }
            case "BrickletIO16V2EdgeCount5": {
                   BrickletIO16V2EdgeCountConfig channelCfg = channelConfig.as(BrickletIO16V2EdgeCountConfig.class);
                   {
            long value = this.getEdgeCount(5, channelCfg.resetOnRead);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2EdgeCount5Getter0(value, cfg));
        }
                   return;
               }
            case "BrickletIO16V2EdgeCount6": {
                   BrickletIO16V2EdgeCountConfig channelCfg = channelConfig.as(BrickletIO16V2EdgeCountConfig.class);
                   {
            long value = this.getEdgeCount(6, channelCfg.resetOnRead);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2EdgeCount6Getter0(value, cfg));
        }
                   return;
               }
            case "BrickletIO16V2EdgeCount7": {
                   BrickletIO16V2EdgeCountConfig channelCfg = channelConfig.as(BrickletIO16V2EdgeCountConfig.class);
                   {
            long value = this.getEdgeCount(7, channelCfg.resetOnRead);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2EdgeCount7Getter0(value, cfg));
        }
                   return;
               }
            case "BrickletIO16V2EdgeCount8": {
                   BrickletIO16V2EdgeCountConfig channelCfg = channelConfig.as(BrickletIO16V2EdgeCountConfig.class);
                   {
            long value = this.getEdgeCount(8, channelCfg.resetOnRead);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2EdgeCount8Getter0(value, cfg));
        }
                   return;
               }
            case "BrickletIO16V2EdgeCount9": {
                   BrickletIO16V2EdgeCountConfig channelCfg = channelConfig.as(BrickletIO16V2EdgeCountConfig.class);
                   {
            long value = this.getEdgeCount(9, channelCfg.resetOnRead);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2EdgeCount9Getter0(value, cfg));
        }
                   return;
               }
            case "BrickletIO16V2EdgeCount10": {
                   BrickletIO16V2EdgeCountConfig channelCfg = channelConfig.as(BrickletIO16V2EdgeCountConfig.class);
                   {
            long value = this.getEdgeCount(10, channelCfg.resetOnRead);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2EdgeCount10Getter0(value, cfg));
        }
                   return;
               }
            case "BrickletIO16V2EdgeCount11": {
                   BrickletIO16V2EdgeCountConfig channelCfg = channelConfig.as(BrickletIO16V2EdgeCountConfig.class);
                   {
            long value = this.getEdgeCount(11, channelCfg.resetOnRead);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2EdgeCount11Getter0(value, cfg));
        }
                   return;
               }
            case "BrickletIO16V2EdgeCount12": {
                   BrickletIO16V2EdgeCountConfig channelCfg = channelConfig.as(BrickletIO16V2EdgeCountConfig.class);
                   {
            long value = this.getEdgeCount(12, channelCfg.resetOnRead);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2EdgeCount12Getter0(value, cfg));
        }
                   return;
               }
            case "BrickletIO16V2EdgeCount13": {
                   BrickletIO16V2EdgeCountConfig channelCfg = channelConfig.as(BrickletIO16V2EdgeCountConfig.class);
                   {
            long value = this.getEdgeCount(13, channelCfg.resetOnRead);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2EdgeCount13Getter0(value, cfg));
        }
                   return;
               }
            case "BrickletIO16V2EdgeCount14": {
                   BrickletIO16V2EdgeCountConfig channelCfg = channelConfig.as(BrickletIO16V2EdgeCountConfig.class);
                   {
            long value = this.getEdgeCount(14, channelCfg.resetOnRead);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2EdgeCount14Getter0(value, cfg));
        }
                   return;
               }
            case "BrickletIO16V2EdgeCount15": {
                   BrickletIO16V2EdgeCountConfig channelCfg = channelConfig.as(BrickletIO16V2EdgeCountConfig.class);
                   {
            long value = this.getEdgeCount(15, channelCfg.resetOnRead);
            if(true)
                updateStateFn.accept(channel, transformBrickletIO16V2EdgeCount15Getter0(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 "BrickletIO16V2Output0":
                if (command instanceof OnOffType) {
                    OnOffType cmd = (OnOffType) command;
this.setSelectedValue(0, cmd == OnOffType.ON);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of OnOffType.", command.getClass().getName(), channel);
                }
                
                break;
            case "BrickletIO16V2Output1":
                if (command instanceof OnOffType) {
                    OnOffType cmd = (OnOffType) command;
this.setSelectedValue(1, cmd == OnOffType.ON);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of OnOffType.", command.getClass().getName(), channel);
                }
                
                break;
            case "BrickletIO16V2Output2":
                if (command instanceof OnOffType) {
                    OnOffType cmd = (OnOffType) command;
this.setSelectedValue(2, cmd == OnOffType.ON);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of OnOffType.", command.getClass().getName(), channel);
                }
                
                break;
            case "BrickletIO16V2Output3":
                if (command instanceof OnOffType) {
                    OnOffType cmd = (OnOffType) command;
this.setSelectedValue(3, cmd == OnOffType.ON);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of OnOffType.", command.getClass().getName(), channel);
                }
                
                break;
            case "BrickletIO16V2Output4":
                if (command instanceof OnOffType) {
                    OnOffType cmd = (OnOffType) command;
this.setSelectedValue(4, cmd == OnOffType.ON);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of OnOffType.", command.getClass().getName(), channel);
                }
                
                break;
            case "BrickletIO16V2Output5":
                if (command instanceof OnOffType) {
                    OnOffType cmd = (OnOffType) command;
this.setSelectedValue(5, cmd == OnOffType.ON);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of OnOffType.", command.getClass().getName(), channel);
                }
                
                break;
            case "BrickletIO16V2Output6":
                if (command instanceof OnOffType) {
                    OnOffType cmd = (OnOffType) command;
this.setSelectedValue(6, cmd == OnOffType.ON);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of OnOffType.", command.getClass().getName(), channel);
                }
                
                break;
            case "BrickletIO16V2Output7":
                if (command instanceof OnOffType) {
                    OnOffType cmd = (OnOffType) command;
this.setSelectedValue(7, cmd == OnOffType.ON);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of OnOffType.", command.getClass().getName(), channel);
                }
                
                break;
            case "BrickletIO16V2Output8":
                if (command instanceof OnOffType) {
                    OnOffType cmd = (OnOffType) command;
this.setSelectedValue(8, cmd == OnOffType.ON);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of OnOffType.", command.getClass().getName(), channel);
                }
                
                break;
            case "BrickletIO16V2Output9":
                if (command instanceof OnOffType) {
                    OnOffType cmd = (OnOffType) command;
this.setSelectedValue(9, cmd == OnOffType.ON);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of OnOffType.", command.getClass().getName(), channel);
                }
                
                break;
            case "BrickletIO16V2Output10":
                if (command instanceof OnOffType) {
                    OnOffType cmd = (OnOffType) command;
this.setSelectedValue(10, cmd == OnOffType.ON);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of OnOffType.", command.getClass().getName(), channel);
                }
                
                break;
            case "BrickletIO16V2Output11":
                if (command instanceof OnOffType) {
                    OnOffType cmd = (OnOffType) command;
this.setSelectedValue(11, cmd == OnOffType.ON);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of OnOffType.", command.getClass().getName(), channel);
                }
                
                break;
            case "BrickletIO16V2Output12":
                if (command instanceof OnOffType) {
                    OnOffType cmd = (OnOffType) command;
this.setSelectedValue(12, cmd == OnOffType.ON);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of OnOffType.", command.getClass().getName(), channel);
                }
                
                break;
            case "BrickletIO16V2Output13":
                if (command instanceof OnOffType) {
                    OnOffType cmd = (OnOffType) command;
this.setSelectedValue(13, cmd == OnOffType.ON);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of OnOffType.", command.getClass().getName(), channel);
                }
                
                break;
            case "BrickletIO16V2Output14":
                if (command instanceof OnOffType) {
                    OnOffType cmd = (OnOffType) command;
this.setSelectedValue(14, cmd == OnOffType.ON);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of OnOffType.", command.getClass().getName(), channel);
                }
                
                break;
            case "BrickletIO16V2Output15":
                if (command instanceof OnOffType) {
                    OnOffType cmd = (OnOffType) command;
this.setSelectedValue(15, cmd == OnOffType.ON);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of OnOffType.", command.getClass().getName(), channel);
                }
                
                break;
            case "BrickletIO16V2Monoflop0":
                if (command instanceof StringType) {
                    BrickletIO16V2MonoflopConfig channelCfg = channelConfig.as(BrickletIO16V2MonoflopConfig.class);
this.setMonoflop(0, channelCfg.monoflopValue.booleanValue(), channelCfg.monoflopDuration);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of StringType.", command.getClass().getName(), channel);
                }
                result.add(new SetterRefresh("BrickletIO16V2Output0", 0));
                break;
            case "BrickletIO16V2Monoflop1":
                if (command instanceof StringType) {
                    BrickletIO16V2MonoflopConfig channelCfg = channelConfig.as(BrickletIO16V2MonoflopConfig.class);
this.setMonoflop(1, channelCfg.monoflopValue.booleanValue(), channelCfg.monoflopDuration);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of StringType.", command.getClass().getName(), channel);
                }
                result.add(new SetterRefresh("BrickletIO16V2Output1", 0));
                break;
            case "BrickletIO16V2Monoflop2":
                if (command instanceof StringType) {
                    BrickletIO16V2MonoflopConfig channelCfg = channelConfig.as(BrickletIO16V2MonoflopConfig.class);
this.setMonoflop(2, channelCfg.monoflopValue.booleanValue(), channelCfg.monoflopDuration);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of StringType.", command.getClass().getName(), channel);
                }
                result.add(new SetterRefresh("BrickletIO16V2Output2", 0));
                break;
            case "BrickletIO16V2Monoflop3":
                if (command instanceof StringType) {
                    BrickletIO16V2MonoflopConfig channelCfg = channelConfig.as(BrickletIO16V2MonoflopConfig.class);
this.setMonoflop(3, channelCfg.monoflopValue.booleanValue(), channelCfg.monoflopDuration);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of StringType.", command.getClass().getName(), channel);
                }
                result.add(new SetterRefresh("BrickletIO16V2Output3", 0));
                break;
            case "BrickletIO16V2Monoflop4":
                if (command instanceof StringType) {
                    BrickletIO16V2MonoflopConfig channelCfg = channelConfig.as(BrickletIO16V2MonoflopConfig.class);
this.setMonoflop(4, channelCfg.monoflopValue.booleanValue(), channelCfg.monoflopDuration);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of StringType.", command.getClass().getName(), channel);
                }
                result.add(new SetterRefresh("BrickletIO16V2Output4", 0));
                break;
            case "BrickletIO16V2Monoflop5":
                if (command instanceof StringType) {
                    BrickletIO16V2MonoflopConfig channelCfg = channelConfig.as(BrickletIO16V2MonoflopConfig.class);
this.setMonoflop(5, channelCfg.monoflopValue.booleanValue(), channelCfg.monoflopDuration);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of StringType.", command.getClass().getName(), channel);
                }
                result.add(new SetterRefresh("BrickletIO16V2Output5", 0));
                break;
            case "BrickletIO16V2Monoflop6":
                if (command instanceof StringType) {
                    BrickletIO16V2MonoflopConfig channelCfg = channelConfig.as(BrickletIO16V2MonoflopConfig.class);
this.setMonoflop(6, channelCfg.monoflopValue.booleanValue(), channelCfg.monoflopDuration);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of StringType.", command.getClass().getName(), channel);
                }
                result.add(new SetterRefresh("BrickletIO16V2Output6", 0));
                break;
            case "BrickletIO16V2Monoflop7":
                if (command instanceof StringType) {
                    BrickletIO16V2MonoflopConfig channelCfg = channelConfig.as(BrickletIO16V2MonoflopConfig.class);
this.setMonoflop(7, channelCfg.monoflopValue.booleanValue(), channelCfg.monoflopDuration);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of StringType.", command.getClass().getName(), channel);
                }
                result.add(new SetterRefresh("BrickletIO16V2Output7", 0));
                break;
            case "BrickletIO16V2Monoflop8":
                if (command instanceof StringType) {
                    BrickletIO16V2MonoflopConfig channelCfg = channelConfig.as(BrickletIO16V2MonoflopConfig.class);
this.setMonoflop(8, channelCfg.monoflopValue.booleanValue(), channelCfg.monoflopDuration);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of StringType.", command.getClass().getName(), channel);
                }
                result.add(new SetterRefresh("BrickletIO16V2Output8", 0));
                break;
            case "BrickletIO16V2Monoflop9":
                if (command instanceof StringType) {
                    BrickletIO16V2MonoflopConfig channelCfg = channelConfig.as(BrickletIO16V2MonoflopConfig.class);
this.setMonoflop(9, channelCfg.monoflopValue.booleanValue(), channelCfg.monoflopDuration);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of StringType.", command.getClass().getName(), channel);
                }
                result.add(new SetterRefresh("BrickletIO16V2Output9", 0));
                break;
            case "BrickletIO16V2Monoflop10":
                if (command instanceof StringType) {
                    BrickletIO16V2MonoflopConfig channelCfg = channelConfig.as(BrickletIO16V2MonoflopConfig.class);
this.setMonoflop(10, channelCfg.monoflopValue.booleanValue(), channelCfg.monoflopDuration);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of StringType.", command.getClass().getName(), channel);
                }
                result.add(new SetterRefresh("BrickletIO16V2Output10", 0));
                break;
            case "BrickletIO16V2Monoflop11":
                if (command instanceof StringType) {
                    BrickletIO16V2MonoflopConfig channelCfg = channelConfig.as(BrickletIO16V2MonoflopConfig.class);
this.setMonoflop(11, channelCfg.monoflopValue.booleanValue(), channelCfg.monoflopDuration);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of StringType.", command.getClass().getName(), channel);
                }
                result.add(new SetterRefresh("BrickletIO16V2Output11", 0));
                break;
            case "BrickletIO16V2Monoflop12":
                if (command instanceof StringType) {
                    BrickletIO16V2MonoflopConfig channelCfg = channelConfig.as(BrickletIO16V2MonoflopConfig.class);
this.setMonoflop(12, channelCfg.monoflopValue.booleanValue(), channelCfg.monoflopDuration);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of StringType.", command.getClass().getName(), channel);
                }
                result.add(new SetterRefresh("BrickletIO16V2Output12", 0));
                break;
            case "BrickletIO16V2Monoflop13":
                if (command instanceof StringType) {
                    BrickletIO16V2MonoflopConfig channelCfg = channelConfig.as(BrickletIO16V2MonoflopConfig.class);
this.setMonoflop(13, channelCfg.monoflopValue.booleanValue(), channelCfg.monoflopDuration);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of StringType.", command.getClass().getName(), channel);
                }
                result.add(new SetterRefresh("BrickletIO16V2Output13", 0));
                break;
            case "BrickletIO16V2Monoflop14":
                if (command instanceof StringType) {
                    BrickletIO16V2MonoflopConfig channelCfg = channelConfig.as(BrickletIO16V2MonoflopConfig.class);
this.setMonoflop(14, channelCfg.monoflopValue.booleanValue(), channelCfg.monoflopDuration);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of StringType.", command.getClass().getName(), channel);
                }
                result.add(new SetterRefresh("BrickletIO16V2Output14", 0));
                break;
            case "BrickletIO16V2Monoflop15":
                if (command instanceof StringType) {
                    BrickletIO16V2MonoflopConfig channelCfg = channelConfig.as(BrickletIO16V2MonoflopConfig.class);
this.setMonoflop(15, channelCfg.monoflopValue.booleanValue(), channelCfg.monoflopDuration);
                }
        
                else {
                    logger.warn("Command type {} not supported for channel {}. Please use one of StringType.", command.getClass().getName(), channel);
                }
                result.add(new SetterRefresh("BrickletIO16V2Output15", 0));
                break;
default:
                logger.warn("Command for unknown channel {}", channel);
        }
        return result;
    }

        private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Input0Callback0(int channel, boolean changed, boolean value, BrickletIO16V2Config cfg) {
        return value ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Input1Callback0(int channel, boolean changed, boolean value, BrickletIO16V2Config cfg) {
        return value ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Input2Callback0(int channel, boolean changed, boolean value, BrickletIO16V2Config cfg) {
        return value ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Input3Callback0(int channel, boolean changed, boolean value, BrickletIO16V2Config cfg) {
        return value ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Input4Callback0(int channel, boolean changed, boolean value, BrickletIO16V2Config cfg) {
        return value ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Input5Callback0(int channel, boolean changed, boolean value, BrickletIO16V2Config cfg) {
        return value ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Input6Callback0(int channel, boolean changed, boolean value, BrickletIO16V2Config cfg) {
        return value ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Input7Callback0(int channel, boolean changed, boolean value, BrickletIO16V2Config cfg) {
        return value ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Input8Callback0(int channel, boolean changed, boolean value, BrickletIO16V2Config cfg) {
        return value ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Input9Callback0(int channel, boolean changed, boolean value, BrickletIO16V2Config cfg) {
        return value ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Input10Callback0(int channel, boolean changed, boolean value, BrickletIO16V2Config cfg) {
        return value ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Input11Callback0(int channel, boolean changed, boolean value, BrickletIO16V2Config cfg) {
        return value ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Input12Callback0(int channel, boolean changed, boolean value, BrickletIO16V2Config cfg) {
        return value ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Input13Callback0(int channel, boolean changed, boolean value, BrickletIO16V2Config cfg) {
        return value ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Input14Callback0(int channel, boolean changed, boolean value, BrickletIO16V2Config cfg) {
        return value ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Input15Callback0(int channel, boolean changed, boolean value, BrickletIO16V2Config cfg) {
        return value ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Output0Callback0(int channel, boolean value, BrickletIO16V2Config cfg) {
        return value ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Output1Callback0(int channel, boolean value, BrickletIO16V2Config cfg) {
        return value ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Output2Callback0(int channel, boolean value, BrickletIO16V2Config cfg) {
        return value ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Output3Callback0(int channel, boolean value, BrickletIO16V2Config cfg) {
        return value ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Output4Callback0(int channel, boolean value, BrickletIO16V2Config cfg) {
        return value ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Output5Callback0(int channel, boolean value, BrickletIO16V2Config cfg) {
        return value ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Output6Callback0(int channel, boolean value, BrickletIO16V2Config cfg) {
        return value ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Output7Callback0(int channel, boolean value, BrickletIO16V2Config cfg) {
        return value ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Output8Callback0(int channel, boolean value, BrickletIO16V2Config cfg) {
        return value ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Output9Callback0(int channel, boolean value, BrickletIO16V2Config cfg) {
        return value ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Output10Callback0(int channel, boolean value, BrickletIO16V2Config cfg) {
        return value ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Output11Callback0(int channel, boolean value, BrickletIO16V2Config cfg) {
        return value ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Output12Callback0(int channel, boolean value, BrickletIO16V2Config cfg) {
        return value ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Output13Callback0(int channel, boolean value, BrickletIO16V2Config cfg) {
        return value ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Output14Callback0(int channel, boolean value, BrickletIO16V2Config cfg) {
        return value ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Output15Callback0(int channel, boolean value, BrickletIO16V2Config cfg) {
        return value ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Input0Getter0(boolean[] value, BrickletIO16V2Config cfg) {
        return value[0] ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Input1Getter0(boolean[] value, BrickletIO16V2Config cfg) {
        return value[1] ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Input2Getter0(boolean[] value, BrickletIO16V2Config cfg) {
        return value[2] ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Input3Getter0(boolean[] value, BrickletIO16V2Config cfg) {
        return value[3] ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Input4Getter0(boolean[] value, BrickletIO16V2Config cfg) {
        return value[4] ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Input5Getter0(boolean[] value, BrickletIO16V2Config cfg) {
        return value[5] ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Input6Getter0(boolean[] value, BrickletIO16V2Config cfg) {
        return value[6] ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Input7Getter0(boolean[] value, BrickletIO16V2Config cfg) {
        return value[7] ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Input8Getter0(boolean[] value, BrickletIO16V2Config cfg) {
        return value[8] ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Input9Getter0(boolean[] value, BrickletIO16V2Config cfg) {
        return value[9] ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Input10Getter0(boolean[] value, BrickletIO16V2Config cfg) {
        return value[10] ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Input11Getter0(boolean[] value, BrickletIO16V2Config cfg) {
        return value[11] ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Input12Getter0(boolean[] value, BrickletIO16V2Config cfg) {
        return value[12] ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Input13Getter0(boolean[] value, BrickletIO16V2Config cfg) {
        return value[13] ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Input14Getter0(boolean[] value, BrickletIO16V2Config cfg) {
        return value[14] ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Input15Getter0(boolean[] value, BrickletIO16V2Config cfg) {
        return value[15] ? OpenClosedType.CLOSED : OpenClosedType.OPEN;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Output0Getter0(boolean[] value, BrickletIO16V2Config cfg) {
        return value[0] ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Output1Getter0(boolean[] value, BrickletIO16V2Config cfg) {
        return value[1] ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Output2Getter0(boolean[] value, BrickletIO16V2Config cfg) {
        return value[2] ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Output3Getter0(boolean[] value, BrickletIO16V2Config cfg) {
        return value[3] ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Output4Getter0(boolean[] value, BrickletIO16V2Config cfg) {
        return value[4] ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Output5Getter0(boolean[] value, BrickletIO16V2Config cfg) {
        return value[5] ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Output6Getter0(boolean[] value, BrickletIO16V2Config cfg) {
        return value[6] ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Output7Getter0(boolean[] value, BrickletIO16V2Config cfg) {
        return value[7] ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Output8Getter0(boolean[] value, BrickletIO16V2Config cfg) {
        return value[8] ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Output9Getter0(boolean[] value, BrickletIO16V2Config cfg) {
        return value[9] ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Output10Getter0(boolean[] value, BrickletIO16V2Config cfg) {
        return value[10] ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Output11Getter0(boolean[] value, BrickletIO16V2Config cfg) {
        return value[11] ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Output12Getter0(boolean[] value, BrickletIO16V2Config cfg) {
        return value[12] ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Output13Getter0(boolean[] value, BrickletIO16V2Config cfg) {
        return value[13] ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Output14Getter0(boolean[] value, BrickletIO16V2Config cfg) {
        return value[14] ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Output15Getter0(boolean[] value, BrickletIO16V2Config cfg) {
        return value[15] ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Monoflop0Getter0(BrickletIO16V2.Monoflop value, BrickletIO16V2Config cfg) {
        return value.value ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Monoflop1Getter0(BrickletIO16V2.Monoflop value, BrickletIO16V2Config cfg) {
        return value.value ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Monoflop2Getter0(BrickletIO16V2.Monoflop value, BrickletIO16V2Config cfg) {
        return value.value ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Monoflop3Getter0(BrickletIO16V2.Monoflop value, BrickletIO16V2Config cfg) {
        return value.value ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Monoflop4Getter0(BrickletIO16V2.Monoflop value, BrickletIO16V2Config cfg) {
        return value.value ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Monoflop5Getter0(BrickletIO16V2.Monoflop value, BrickletIO16V2Config cfg) {
        return value.value ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Monoflop6Getter0(BrickletIO16V2.Monoflop value, BrickletIO16V2Config cfg) {
        return value.value ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Monoflop7Getter0(BrickletIO16V2.Monoflop value, BrickletIO16V2Config cfg) {
        return value.value ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Monoflop8Getter0(BrickletIO16V2.Monoflop value, BrickletIO16V2Config cfg) {
        return value.value ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Monoflop9Getter0(BrickletIO16V2.Monoflop value, BrickletIO16V2Config cfg) {
        return value.value ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Monoflop10Getter0(BrickletIO16V2.Monoflop value, BrickletIO16V2Config cfg) {
        return value.value ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Monoflop11Getter0(BrickletIO16V2.Monoflop value, BrickletIO16V2Config cfg) {
        return value.value ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Monoflop12Getter0(BrickletIO16V2.Monoflop value, BrickletIO16V2Config cfg) {
        return value.value ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Monoflop13Getter0(BrickletIO16V2.Monoflop value, BrickletIO16V2Config cfg) {
        return value.value ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Monoflop14Getter0(BrickletIO16V2.Monoflop value, BrickletIO16V2Config cfg) {
        return value.value ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2Monoflop15Getter0(BrickletIO16V2.Monoflop value, BrickletIO16V2Config cfg) {
        return value.value ? OnOffType.ON : OnOffType.OFF;
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2EdgeCount0Getter0(long value, BrickletIO16V2Config cfg) {
        return new DecimalType(value);
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2EdgeCount1Getter0(long value, BrickletIO16V2Config cfg) {
        return new DecimalType(value);
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2EdgeCount2Getter0(long value, BrickletIO16V2Config cfg) {
        return new DecimalType(value);
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2EdgeCount3Getter0(long value, BrickletIO16V2Config cfg) {
        return new DecimalType(value);
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2EdgeCount4Getter0(long value, BrickletIO16V2Config cfg) {
        return new DecimalType(value);
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2EdgeCount5Getter0(long value, BrickletIO16V2Config cfg) {
        return new DecimalType(value);
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2EdgeCount6Getter0(long value, BrickletIO16V2Config cfg) {
        return new DecimalType(value);
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2EdgeCount7Getter0(long value, BrickletIO16V2Config cfg) {
        return new DecimalType(value);
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2EdgeCount8Getter0(long value, BrickletIO16V2Config cfg) {
        return new DecimalType(value);
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2EdgeCount9Getter0(long value, BrickletIO16V2Config cfg) {
        return new DecimalType(value);
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2EdgeCount10Getter0(long value, BrickletIO16V2Config cfg) {
        return new DecimalType(value);
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2EdgeCount11Getter0(long value, BrickletIO16V2Config cfg) {
        return new DecimalType(value);
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2EdgeCount12Getter0(long value, BrickletIO16V2Config cfg) {
        return new DecimalType(value);
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2EdgeCount13Getter0(long value, BrickletIO16V2Config cfg) {
        return new DecimalType(value);
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2EdgeCount14Getter0(long value, BrickletIO16V2Config cfg) {
        return new DecimalType(value);
    }
	    private org.eclipse.smarthome.core.types.State transformBrickletIO16V2EdgeCount15Getter0(long value, BrickletIO16V2Config cfg) {
        return new DecimalType(value);
    }

}