danielwippermann/resol-vbus

View on GitHub
src/configuration-optimizer-factory.js

Summary

Maintainability
A
25 mins
Test Coverage
/*! resol-vbus | Copyright (c) 2013-present, Daniel Wippermann | MIT license */

const optimizerClasses = [

    // ======================================================================
    // RESOL
    // ======================================================================

    // DeltaSol BS4 v2
    require('./configuration-optimizers/resol-deltasol-bs4v2-103-configuration-optimizer'),

    // DeltaSol BX Plus
    require('./configuration-optimizers/resol-deltasol-bx-plus-xxx-configuration-optimizer'),

    // DeltaSol C
    require('./configuration-optimizers/resol-deltasol-c-104-configuration-optimizer'),

    // DeltaSol CS Plus
    require('./configuration-optimizers/resol-deltasol-cs-plus-xxx-configuration-optimizer'),

    // DeltaSol CS2
    require('./configuration-optimizers/resol-deltasol-cs2-200-configuration-optimizer'),

    // DeltaSol CS2
    require('./configuration-optimizers/resol-deltasol-cs4-200-configuration-optimizer'),

    // DeltaSol E V2
    require('./configuration-optimizers/resol-deltasol-e-v2-100-configuration-optimizer'),

    // DeltaSol MX
    require('./configuration-optimizers/resol-deltasol-mx-112-configuration-optimizer'),

    // DeltaSol MX
    require('./configuration-optimizers/resol-deltasol-mx-2xx-configuration-optimizer'),

    // DeltaSol SLT
    require('./configuration-optimizers/resol-deltasol-slt-102-configuration-optimizer'),

    // DeltaTherm HC
    require('./configuration-optimizers/resol-deltatherm-hc-xxx-configuration-optimizer'),

];



const ConfigurationOptimizerFactory = {

    /**
     * Find a `ConfigurationOptimizer` sub-class that matches the given options best.
     *
     * @param  {object} options Options to look for while searching a matching configuration optimizer.
     * @param  {number} options.deviceAddress The VBus address of the controller.
     * @param  {string} options.version The version of the controller.
     * @param  {Customizer} options.customizer A `Customizer` instance to query additional information with.
     * @return {Promise} A Promise that resolves to the best matching optimizer result or `null` if no match was found.
     */
    async matchOptimizer(options) {
        options = {
            ...options,
        };

        let result = {
            match: 0,
            Optimizer: null,
            options: null,
        };

        const cache = {
            masterAddress: null,
            masterConfiguration: [],
        };

        for (const Optimizer of optimizerClasses) {
            const refResult = await Optimizer.matchOptimizer(options, cache);

            if ((refResult.match > 0) && (refResult.match > result.match)) {
                result = refResult;
            }
        }

        if (result.match > 0) {
            return result;
        } else {
            return null;
        }
    },

    /**
     * Find and create an instance of a `ConfigurationOptimizer` sub-class that matches the given options best.
     *
     * @param  {object} options See {@link ConfigurationOptimizerFactory.matchOptimizer} for details.
     * @return {Promise} A promise that resolves to the `ConfigurationOptimizer` instance or `null` if no matching optimizer was found.
     */
    async createOptimizer(options) {
        const result = await ConfigurationOptimizerFactory.matchOptimizer(options);

        let optimizer;
        if (result) {
            optimizer = new result.Optimizer(result.options);
        } else {
            optimizer = null;
        }
        return optimizer;
    },

    /**
     * Get the configuration optimizer for the given device (identified by its address).
     *
     * @param {number} deviceAddress VBus address of the device
     * @returns {Promise} A Promise that resolvs to the optimizer for the given device or `null` if no optimizer was found.
     */
    createOptimizerByDeviceAddress(deviceAddress) {
        return ConfigurationOptimizerFactory.createOptimizer({
            deviceAddress,
        });
    },

    _optimizerClasses: optimizerClasses,

};



module.exports = ConfigurationOptimizerFactory;