UNPKG

node-red-contrib-google-smarthome

Version:

Lets you control Node-Red via Google Assistant or the Google Home App

3,623 lines 212 kB
<!--
 node-red-contrib-google-smarthome
 Copyright (C) 2025 Claudio Chimera and others.

 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, either version 3 of the License, or
 (at your option) any later version.

 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
-->

<!--
    Google Device with all traits
-->
<script type="text/html" data-template-name="google-device">
    <style>
        ol#node-input-device-zone-container .red-ui-typedInput-container {
            flex:1;
        }
        ol#node-input-device-network-profiles-container .red-ui-typedInput-container {
            flex:1;
        }
    </style>

    <div class="form-tips" style="margin-bottom: 1em">
        For setup instructions, <a href="https://github.com/mikejac/node-red-contrib-google-smarthome/blob/master/docs/setup_instructions.md" target="_blank">look here </a>.
    </div>

    <div class="form-row">
        <b>Google SmartHome Settings</b>
    </div>

    <div class="form-row">
        <label style="width:auto" for="node-input-client"><i class="fa fa-globe"></i> SmartHome</label>
        <input type="text" id="node-input-client">
    </div>

    <div class="form-row">
        <label style="width:auto" for="node-input-name"><i class="fa fa-tag"></i> <span data-i18n="device.label.name"></span></label>
        <input type="text" id="node-input-name" data-i18n="[placeholder]device.placeholder.name">
    </div>

    <div class="form-row">
        <label style="width:auto" for="node-input-nicknames"><i class="fa fa-tag"></i> <span data-i18n="device.label.nicknames"></span></label>
        <input type="text" id="node-input-nicknames" data-i18n="[placeholder]device.placeholder.nicknames">
    </div>

    <div class="form-row">
        <b>Node-RED Settings</b>
    </div>

    <div class="form-row">
        <label style="width:auto" for="node-input-topic"><i class="fa fa-tag"></i> <span data-i18n="device.label.topic"></span></label>
        <input type="text" id="node-input-topic" data-i18n="[placeholder]device.placeholder.topic">
    </div>

    <div class="form-row">
        <label style="width:auto" for="node-input-room_hint"><i class="fa fa-tag"></i> <span data-i18n="device.label.room_hint"></span></label>
        <input type="text" id="node-input-room_hint" data-i18n="[placeholder]device.placeholder.room_hint">
    </div>

    <!-- Filter by Topic -->
    <div class="form-row">
        <label style="width:auto" for="node-input-topic_filter"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.topic_filter"></span></label>
        <input type="checkbox" id="node-input-topic_filter" style="display:inline-block; width:auto; vertical-align:top;">
    </div>

    <!-- Passthru -->
    <div class="form-row">
        <label style="width:auto" for="node-input-passthru"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.passthru"></span></label>
        <input type="checkbox" id="node-input-passthru" style="display:inline-block; width:auto; vertical-align:top;">
    </div>

    <!-- Persistent State -->
    <div class="form-row">
        <label style="width:auto" for="node-input-persistent_state"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.persistent_state"></span></label>
        <input type="checkbox" id="node-input-persistent_state" style="display:inline-block; width:auto; vertical-align:top;">
    </div>
    
    <!-- Device Type -->
    <div class="form-row" id="device_type">
        <label style="width:auto" for="node-input-device_type"><i class="fa fa-tag"></i> <span data-i18n="device.label.device_type"></span></label>
        <select id="node-input-device_type" >
            <option value='AC_UNIT' data-i18n='device.device_type.AC_UNIT'></option>
            <option value='AIRCOOLER' data-i18n='device.device_type.AIRCOOLER'></option>
            <option value='AIRFRESHENER' data-i18n='device.device_type.AIRFRESHENER'></option>
            <option value='AIRPURIFIER' data-i18n='device.device_type.AIRPURIFIER'></option>
            <option value='AUDIO_VIDEO_RECEIVER' data-i18n='device.device_type.AUDIO_VIDEO_RECEIVER'></option>
            <option value='AWNING' data-i18n='device.device_type.AWNING'></option>
            <option value='BATHTUB' data-i18n='device.device_type.BATHTUB'></option>
            <option value='BED' data-i18n='device.device_type.BED'></option>
            <option value='BLANKET' data-i18n='device.device_type.BLANKET'></option>
            <option value='BLENDER' data-i18n='device.device_type.BLENDER'></option>
            <option value='BLINDS' data-i18n='device.device_type.BLINDS'></option>
            <option value='BOILER' data-i18n='device.device_type.BOILER'></option>
            <option value='CAMERA' data-i18n='device.device_type.CAMERA'></option>
            <option value='CARBON_MONOXIDE_DETECTOR' data-i18n='device.device_type.CARBON_MONOXIDE_DETECTOR'></option>
            <option value='CHARGER' data-i18n='device.device_type.CHARGER'></option>
            <option value='CLOSET' data-i18n='device.device_type.CLOSET'></option>
            <option value='COFFEE_MAKER' data-i18n='device.device_type.COFFEE_MAKER'></option>
            <option value='COOKTOP' data-i18n='device.device_type.COOKTOP'></option>
            <option value='CURTAIN' data-i18n='device.device_type.CURTAIN'></option>
            <option value='DEHUMIDIFIER' data-i18n='device.device_type.DEHUMIDIFIER'></option>
            <option value='DEHYDRATOR' data-i18n='device.device_type.DEHYDRATOR'></option>
            <option value='DISHWASHER' data-i18n='device.device_type.DISHWASHER'></option>
            <option value='DOOR' data-i18n='device.device_type.DOOR'></option>
            <option value='DOORBELL' data-i18n='device.device_type.DOORBELL'></option>
            <option value='DRAWER' data-i18n='device.device_type.DRAWER'></option>
            <option value='DRYER' data-i18n='device.device_type.DRYER'></option>
            <option value='FAN' data-i18n='device.device_type.FAN'></option>
            <option value='FAUCET' data-i18n='device.device_type.FAUCET'></option>
            <option value='FIREPLACE' data-i18n='device.device_type.FIREPLACE'></option>
            <option value='FREEZER' data-i18n='device.device_type.FREEZER'></option>
            <option value='FRYER' data-i18n='device.device_type.FRYER'></option>
            <option value='GAME_CONSOLE' data-i18n='device.device_type.GAME_CONSOLE'></option>
            <option value='GARAGE' data-i18n='device.device_type.GARAGE'></option>
            <option value='GATE' data-i18n='device.device_type.GATE'></option>
            <option value='GRILL' data-i18n='device.device_type.GRILL'></option>
            <option value='HEATER' data-i18n='device.device_type.HEATER'></option>
            <option value='HOOD' data-i18n='device.device_type.HOOD'></option>
            <option value='HUMIDIFIER' data-i18n='device.device_type.HUMIDIFIER'></option>
            <option value='KETTLE' data-i18n='device.device_type.KETTLE'></option>
            <option value='LIGHT' data-i18n='device.device_type.LIGHT'></option>
            <option value='LOCK' data-i18n='device.device_type.LOCK'></option>
            <option value='MICROWAVE' data-i18n='device.device_type.MICROWAVE'></option>
            <option value='MOP' data-i18n='device.device_type.MOP'></option>
            <option value='MOWER' data-i18n='device.device_type.MOWER'></option>
            <option value='MULTICOOKER' data-i18n='device.device_type.MULTICOOKER'></option>
            <option value='NETWORK' data-i18n='device.device_type.NETWORK'></option>
            <option value='OUTLET' data-i18n='device.device_type.OUTLET'></option>
            <option value='OVEN' data-i18n='device.device_type.OVEN'></option>
            <option value='PERGOLA' data-i18n='device.device_type.PERGOLA'></option>
            <option value='PETFEEDER' data-i18n='device.device_type.PETFEEDER'></option>
            <option value='PRESSURECOOKER' data-i18n='device.device_type.PRESSURECOOKER'></option>
            <option value='PUMP' data-i18n='device.device_type.PUMP'></option>
            <option value='RADIATOR' data-i18n='device.device_type.RADIATOR'></option>
            <option value='REFRIGERATOR' data-i18n='device.device_type.REFRIGERATOR'></option>
            <option value='REMOTECONTROL' data-i18n='device.device_type.REMOTECONTROL'></option>
            <option value='ROUTER' data-i18n='device.device_type.ROUTER'></option>
            <option value='SCENE' data-i18n='device.device_type.SCENE'></option>
            <option value='SECURITYSYSTEM' data-i18n='device.device_type.SECURITYSYSTEM'></option>
            <option value='SENSOR' data-i18n='device.device_type.SENSOR'></option>
            <option value='SETTOP' data-i18n='device.device_type.SETTOP'></option>
            <option value='SHOWER' data-i18n='device.device_type.SHOWER'></option>
            <option value='SHUTTER' data-i18n='device.device_type.SHUTTER'></option>
            <option value='SMOKE_DETECTOR' data-i18n='device.device_type.SMOKE_DETECTOR'></option>
            <option value='SOUNDBAR' data-i18n='device.device_type.SOUNDBAR'></option>
            <option value='SOUSVIDE' data-i18n='device.device_type.SOUSVIDE'></option>
            <option value='SPEAKER' data-i18n='device.device_type.SPEAKER'></option>
            <option value='SPRINKLER' data-i18n='device.device_type.SPRINKLER'></option>
            <option value='STANDMIXER' data-i18n='device.device_type.STANDMIXER'></option>
            <option value='STREAMING_BOX' data-i18n='device.device_type.STREAMING_BOX'></option>
            <option value='STREAMING_SOUNDBAR' data-i18n='device.device_type.STREAMING_SOUNDBAR'></option>
            <option value='STREAMING_STICK' data-i18n='device.device_type.STREAMING_STICK'></option>
            <option value='SWITCH' data-i18n='device.device_type.SWITCH'></option>
            <option value='THERMOSTAT' data-i18n='device.device_type.THERMOSTAT'></option>
            <option value='TV' data-i18n='device.device_type.TV'></option>
            <option value='VACUUM' data-i18n='device.device_type.VACUUM'></option>
            <option value='VALVE' data-i18n='device.device_type.VALVE'></option>
            <option value='WASHER' data-i18n='device.device_type.WASHER'></option>
            <option value='WATERHEATER' data-i18n='device.device_type.WATERHEATER'></option>
            <option value='WATERPURIFIER' data-i18n='device.device_type.WATERPURIFIER'></option>
            <option value='WATERSOFTENER' data-i18n='device.device_type.WATERSOFTENER'></option>
            <option value='WINDOW' data-i18n='device.device_type.WINDOW'></option>
            <option value='YOGURTMAKER' data-i18n='device.device_type.YOGURTMAKER'></option>
        </select>
    </div>

    <!-- Show Traits -->
    <div class="form-row">
        <label style="width:auto" for="node-input-show_trait"><i class="fa fa-tag"></i> <span data-i18n="device.label.show_trait"></span></label>
        <select id="node-input-show_trait" >
            <option value="selected" data-i18n="device.label.selected"></option>
            <option value="recommended" data-i18n="device.label.recommended"></option>
            <option value="all" data-i18n="device.label.all"></option>
        </select>
    </div>

    <div class="form-row" hidden>
        <label style="width:auto" for="node-input-advanced_settings"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.advanced_settings"></span></label>
        <input type="checkbox" id="node-input-advanced_settings" style="display:inline-block; width:auto; vertical-align:top;">
    </div>

    <div class="form-row">
        <label style="width:auto" for="node-input-online"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.online"></span></label>
        <input type="checkbox" id="node-input-online" style="display:inline-block; width:auto; vertical-align:top;">
    </div>

    <!-- AppSelector Trait-->
    <div class="form-row red-ui-editableList-border div_trait" id="appselector" style="background: #fbfbfb; padding: 5px;">
        <div class="form-row" id="cb_trait_appselector">
            <b><label style="width:auto" for="node-input-trait_appselector"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.appselector"></span></label></b>
            <input type="checkbox" id="node-input-trait_appselector" style="display:inline-block; width:auto; vertical-align:top;" class="cb_trait">
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/appselector"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div class="form-row label_trait" id="label_trait_appselector">
            <b><label style="width:auto"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.appselector"></span></label></b>
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/appselector"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div id="trait_appselector">
            <div class="form-row">
                <label style="width:auto" for="node-input-appselector_file"><i class="fa fa-file"></i> <span data-i18n="device.label.appselector_file"></span></label>
                <input type="text" id="node-input-appselector_file" data-i18n="[placeholder]device.placeholder.appselector_file">
                <input type="hidden" id="node-input-appselector_type">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-ct_appselector"><i class="fa fa-tag"></i> <span data-i18n="device.label.challenge_type"></span></label>
                <select id="node-input-ct_appselector" class="challenge_type">
                    <option value="" data-i18n="device.label.no_challenge"></option>
                    <option value="ackNeeded" data-i18n="device.label.ackNeeded"></option>
                    <option value="pinNeeded" data-i18n="device.label.pinNeeded"></option>
                </select>
            </div>
            
            <div class="form-row challenge_pin">
                <label style="width:auto" for="node-input-pin_appselector"><i class="fa fa-tag"></i> <span data-i18n="device.label.pin"></span></label>
                <input type="text" id="node-input-pin_appselector" data-i18n="[placeholder]device.placeholder.pin">
            </div>
            
        </div>
    </div>

    <!-- ArmDisarm Trait-->
    <div class="form-row red-ui-editableList-border div_trait" id="armdisarm" style="background: #fbfbfb; padding: 5px;">
        <div class="form-row" id="cb_trait_armdisarm">
            <b><label style="width:auto" for="node-input-trait_armdisarm"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.armdisarm"></span></label></b>
            <input type="checkbox" id="node-input-trait_armdisarm" style="display:inline-block; width:auto; vertical-align:top;" class="cb_trait">
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/armdisarm"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div class="form-row label_trait" id="label_trait_armdisarm">
            <b><label style="width:auto"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.armdisarm"></span></label></b>
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/armdisarm"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div id="trait_armdisarm">
            <div class="form-row">
                <label style="width:auto" for="node-input-available_arm_levels_file"><i class="fa fa-file"></i> <span data-i18n="device.label.available_arm_levels_file"></span></label>
                <input type="text" id="node-input-available_arm_levels_file" data-i18n="[placeholder]device.placeholder.available_arm_levels_file">
                <input type="hidden" id="node-input-available_arm_levels_type">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-arm_levels_ordered"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.arm_levels_ordered"></span></label>
                <input type="checkbox" id="node-input-arm_levels_ordered" style="display:inline-block; width:auto; vertical-align:top;">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-ct_armdisarm"><i class="fa fa-tag"></i> <span data-i18n="device.label.challenge_type"></span></label>
                <select id="node-input-ct_armdisarm" class="challenge_type">
                    <option value="" data-i18n="device.label.no_challenge"></option>
                    <option value="ackNeeded" data-i18n="device.label.ackNeeded"></option>
                    <option value="pinNeeded" data-i18n="device.label.pinNeeded"></option>
                </select>
            </div>
            
            <div class="form-row challenge_pin">
                <label style="width:auto" for="node-input-pin_armdisarm"><i class="fa fa-tag"></i> <span data-i18n="device.label.pin"></span></label>
                <input type="text" id="node-input-pin_armdisarm" data-i18n="[placeholder]device.placeholder.pin">
            </div>
            
        </div>
    </div>

    <!-- Brightness Trait-->
    <div class="form-row red-ui-editableList-border div_trait" id="brightness" style="background: #fbfbfb; padding: 5px;">
        <div class="form-row" id="cb_trait_brightness">
            <b><label style="width:auto" for="node-input-trait_brightness"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.brightness"></span></label></b>
            <input type="checkbox" id="node-input-trait_brightness" style="display:inline-block; width:auto; vertical-align:top;" class="cb_trait">
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/brightness"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div class="form-row label_trait" id="label_trait_brightness">
            <b><label style="width:auto"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.brightness"></span></label></b>
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/brightness"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div id="trait_brightness">
            <div class="form-row device-advanced">
                <label style="width:auto" for="node-input-command_only_brightness"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.command_only"></span></label>
                <input type="checkbox" id="node-input-command_only_brightness" style="display:inline-block; width:auto; vertical-align:top;">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-ct_brightness"><i class="fa fa-tag"></i> <span data-i18n="device.label.challenge_type"></span></label>
                <select id="node-input-ct_brightness" class="challenge_type">
                    <option value="" data-i18n="device.label.no_challenge"></option>
                    <option value="ackNeeded" data-i18n="device.label.ackNeeded"></option>
                    <option value="pinNeeded" data-i18n="device.label.pinNeeded"></option>
                </select>
            </div>
            
            <div class="form-row challenge_pin">
                <label style="width:auto" for="node-input-pin_brightness"><i class="fa fa-tag"></i> <span data-i18n="device.label.pin"></span></label>
                <input type="text" id="node-input-pin_brightness" data-i18n="[placeholder]device.placeholder.pin">
            </div>
            
        </div>
    </div>

    <!-- CameraStream trait-->
    <div class="form-row red-ui-editableList-border div_trait" id="camerastream" style="background: #fbfbfb; padding: 5px;">
        <div class="form-row" id="cb_trait_camerastream">
            <b><label style="width:auto" for="node-input-trait_camerastream"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.camerastream"></span></label></b>
            <input type="checkbox" id="node-input-trait_camerastream" style="display:inline-block; width:auto; vertical-align:top;" class="cb_trait">
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/camerastream"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div class="form-row label_trait" id="label_trait_camerastream">
            <b><label style="width:auto"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.camerastream"></span></label></b>
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/camerastream"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div id="trait_camerastream">
            <div class="form-row">
                <label style="width:auto" for="node-input-hls"><i class="fa fa-globe"></i> <span data-i18n="device.label.hls"></span></label>
                <input type="text" id="node-input-hls" data-i18n="[placeholder]device.placeholder.hls">
            </div>
        
            <div class="form-row">
                <label style="width:auto" for="node-input-hls_app_id"><i class="fa fa-tag"></i> <span data-i18n="device.label.hls_app_id"></span></label>
                <input type="text" id="node-input-hls_app_id" data-i18n="[placeholder]device.placeholder.hls_app_id">
            </div>
        
            <div class="form-row">
                <label style="width:auto" for="node-input-dash"><i class="fa fa-globe"></i> <span data-i18n="device.label.dash"></span></label>
                <input type="text" id="node-input-dash" data-i18n="[placeholder]device.placeholder.dash">
            </div>
        
            <div class="form-row">
                <label style="width:auto" for="node-input-dash_app_id"><i class="fa fa-tag"></i> <span data-i18n="device.label.dash_app_id"></span></label>
                <input type="text" id="node-input-dash_app_id" data-i18n="[placeholder]device.placeholder.dash_app_id">
            </div>
        
            <div class="form-row">
                <label style="width:auto" for="node-input-smooth_stream"><i class="fa fa-globe"></i> <span data-i18n="device.label.smooth_stream"></span></label>
                <input type="text" id="node-input-smooth_stream" data-i18n="[placeholder]device.placeholder.smooth_stream">
            </div>
        
            <div class="form-row">
                <label style="width:auto" for="node-input-smooth_stream_app_id"><i class="fa fa-tag"></i> <span data-i18n="device.label.smooth_stream_app_id"></span></label>
                <input type="text" id="node-input-smooth_stream_app_id" data-i18n="[placeholder]device.placeholder.smooth_stream_app_id">
            </div>
        
            <div class="form-row">
                <label style="width:auto" for="node-input-progressive_mp4"><i class="fa fa-globe"></i> <span data-i18n="device.label.progressive_mp4"></span></label>
                <input type="text" id="node-input-progressive_mp4" data-i18n="[placeholder]device.placeholder.progressive_mp4">
            </div>
        
            <div class="form-row">
                <label style="width:auto" for="node-input-progressive_mp4_app_id"><i class="fa fa-tag"></i> <span data-i18n="device.label.progressive_mp4_app_id"></span></label>
                <input type="text" id="node-input-progressive_mp4_app_id" data-i18n="[placeholder]device.placeholder.progressive_mp4_app_id">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-webrtc"><i class="fa fa-globe"></i> <span data-i18n="device.label.webrtc"></span></label>
                <input type="text" id="node-input-webrtc" data-i18n="[placeholder]device.placeholder.webrtc">
            </div>
        
            <div class="form-row">
                <label style="width:auto" for="node-input-webrtc_offer"><i class="fa fa-tag"></i> <span data-i18n="device.label.webrtc_offer"></span></label>
                <input type="text" id="node-input-webrtc_offer" data-i18n="[placeholder]device.placeholder.webrtc_offer">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-webrtc_ice_servers"><i class="fa fa-tag"></i> <span data-i18n="device.label.webrtc_ice_servers"></span></label>
                <input type="text" id="node-input-webrtc_ice_servers" data-i18n="[placeholder]device.placeholder.webrtc_ice_servers">
                <input type="hidden" id="node-input-webrtc_ice_servers_type">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-need_auth_token"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.need_auth_token"></span></label>
                <input type="checkbox" id="node-input-need_auth_token" style="display:inline-block; width:auto; vertical-align:top;">
            </div>
        
            <div class="form-row">
                <label style="width:auto" for="node-input-auth_token"><i class="fa fa-tag"></i> <span data-i18n="device.label.auth_token"></span></label>
                <input type="text" id="node-input-auth_token" data-i18n="[placeholder]device.placeholder.auth_token">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-ct_camerastream"><i class="fa fa-tag"></i> <span data-i18n="device.label.challenge_type"></span></label>
                <select id="node-input-ct_camerastream" class="challenge_type">
                    <option value="" data-i18n="device.label.no_challenge"></option>
                    <option value="ackNeeded" data-i18n="device.label.ackNeeded"></option>
                    <option value="pinNeeded" data-i18n="device.label.pinNeeded"></option>
                </select>
            </div>
            
            <div class="form-row challenge_pin">
                <label style="width:auto" for="node-input-pin_camerastream"><i class="fa fa-tag"></i> <span data-i18n="device.label.pin"></span></label>
                <input type="text" id="node-input-pin_camerastream" data-i18n="[placeholder]device.placeholder.pin">
            </div>
            
        </div>
    </div>
    
    <!-- Channel Trait-->
    <div class="form-row red-ui-editableList-border div_trait" id="channel" style="background: #fbfbfb; padding: 5px;">
        <div class="form-row" id="cb_trait_channel">
            <b><label style="width:auto" for="node-input-trait_channel"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.channel"></span></label></b>
            <input type="checkbox" id="node-input-trait_channel" style="display:inline-block; width:auto; vertical-align:top;" class="cb_trait">
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/channel"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div class="form-row label_trait" id="label_trait_channel">
            <b><label style="width:auto"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.channel"></span></label></b>
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/channel"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div id="trait_channel">
            <div class="form-row">
                <label style="width:auto" for="node-input-channel_file"><i class="fa fa-file"></i> <span data-i18n="device.label.channel_file"></span></label>
                <input type="text" id="node-input-channel_file" data-i18n="[placeholder]device.placeholder.channel_file">
                <input type="hidden" id="node-input-channel_type">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-ct_channel"><i class="fa fa-tag"></i> <span data-i18n="device.label.challenge_type"></span></label>
                <select id="node-input-ct_channel" class="challenge_type">
                    <option value="" data-i18n="device.label.no_challenge"></option>
                    <option value="ackNeeded" data-i18n="device.label.ackNeeded"></option>
                    <option value="pinNeeded" data-i18n="device.label.pinNeeded"></option>
                </select>
            </div>
            
            <div class="form-row challenge_pin">
                <label style="width:auto" for="node-input-pin_channel"><i class="fa fa-tag"></i> <span data-i18n="device.label.pin"></span></label>
                <input type="text" id="node-input-pin_channel" data-i18n="[placeholder]device.placeholder.pin">
            </div>
            
        </div>
    </div>

    <!-- ColorSetting Trait-->
    <div class="form-row red-ui-editableList-border div_trait" id="colorsetting" style="background: #fbfbfb; padding: 5px;">
        <div class="form-row" id="cb_trait_colorsetting">
            <b><label style="width:auto" for="node-input-trait_colorsetting"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.colorsetting"></span></label></b>
            <input type="checkbox" id="node-input-trait_colorsetting" style="display:inline-block; width:auto; vertical-align:top;" class="cb_trait">
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/colorsetting"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div class="form-row label_trait" id="label_trait_colorsetting">
            <b><label style="width:auto"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.colorsetting"></span></label></b>
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/colorsetting"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div id="trait_colorsetting">
            <div class="form-row device-advanced">
                <label style="width:auto" for="node-input-command_only_colorsetting"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.command_only"></span></label>
                <input type="checkbox" id="node-input-command_only_colorsetting" style="display:inline-block; width:auto; vertical-align:top;">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-color_model"><i class="fa fa-tag"></i> <span data-i18n="device.label.color_model"></span></label>
                <select id="node-input-color_model" >
                    <option value="temp" data-i18n="device.label.temperature_k"></option>
                    <option value="rgb" data-i18n="device.label.rgb"></option>
                    <option value="hsv" data-i18n="device.label.hsv"></option>
                    <option value="rgb_temp" data-i18n="device.label.rgb_temp"></option>
                    <option value="hsv_temp" data-i18n="device.label.hsv_temp"></option>
                </select>
            </div>

            <div class="form-row">
                <b><label style="width:auto"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.color_temperature_range"></span></label></b>

                <div class="form-row">
                    <label style="width:auto" for="node-input-temperature_min_k"><i class="fa fa-tag"></i> <span data-i18n="device.label.temperature_min_k"></span></label>
                    <input type="text" id="node-input-temperature_min_k" data-i18n="[placeholder]device.placeholder.temperature_min_k">
                </div>

                <div class="form-row">
                    <label style="width:auto" for="node-input-temperature_max_k"><i class="fa fa-tag"></i> <span data-i18n="device.label.temperature_max_k"></span></label>
                    <input type="text" id="node-input-temperature_max_k" data-i18n="[placeholder]device.placeholder.temperature_max_k">
                </div>
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-ct_colorsetting"><i class="fa fa-tag"></i> <span data-i18n="device.label.challenge_type"></span></label>
                <select id="node-input-ct_colorsetting" class="challenge_type">
                    <option value="" data-i18n="device.label.no_challenge"></option>
                    <option value="ackNeeded" data-i18n="device.label.ackNeeded"></option>
                    <option value="pinNeeded" data-i18n="device.label.pinNeeded"></option>
                </select>
            </div>
            
            <div class="form-row challenge_pin">
                <label style="width:auto" for="node-input-pin_colorsetting"><i class="fa fa-tag"></i> <span data-i18n="device.label.pin"></span></label>
                <input type="text" id="node-input-pin_colorsetting" data-i18n="[placeholder]device.placeholder.pin">
            </div>
            
        </div>
    </div>

    <!-- Cook Trait-->
    <div class="form-row red-ui-editableList-border div_trait" id="cook" style="background: #fbfbfb; padding: 5px;">
        <div class="form-row" id="cb_trait_cook">
            <b><label style="width:auto" for="node-input-trait_cook"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.cook"></span></label></b>
            <input type="checkbox" id="node-input-trait_cook" style="display:inline-block; width:auto; vertical-align:top;" class="cb_trait">
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/cook"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div class="form-row label_trait" id="label_trait_cook">
            <b><label style="width:auto"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.cook"></span></label></b>
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/cook"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div id="trait_cook">
            <div class="form-row">
                <label style="width:auto" for="node-input-supported_cooking_modes"><i class="fa fa-tag"></i> <span data-i18n="device.label.supported_cooking_modes"></span></label>
                <select multiple id="node-input-supported_cooking_modes" >
                    <option value="UNKNOWN_COOKING_MODE" data-i18n="device.label.UNKNOWN_COOKING_MODE"></option>
                    <option value="BAKE" data-i18n="device.label.BAKE"></option>
                    <option value="BEAT" data-i18n="device.label.BEAT"></option>
                    <option value="BLEND" data-i18n="device.label.BLEND"></option>
                    <option value="BOIL" data-i18n="device.label.BOIL"></option>
                    <option value="BREW" data-i18n="device.label.BREW"></option>
                    <option value="BROIL" data-i18n="device.label.BROIL"></option>
                    <option value="CONVECTION_BAKE" data-i18n="device.label.CONVECTION_BAKE"></option>
                    <option value="COOK" data-i18n="device.label.COOK"></option>
                    <option value="DEFROST" data-i18n="device.label.DEFROST"></option>
                    <option value="DEHYDRATE" data-i18n="device.label.DEHYDRATE"></option>
                    <option value="FERMENT" data-i18n="device.label.FERMENT"></option>
                    <option value="FRY" data-i18n="device.label.FRY"></option>
                    <option value="GRILL" data-i18n="device.label.GRILL"></option>
                    <option value="KNEAD" data-i18n="device.label.KNEAD"></option>
                    <option value="MICROWAVE" data-i18n="device.label.MICROWAVE"></option>
                    <option value="MIX" data-i18n="device.label.MIX"></option>
                    <option value="PRESSURE_COOK" data-i18n="device.label.PRESSURE_COOK"></option>
                    <option value="PUREE" data-i18n="device.label.PUREE"></option>
                    <option value="ROAST" data-i18n="device.label.ROAST"></option>
                    <option value="SAUTE" data-i18n="device.label.SAUTE"></option>
                    <option value="SLOW_COOK" data-i18n="device.label.SLOW_COOK"></option>
                    <option value="SOUS_VIDE" data-i18n="device.label.SOUS_VIDE"></option>
                    <option value="STEAM" data-i18n="device.label.STEAM"></option>
                    <option value="STEW" data-i18n="device.label.STEW"></option>
                    <option value="STIR" data-i18n="device.label.STIR"></option>
                    <option value="WARM" data-i18n="device.label.WARM"></option>
                    <option value="WHIP" data-i18n="device.label.WHIP"></option>
                </select>
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-food_presets_file"><i class="fa fa-file"></i> <span data-i18n="device.label.food_presets_file"></span></label>
                <input type="text" id="node-input-food_presets_file" data-i18n="[placeholder]device.placeholder.food_presets_file">
                <input type="hidden" id="node-input-food_presets_type">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-ct_cook"><i class="fa fa-tag"></i> <span data-i18n="device.label.challenge_type"></span></label>
                <select id="node-input-ct_cook" class="challenge_type">
                    <option value="" data-i18n="device.label.no_challenge"></option>
                    <option value="ackNeeded" data-i18n="device.label.ackNeeded"></option>
                    <option value="pinNeeded" data-i18n="device.label.pinNeeded"></option>
                </select>
            </div>
            
            <div class="form-row challenge_pin">
                <label style="width:auto" for="node-input-pin_cook"><i class="fa fa-tag"></i> <span data-i18n="device.label.pin"></span></label>
                <input type="text" id="node-input-pin_cook" data-i18n="[placeholder]device.placeholder.pin">
            </div>
            
        </div>
    </div>

    <!-- Dispense Trait-->
    <div class="form-row red-ui-editableList-border div_trait" id="dispense" style="background: #fbfbfb; padding: 5px;">
        <div class="form-row" id="cb_trait_dispense">
            <b><label style="width:auto" for="node-input-trait_dispense"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.dispense"></span></label></b>
            <input type="checkbox" id="node-input-trait_dispense" style="display:inline-block; width:auto; vertical-align:top;" class="cb_trait">
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/dispense"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div class="form-row label_trait" id="label_trait_dispense">
            <b><label style="width:auto"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.dispense"></span></label></b>
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/dispense"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div id="trait_dispense">
            <div class="form-row">
                <label style="width:auto" for="node-input-supported_dispense_items_file"><i class="fa fa-file"></i> <span data-i18n="device.label.supported_dispense_items_file"></span></label>
                <input type="text" id="node-input-supported_dispense_items_file" data-i18n="[placeholder]device.placeholder.supported_dispense_items_file">
                <input type="hidden" id="node-input-supported_dispense_items_type">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-supported_dispense_presets_file"><i class="fa fa-file"></i> <span data-i18n="device.label.supported_dispense_presets_file"></span></label>
                <input type="text" id="node-input-supported_dispense_presets_file" data-i18n="[placeholder]device.placeholder.supported_dispense_presets_file">
                <input type="hidden" id="node-input-supported_dispense_presets_type">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-ct_dispense"><i class="fa fa-tag"></i> <span data-i18n="device.label.challenge_type"></span></label>
                <select id="node-input-ct_dispense" class="challenge_type">
                    <option value="" data-i18n="device.label.no_challenge"></option>
                    <option value="ackNeeded" data-i18n="device.label.ackNeeded"></option>
                    <option value="pinNeeded" data-i18n="device.label.pinNeeded"></option>
                </select>
            </div>

            <div class="form-row challenge_pin">
                <label style="width:auto" for="node-input-pin_dispense"><i class="fa fa-tag"></i> <span data-i18n="device.label.pin"></span></label>
                <input type="text" id="node-input-pin_dispense" data-i18n="[placeholder]device.placeholder.pin">
            </div>

        </div>
    </div>

    <!-- Dock Trait-->
    <div class="form-row red-ui-editableList-border div_trait" id="dock" style="background: #fbfbfb; padding: 5px;">
        <div class="form-row" id="cb_trait_dock">
            <b><label style="width:auto" for="node-input-trait_dock"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.dock"></span></label></b>
            <input type="checkbox" id="node-input-trait_dock" style="display:inline-block; width:auto; vertical-align:top;" class="cb_trait">
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/dock"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div class="form-row label_trait" id="label_trait_dock">
            <b><label style="width:auto"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.dock"></span></label></b>
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/dock"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div id="trait_dock">
            <div class="form-row">
                <label style="width:auto" for="node-input-ct_dock"><i class="fa fa-tag"></i> <span data-i18n="device.label.challenge_type"></span></label>
                <select id="node-input-ct_dock" class="challenge_type">
                    <option value="" data-i18n="device.label.no_challenge"></option>
                    <option value="ackNeeded" data-i18n="device.label.ackNeeded"></option>
                    <option value="pinNeeded" data-i18n="device.label.pinNeeded"></option>
                </select>
            </div>
            
            <div class="form-row challenge_pin">
                <label style="width:auto" for="node-input-pin_dock"><i class="fa fa-tag"></i> <span data-i18n="device.label.pin"></span></label>
                <input type="text" id="node-input-pin_dock" data-i18n="[placeholder]device.placeholder.pin">
            </div>            
        </div>
    </div>

    <!-- EnergyStorage Trait-->
    <div class="form-row red-ui-editableList-border div_trait" id="energystorage" style="background: #fbfbfb; padding: 5px;">
        <div class="form-row" id="cb_trait_energystorage">
            <b><label style="width:auto" for="node-input-trait_energystorage"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.energystorage"></span></label></b>
            <input type="checkbox" id="node-input-trait_energystorage" style="display:inline-block; width:auto; vertical-align:top;" class="cb_trait">
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/energystorage"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div class="form-row label_trait" id="label_trait_energystorage">
            <b><label style="width:auto"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.energystorage"></span></label></b>
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/energystorage"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div id="trait_energystorage">
            <div class="form-row device-advanced">
                <label style="width:auto" for="node-input-query_only_energy_storage"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.query_only"></span></label>
                <input type="checkbox" id="node-input-query_only_energy_storage" style="display:inline-block; width:auto; vertical-align:top;">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-energy_storage_distance_unit_for_ux"><i class="fa fa-tag"></i> <span data-i18n="device.label.energy_storage_distance_unit_for_ux"></span></label>
                <select id="node-input-energy_storage_distance_unit_for_ux" >
                    <option value=""></option>
                    <option value="KILOMETERS" data-i18n="device.label.KILOMETERS"></option>
                    <option value="MILES" data-i18n="device.label.MILES"></option>
                </select>
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-is_rechargeable"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.is_rechargeable"></span></label>
                <input type="checkbox" id="node-input-is_rechargeable" style="display:inline-block; width:auto; vertical-align:top;">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-ct_energystorage"><i class="fa fa-tag"></i> <span data-i18n="device.label.challenge_type"></span></label>
                <select id="node-input-ct_energystorage" class="challenge_type">
                    <option value="" data-i18n="device.label.no_challenge"></option>
                    <option value="ackNeeded" data-i18n="device.label.ackNeeded"></option>
                    <option value="pinNeeded" data-i18n="device.label.pinNeeded"></option>
                </select>
            </div>
            
            <div class="form-row challenge_pin">
                <label style="width:auto" for="node-input-pin_energystorage"><i class="fa fa-tag"></i> <span data-i18n="device.label.pin"></span></label>
                <input type="text" id="node-input-pin_energystorage" data-i18n="[placeholder]device.placeholder.pin">
            </div>
            
        </div>
    </div>

    <!-- FanSpeed Trait-->
    <div class="form-row red-ui-editableList-border div_trait" id="fanspeed" style="background: #fbfbfb; padding: 5px;">
        <div class="form-row" id="cb_trait_fanspeed">
            <b><label style="width:auto" for="node-input-trait_fanspeed"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.fanspeed"></span></label></b>
            <input type="checkbox" id="node-input-trait_fanspeed" style="display:inline-block; width:auto; vertical-align:top;" class="cb_trait">
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/fanspeed"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div class="form-row label_trait" id="label_trait_fanspeed">
            <b><label style="width:auto"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.fanspeed"></span></label></b>
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/fanspeed"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div id="trait_fanspeed">
            <div class="form-row">
                <label style="width:auto" for="node-input-reversible"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.reversible"></span></label>
                <input type="checkbox" id="node-input-reversible" style="display:inline-block; width:auto; vertical-align:top;">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-supports_fan_speed_percent"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.supports_fan_speed_percent"></span></label>
                <input type="checkbox" id="node-input-supports_fan_speed_percent" style="display:inline-block; width:auto; vertical-align:top;">
            </div>

            <div class="form-row no_fan_speed_percent">
                <label style="width:auto" for="node-input-fan_speeds_ordered"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.fan_speeds_ordered"></span></label>
                <input type="checkbox" id="node-input-fan_speeds_ordered" style="display:inline-block; width:auto; vertical-align:top;">
            </div>

            <div class="form-row no_fan_speed_percent">
                <label style="width:auto" for="node-input-available_fan_speeds_file"><i class="fa fa-file"></i> <span data-i18n="device.label.available_fan_speeds_file"></span></label>
                <input type="text" id="node-input-available_fan_speeds_file" data-i18n="[placeholder]device.placeholder.available_fan_speeds_file">
                <input type="hidden" id="node-input-available_fan_speeds_type">
            </div>

            <div class="form-row device-advanced">
                <label style="width:auto" for="node-input-command_only_fanspeed"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.command_only"></span></label>
                <input type="checkbox" id="node-input-command_only_fanspeed" style="display:inline-block; width:auto; vertical-align:top;">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-ct_fanspeed"><i class="fa fa-tag"></i> <span data-i18n="device.label.challenge_type"></span></label>
                <select id="node-input-ct_fanspeed" class="challenge_type">
                    <option value="" data-i18n="device.label.no_challenge"></option>
                    <option value="ackNeeded" data-i18n="device.label.ackNeeded"></option>
                    <option value="pinNeeded" data-i18n="device.label.pinNeeded"></option>
                </select>
            </div>
            
            <div class="form-row challenge_pin">
                <label style="width:auto" for="node-input-pin_fanspeed"><i class="fa fa-tag"></i> <span data-i18n="device.label.pin"></span></label>
                <input type="text" id="node-input-pin_fanspeed" data-i18n="[placeholder]device.placeholder.pin">
            </div>            
        </div>
    </div>
    
    <!-- Fill Trait-->
    <div class="form-row red-ui-editableList-border div_trait" id="fill" style="background: #fbfbfb; padding: 5px;">
        <div class="form-row" id="cb_trait_fill">
            <b><label style="width:auto" for="node-input-trait_fill"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.fill"></span></label></b>
            <input type="checkbox" id="node-input-trait_fill" style="display:inline-block; width:auto; vertical-align:top;" class="cb_trait">
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/fill"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div class="form-row label_trait" id="label_trait_fill">
            <b><label style="width:auto"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.fill"></span></label></b>
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/fill"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div id="trait_fill">
            <div class="form-row">
                <label style="width:auto" for="node-input-available_fill_levels_file"><i class="fa fa-file"></i> <span data-i18n="device.label.available_fill_levels_file"></span></label>
                <input type="text" id="node-input-available_fill_levels_file" data-i18n="[placeholder]device.placeholder.available_fill_levels_file">
                <input type="hidden" id="node-input-available_fill_levels_type">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-ordered_fill_levels"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.ordered_fill_levels"></span></label>
                <input type="checkbox" id="node-input-ordered_fill_levels" style="display:inline-block; width:auto; vertical-align:top;">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-supports_fill_percent"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.supports_fill_percent"></span></label>
                <input type="checkbox" id="node-input-supports_fill_percent" style="display:inline-block; width:auto; vertical-align:top;">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-ct_fill"><i class="fa fa-tag"></i> <span data-i18n="device.label.challenge_type"></span></label>
                <select id="node-input-ct_fill" class="challenge_type">
                    <option value="" data-i18n="device.label.no_challenge"></option>
                    <option value="ackNeeded" data-i18n="device.label.ackNeeded"></option>
                    <option value="pinNeeded" data-i18n="device.label.pinNeeded"></option>
                </select>
            </div>
            
            <div class="form-row challenge_pin">
                <label style="width:auto" for="node-input-pin_fill"><i class="fa fa-tag"></i> <span data-i18n="device.label.pin"></span></label>
                <input type="text" id="node-input-pin_fill" data-i18n="[placeholder]device.placeholder.pin">
            </div>
            
        </div>
    </div>

    <!-- HumiditySetting Trait-->
    <div class="form-row red-ui-editableList-border div_trait" id="humiditysetting" style="background: #fbfbfb; padding: 5px;">
        <div class="form-row" id="cb_trait_humiditysetting">
            <b><label style="width:auto" for="node-input-trait_humiditysetting"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.humiditysetting"></span></label></b>
            <input type="checkbox" id="node-input-trait_humiditysetting" style="display:inline-block; width:auto; vertical-align:top;" class="cb_trait">
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/humiditysetting"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div class="form-row label_trait" id="label_trait_humiditysetting">
            <b><label style="width:auto"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.humiditysetting"></span></label></b>
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/humiditysetting"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div id="trait_humiditysetting">
            <div class="form-row">
                <label style="width:auto" for="node-input-min_percent"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.min_percent"></span></label>
                <input type="text" id="node-input-min_percent" data-i18n="[placeholder]device.placeholder.min_percent">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-max_percent"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.max_percent"></span></label>
                <input type="text" id="node-input-max_percent" data-i18n="[placeholder]device.placeholder.max_percent">
            </div>

            <div class="form-row device-advanced">
                <label style="width:auto" for="node-input-command_query_humiditysetting"><i class="fa fa-tag"></i> <span data-i18n="device.label.command_query"></span></label>
                <select style="width: fit-content" id="node-input-command_query_humiditysetting" >
                    <option value="" data-i18n="device.label.command_and_query"></option>
                    <option value="command" data-i18n="device.label.command_only"></option>
                    <option value="query" data-i18n="device.label.query_only"></option>
                </select>
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-ct_humiditysetting"><i class="fa fa-tag"></i> <span data-i18n="device.label.challenge_type"></span></label>
                <select id="node-input-ct_humiditysetting" class="challenge_type">
                    <option value="" data-i18n="device.label.no_challenge"></option>
                    <option value="ackNeeded" data-i18n="device.label.ackNeeded"></option>
                    <option value="pinNeeded" data-i18n="device.label.pinNeeded"></option>
                </select>
            </div>
            
            <div class="form-row challenge_pin">
                <label style="width:auto" for="node-input-pin_humiditysetting"><i class="fa fa-tag"></i> <span data-i18n="device.label.pin"></span></label>
                <input type="text" id="node-input-pin_humiditysetting" data-i18n="[placeholder]device.placeholder.pin">
            </div>
            
        </div>
    </div>
    
    <!-- InputSelector Trait-->
    <div class="form-row red-ui-editableList-border div_trait" id="inputselector" style="background: #fbfbfb; padding: 5px;">
        <div class="form-row" id="cb_trait_inputselector">
            <b><label style="width:auto" for="node-input-trait_inputselector"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.inputselector"></span></label></b>
            <input type="checkbox" id="node-input-trait_inputselector" style="display:inline-block; width:auto; vertical-align:top;" class="cb_trait">
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/inputselector"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div class="form-row label_trait" id="label_trait_inputselector">
            <b><label style="width:auto"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.inputselector"></span></label></b>
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/inputselector"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div id="trait_inputselector">
            <div class="form-row">
                <label style="width:auto" for="node-input-inputselector_file"><i class="fa fa-file"></i> <span data-i18n="device.label.inputselector_file"></span></label>
                <input type="text" id="node-input-inputselector_file" data-i18n="[placeholder]device.placeholder.inputselector_file">
                <input type="hidden" id="node-input-inputselector_type">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-ordered_inputs"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.ordered_inputs"></span></label>
                <input type="checkbox" id="node-input-ordered_inputs" style="display:inline-block; width:auto; vertical-align:top;">
            </div>

            <div class="form-row device-advanced">
                <label style="width:auto" for="node-input-command_only_input_selector"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.command_only"></span></label>
                <input type="checkbox" id="node-input-command_only_input_selector" style="display:inline-block; width:auto; vertical-align:top;">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-ct_inputselector"><i class="fa fa-tag"></i> <span data-i18n="device.label.challenge_type"></span></label>
                <select id="node-input-ct_inputselector" class="challenge_type">
                    <option value="" data-i18n="device.label.no_challenge"></option>
                    <option value="ackNeeded" data-i18n="device.label.ackNeeded"></option>
                    <option value="pinNeeded" data-i18n="device.label.pinNeeded"></option>
                </select>
            </div>
            
            <div class="form-row challenge_pin">
                <label style="width:auto" for="node-input-pin_inputselector"><i class="fa fa-tag"></i> <span data-i18n="device.label.pin"></span></label>
                <input type="text" id="node-input-pin_inputselector" data-i18n="[placeholder]device.placeholder.pin">
            </div>
            
        </div>
    </div>

    <!-- LightEffects Trait-->
    <div class="form-row red-ui-editableList-border div_trait" id="lighteffects" style="background: #fbfbfb; padding: 5px;">
        <div class="form-row" id="cb_trait_lighteffects">
            <b><label style="width:auto" for="node-input-trait_lighteffects"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.lighteffects"></span></label></b>
            <input type="checkbox" id="node-input-trait_lighteffects" style="display:inline-block; width:auto; vertical-align:top;" class="cb_trait">
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/lighteffects"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div class="form-row label_trait" id="label_trait_lighteffects">
            <b><label style="width:auto"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.lighteffects"></span></label></b>
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/lighteffects"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div id="trait_lighteffects">
            <div class="form-row">
                <label style="width:auto" for="node-input-default_sleep_duration"><i class="fa fa-tag"></i> <span data-i18n="device.label.default_sleep_duration"></span></label>
                <input type="text" id="node-input-default_sleep_duration" data-i18n="[placeholder]device.placeholder.default_sleep_duration">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-default_wake_duration"><i class="fa fa-tag"></i> <span data-i18n="device.label.default_wake_duration"></span></label>
                <input type="text" id="node-input-default_wake_duration" data-i18n="[placeholder]device.placeholder.default_wake_duration">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-supported_effects"><i class="fa fa-tag"></i> <span data-i18n="device.label.supported_effects"></span></label>
                <select multiple id="node-input-supported_effects" >
                    <option value="colorLoop" data-i18n="device.label.color_loop"></option>
                    <option value="sleep" data-i18n="device.label.sleep"></option>
                    <option value="wake" data-i18n="device.label.wake"></option>
                </select>
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-ct_lighteffects"><i class="fa fa-tag"></i> <span data-i18n="device.label.challenge_type"></span></label>
                <select id="node-input-ct_lighteffects" class="challenge_type">
                    <option value="" data-i18n="device.label.no_challenge"></option>
                    <option value="ackNeeded" data-i18n="device.label.ackNeeded"></option>
                    <option value="pinNeeded" data-i18n="device.label.pinNeeded"></option>
                </select>
            </div>
            
            <div class="form-row challenge_pin">
                <label style="width:auto" for="node-input-pin_lighteffects"><i class="fa fa-tag"></i> <span data-i18n="device.label.pin"></span></label>
                <input type="text" id="node-input-pin_lighteffects" data-i18n="[placeholder]device.placeholder.pin">
            </div>
            
        </div>
    </div>

    <!-- Locator Trait-->
    <div class="form-row red-ui-editableList-border div_trait" id="locator" style="background: #fbfbfb; padding: 5px;">
        <div class="form-row" id="cb_trait_locator">
            <b><label style="width:auto" for="node-input-trait_locator"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.locator"></span></label></b>
            <input type="checkbox" id="node-input-trait_locator" style="display:inline-block; width:auto; vertical-align:top;" class="cb_trait">
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/locator"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div class="form-row label_trait" id="label_trait_locator">
            <b><label style="width:auto"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.locator"></span></label></b>
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/locator"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div id="trait_locator">
            <div class="form-row">
                <label style="width:auto" for="node-input-ct_locator"><i class="fa fa-tag"></i> <span data-i18n="device.label.challenge_type"></span></label>
                <select id="node-input-ct_locator" class="challenge_type">
                    <option value="" data-i18n="device.label.no_challenge"></option>
                    <option value="ackNeeded" data-i18n="device.label.ackNeeded"></option>
                    <option value="pinNeeded" data-i18n="device.label.pinNeeded"></option>
                </select>
            </div>
            
            <div class="form-row challenge_pin">
                <label style="width:auto" for="node-input-pin_locator"><i class="fa fa-tag"></i> <span data-i18n="device.label.pin"></span></label>
                <input type="text" id="node-input-pin_locator" data-i18n="[placeholder]device.placeholder.pin">
            </div>
        </div>
    </div>

    <!-- LockUnlock Trait-->
    <div class="form-row red-ui-editableList-border div_trait" id="lockunlock" style="background: #fbfbfb; padding: 5px;">
        <div class="form-row" id="cb_trait_lockunlock">
            <b><label style="width:auto" for="node-input-trait_lockunlock"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.lockunlock"></span></label></b>
            <input type="checkbox" id="node-input-trait_lockunlock" style="display:inline-block; width:auto; vertical-align:top;" class="cb_trait">
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/lockunlock"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div class="form-row label_trait" id="label_trait_lockunlock">
            <b><label style="width:auto"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.lockunlock"></span></label></b>
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/lockunlock"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div id="trait_lockunlock">
            <div class="form-row">
                <label style="width:auto" for="node-input-ct_lockunlock"><i class="fa fa-tag"></i> <span data-i18n="device.label.challenge_type"></span></label>
                <select id="node-input-ct_lockunlock" class="challenge_type">
                    <option value="" data-i18n="device.label.no_challenge"></option>
                    <option value="ackNeeded" data-i18n="device.label.ackNeeded"></option>
                    <option value="pinNeeded" data-i18n="device.label.pinNeeded"></option>
                </select>
            </div>
            
            <div class="form-row challenge_pin">
                <label style="width:auto" for="node-input-pin_lockunlock"><i class="fa fa-tag"></i> <span data-i18n="device.label.pin"></span></label>
                <input type="text" id="node-input-pin_lockunlock" data-i18n="[placeholder]device.placeholder.pin">
            </div>
        </div>
    </div>
    
    <!-- MediaState Trait-->
    <div class="form-row red-ui-editableList-border div_trait" id="mediastate" style="background: #fbfbfb; padding: 5px;">
        <div class="form-row" id="cb_trait_mediastate">
            <b><label style="width:auto" for="node-input-trait_mediastate"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.mediastate"></span></label></b>
            <input type="checkbox" id="node-input-trait_mediastate" style="display:inline-block; width:auto; vertical-align:top;" class="cb_trait">
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/mediastate"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div class="form-row label_trait" id="label_trait_mediastate">
            <b><label style="width:auto"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.mediastate"></span></label></b>
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/mediastate"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div id="trait_mediastate">
            <div class="form-row">
                <label style="width:auto" for="node-input-support_activity_state"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.support_activity_state"></span></label>
                <input type="checkbox" id="node-input-support_activity_state" style="display:inline-block; width:auto; vertical-align:top;">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-support_playback_state"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.support_playback_state"></span></label>
                <input type="checkbox" id="node-input-support_playback_state" style="display:inline-block; width:auto; vertical-align:top;">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-ct_mediastate"><i class="fa fa-tag"></i> <span data-i18n="device.label.challenge_type"></span></label>
                <select id="node-input-ct_mediastate" class="challenge_type">
                    <option value="" data-i18n="device.label.no_challenge"></option>
                    <option value="ackNeeded" data-i18n="device.label.ackNeeded"></option>
                    <option value="pinNeeded" data-i18n="device.label.pinNeeded"></option>
                </select>
            </div>
            
            <div class="form-row challenge_pin">
                <label style="width:auto" for="node-input-pin_mediastate"><i class="fa fa-tag"></i> <span data-i18n="device.label.pin"></span></label>
                <input type="text" id="node-input-pin_mediastate" data-i18n="[placeholder]device.placeholder.pin">
            </div>
            
        </div>
    </div>

    <!-- Modes Trait-->
    <div class="form-row red-ui-editableList-border div_trait" id="modes" style="background: #fbfbfb; padding: 5px;">
        <div class="form-row" id="cb_trait_modes">
            <b><label style="width:auto" for="node-input-trait_modes"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.modes"></span></label></b>
            <input type="checkbox" id="node-input-trait_modes" style="display:inline-block; width:auto; vertical-align:top;" class="cb_trait">
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/modes"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div class="form-row label_trait" id="label_trait_modes">
            <b><label style="width:auto"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.modes"></span></label></b>
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/modes"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div id="trait_modes">
            <div class="form-row">
                <label style="width:auto" for="node-input-modes_file"><i class="fa fa-file"></i> <span data-i18n="device.label.modes_file"></span></label>
                <input type="text" id="node-input-modes_file" data-i18n="[placeholder]device.placeholder.modes_file">
                <input type="hidden" id="node-input-modes_type">
            </div>

            <div class="form-row device-advanced">
                <label style="width:auto" for="node-input-command_query_modes"><i class="fa fa-tag"></i> <span data-i18n="device.label.command_query"></span></label>
                <select style="width: fit-content" id="node-input-command_query_modes" >
                    <option value="command" data-i18n="device.label.command_only"></option>
                    <option value="query" data-i18n="device.label.query_only"></option>
                    <option value="" data-i18n="device.label.command_and_query"></option>
                </select>
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-ct_modes"><i class="fa fa-tag"></i> <span data-i18n="device.label.challenge_type"></span></label>
                <select id="node-input-ct_modes" class="challenge_type">
                    <option value="" data-i18n="device.label.no_challenge"></option>
                    <option value="ackNeeded" data-i18n="device.label.ackNeeded"></option>
                    <option value="pinNeeded" data-i18n="device.label.pinNeeded"></option>
                </select>
            </div>
            
            <div class="form-row challenge_pin">
                <label style="width:auto" for="node-input-pin_modes"><i class="fa fa-tag"></i> <span data-i18n="device.label.pin"></span></label>
                <input type="text" id="node-input-pin_modes" data-i18n="[placeholder]device.placeholder.pin">
            </div>
            
        </div>
    </div>

    <!-- NetworkControl Trait-->
    <div class="form-row red-ui-editableList-border div_trait" id="networkcontrol" style="background: #fbfbfb; padding: 5px;">
        <div class="form-row" id="cb_trait_networkcontrol">
            <b><label style="width:auto" for="node-input-trait_networkcontrol"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.networkcontrol"></span></label></b>
            <input type="checkbox" id="node-input-trait_networkcontrol" style="display:inline-block; width:auto; vertical-align:top;" class="cb_trait">
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/networkcontrol"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div class="form-row label_trait" id="label_trait_networkcontrol">
            <b><label style="width:auto"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.networkcontrol"></span></label></b>
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/networkcontrol"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div id="trait_networkcontrol">
            <div class="form-row">
                <label style="width:auto" for="node-input-supports_enabling_guest_network"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.supports_enabling_guest_network"></span></label>
                <input type="checkbox" id="node-input-supports_enabling_guest_network" style="display:inline-block; width:auto; vertical-align:top;">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-supports_disabling_guest_network"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.supports_disabling_guest_network"></span></label>
                <input type="checkbox" id="node-input-supports_disabling_guest_network" style="display:inline-block; width:auto; vertical-align:top;">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-supports_getting_guest_network_password"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.supports_getting_guest_network_password"></span></label>
                <input type="checkbox" id="node-input-supports_getting_guest_network_password" style="display:inline-block; width:auto; vertical-align:top;">
            </div>

            <div class="form-row" style="margin-bottom:0;">
                <label><i class="fa fa-list"></i> <span data-i18n="device.label.network_profiles"></span></label>
            </div>
            <div class="form-row node-input-device-network-profiles-container-row">
                <ol id="node-input-device-network-profiles-container"></ol>
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-supports_enabling_network_profile"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.supports_enabling_network_profile"></span></label>
                <input type="checkbox" id="node-input-supports_enabling_network_profile" style="display:inline-block; width:auto; vertical-align:top;">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-supports_disabling_network_profile"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.supports_disabling_network_profile"></span></label>
                <input type="checkbox" id="node-input-supports_disabling_network_profile" style="display:inline-block; width:auto; vertical-align:top;">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-supports_network_download_speedtest"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.supports_network_download_speedtest"></span></label>
                <input type="checkbox" id="node-input-supports_network_download_speedtest" style="display:inline-block; width:auto; vertical-align:top;">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-supports_network_upload_speedtest"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.supports_network_upload_speedtest"></span></label>
                <input type="checkbox" id="node-input-supports_network_upload_speedtest" style="display:inline-block; width:auto; vertical-align:top;">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-ct_networkcontrol"><i class="fa fa-tag"></i> <span data-i18n="device.label.challenge_type"></span></label>
                <select id="node-input-ct_networkcontrol" class="challenge_type">
                    <option value="" data-i18n="device.label.no_challenge"></option>
                    <option value="ackNeeded" data-i18n="device.label.ackNeeded"></option>
                    <option value="pinNeeded" data-i18n="device.label.pinNeeded"></option>
                </select>
            </div>
            
            <div class="form-row challenge_pin">
                <label style="width:auto" for="node-input-pin_networkcontrol"><i class="fa fa-tag"></i> <span data-i18n="device.label.pin"></span></label>
                <input type="text" id="node-input-pin_networkcontrol" data-i18n="[placeholder]device.placeholder.pin">
            </div>
            
        </div>
    </div>

    <!-- ObjectDetection Trait-->
    <div class="form-row red-ui-editableList-border div_trait" id="objectdetection" style="background: #fbfbfb; padding: 5px;">
        <div class="form-row" id="cb_trait_objectdetection">
            <b><label style="width:auto" for="node-input-trait_objectdetection"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.objectdetection"></span></label></b>
            <input type="checkbox" id="node-input-trait_objectdetection" style="display:inline-block; width:auto; vertical-align:top;" class="cb_trait">
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/objectdetection"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div class="form-row label_trait" id="label_trait_objectdetection">
            <b><label style="width:auto"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.objectdetection"></span></label></b>
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/objectdetection"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div id="trait_objectdetection">
            <div class="form-row">
                <label style="width:auto" for="node-input-ct_objectdetection"><i class="fa fa-tag"></i> <span data-i18n="device.label.challenge_type"></span></label>
                <select id="node-input-ct_objectdetection" class="challenge_type">
                    <option value="" data-i18n="device.label.no_challenge"></option>
                    <option value="ackNeeded" data-i18n="device.label.ackNeeded"></option>
                    <option value="pinNeeded" data-i18n="device.label.pinNeeded"></option>
                </select>
            </div>
            
            <div class="form-row challenge_pin">
                <label style="width:auto" for="node-input-pin_objectdetection"><i class="fa fa-tag"></i> <span data-i18n="device.label.pin"></span></label>
                <input type="text" id="node-input-pin_objectdetection" data-i18n="[placeholder]device.placeholder.pin">
            </div>
        </div>
    </div>

    <!-- OccupancySensing Trait-->
    <div class="form-row red-ui-editableList-border div_trait" id="occupancysensing" style="background: #fbfbfb; padding: 5px;">
        <div class="form-row" id="cb_trait_occupancysensing">
            <b><label style="width:auto" for="node-input-trait_occupancysensing"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.occupancysensing"></span></label></b>
            <input type="checkbox" id="node-input-trait_occupancysensing" style="display:inline-block; width:auto; vertical-align:top;" class="cb_trait">
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/occupancysensing"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div class="form-row label_trait" id="label_trait_occupancysensing">
            <b><label style="width:auto"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.occupancysensing"></span></label></b>
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/occupancysensing"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div id="trait_occupancysensing">

            <div class="form-row">
                <label style="width:auto" for="node-input-occupancy_sensing_pir"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.occupancy_sensing_pir"></span></label>
                <input type="checkbox" id="node-input-occupancy_sensing_pir" style="display:inline-block; width:auto; vertical-align:top;">
            </div>

            <div class="form-row occupancy_sensing_pir">
                <label style="width:auto" for="node-input-occupied_to_unoccupied_delay_sec_pir"><i class="fa fa-tag"></i> <span data-i18n="device.label.occupied_to_unoccupied_delay_sec"></span></label>
                <input type="text" id="node-input-occupied_to_unoccupied_delay_sec_pir" data-i18n="[placeholder]device.placeholder.occupied_to_unoccupied_delay_sec">
            </div>

            <div class="form-row occupancy_sensing_pir">
                <label style="width:auto" for="node-input-unoccupied_to_occupied_delay_sec_pir"1><i class="fa fa-tag"></i> <span data-i18n="device.label.unoccupied_to_occupied_delay_sec"></span></label>
                <input type="text" id="node-input-unoccupied_to_occupied_delay_sec_pir" data-i18n="[placeholder]device.placeholder.unoccupied_to_occupied_delay_sec">
            </div>

            <div class="form-row occupancy_sensing_pir">
                <label style="width:auto" for="node-input-unoccupied_to_occupied_event_threshold_pir"1><i class="fa fa-tag"></i> <span data-i18n="device.label.unoccupied_to_occupied_event_threshold"></span></label>
                <input type="text" id="node-input-unoccupied_to_occupied_event_threshold_pir" data-i18n="[placeholder]device.placeholder.unoccupied_to_occupied_event_threshold">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-occupancy_sensing_ultrasonic"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.occupancy_sensing_ultrasonic"></span></label>
                <input type="checkbox" id="node-input-occupancy_sensing_ultrasonic" style="display:inline-block; width:auto; vertical-align:top;">
            </div>

            <div class="form-row occupancy_sensing_ultrasonic">
                <label style="width:auto" for="node-input-occupied_to_unoccupied_delay_sec_ultrasonic"><i class="fa fa-tag"></i> <span data-i18n="device.label.occupied_to_unoccupied_delay_sec"></span></label>
                <input type="text" id="node-input-occupied_to_unoccupied_delay_sec_ultrasonic" data-i18n="[placeholder]device.placeholder.occupied_to_unoccupied_delay_sec">
            </div>

            <div class="form-row occupancy_sensing_ultrasonic">
                <label style="width:auto" for="node-input-unoccupied_to_occupied_delay_sec_ultrasonic"1><i class="fa fa-tag"></i> <span data-i18n="device.label.unoccupied_to_occupied_delay_sec"></span></label>
                <input type="text" id="node-input-unoccupied_to_occupied_delay_sec_ultrasonic" data-i18n="[placeholder]device.placeholder.unoccupied_to_occupied_delay_sec">
            </div>

            <div class="form-row occupancy_sensing_ultrasonic">
                <label style="width:auto" for="node-input-unoccupied_to_occupied_event_threshold_ultrasonic"1><i class="fa fa-tag"></i> <span data-i18n="device.label.unoccupied_to_occupied_event_threshold"></span></label>
                <input type="text" id="node-input-unoccupied_to_occupied_event_threshold_ultrasonic" data-i18n="[placeholder]device.placeholder.unoccupied_to_occupied_event_threshold">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-occupancy_sensing_physical_contact"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.occupancy_sensing_physical_contact"></span></label>
                <input type="checkbox" id="node-input-occupancy_sensing_physical_contact" style="display:inline-block; width:auto; vertical-align:top;">
            </div>

            <div class="form-row occupancy_sensing_physical_contact">
                <label style="width:auto" for="node-input-occupied_to_unoccupied_delay_sec_physical_contact"><i class="fa fa-tag"></i> <span data-i18n="device.label.occupied_to_unoccupied_delay_sec"></span></label>
                <input type="text" id="node-input-occupied_to_unoccupied_delay_sec_physical_contact" data-i18n="[placeholder]device.placeholder.occupied_to_unoccupied_delay_sec">
            </div>

            <div class="form-row occupancy_sensing_physical_contact">
                <label style="width:auto" for="node-input-unoccupied_to_occupied_delay_sec_physical_contact"1><i class="fa fa-tag"></i> <span data-i18n="device.label.unoccupied_to_occupied_delay_sec"></span></label>
                <input type="text" id="node-input-unoccupied_to_occupied_delay_sec_physical_contact" data-i18n="[placeholder]device.placeholder.unoccupied_to_occupied_delay_sec">
            </div>

            <div class="form-row occupancy_sensing_physical_contact">
                <label style="width:auto" for="node-input-unoccupied_to_occupied_event_threshold_physical_contact"1><i class="fa fa-tag"></i> <span data-i18n="device.label.unoccupied_to_occupied_event_threshold"></span></label>
                <input type="text" id="node-input-unoccupied_to_occupied_event_threshold_physical_contact" data-i18n="[placeholder]device.placeholder.unoccupied_to_occupied_event_threshold">
            </div>
        </div>
    </div>

    <!-- OnOff Trait-->
    <div class="form-row red-ui-editableList-border div_trait" id="onoff" style="background: #fbfbfb; padding: 5px;">
        <div class="form-row" id="cb_trait_onoff">
            <b><label style="width:auto" for="node-input-trait_onoff"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.onoff"></span></label></b>
            <input type="checkbox" id="node-input-trait_onoff" style="display:inline-block; width:auto; vertical-align:top;" class="cb_trait">
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/onoff"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div class="form-row label_trait" id="label_trait_onoff">
            <b><label style="width:auto"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.onoff"></span></label></b>
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/onoff"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div id="trait_onoff">
            <div class="form-row device-advanced">
                <label style="width:auto" for="node-input-command_query_onoff"><i class="fa fa-tag"></i> <span data-i18n="device.label.command_query"></span></label>
                <select style="width: fit-content" id="node-input-command_query_onoff" >
                    <option value="" data-i18n="device.label.command_and_query"></option>
                    <option value="command" data-i18n="device.label.command_only"></option>
                    <option value="query" data-i18n="device.label.query_only"></option>
                </select>
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-ct_onoff"><i class="fa fa-tag"></i> <span data-i18n="device.label.challenge_type"></span></label>
                <select id="node-input-ct_onoff" class="challenge_type">
                    <option value="" data-i18n="device.label.no_challenge"></option>
                    <option value="ackNeeded" data-i18n="device.label.ackNeeded"></option>
                    <option value="pinNeeded" data-i18n="device.label.pinNeeded"></option>
                </select>
            </div>
            
            <div class="form-row challenge_pin">
                <label style="width:auto" for="node-input-pin_onoff"><i class="fa fa-tag"></i> <span data-i18n="device.label.pin"></span></label>
                <input type="text" id="node-input-pin_onoff" data-i18n="[placeholder]device.placeholder.pin">
            </div>
            
        </div>
    </div>
    
    <!-- OpenClose Trait-->
    <div class="form-row red-ui-editableList-border div_trait" id="openclose" style="background: #fbfbfb; padding: 5px;">
        <div class="form-row" id="cb_trait_openclose">
            <b><label style="width:auto" for="node-input-trait_openclose"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.openclose"></span></label></b>
            <input type="checkbox" id="node-input-trait_openclose" style="display:inline-block; width:auto; vertical-align:top;" class="cb_trait">
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/openclose"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div class="form-row label_trait" id="label_trait_openclose">
            <b><label style="width:auto"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.openclose"></span></label></b>
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/openclose"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div id="trait_openclose">
            <div class="form-row">
                <label style="width:auto" for="node-input-discrete_only_openclose"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.discrete_only_openclose"></span></label>
                <input type="checkbox" id="node-input-discrete_only_openclose" style="display:inline-block; width:auto; vertical-align:top;">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-open_direction"><i class="fa fa-tag"></i> <span data-i18n="device.label.open_direction"></span></label>
                <select multiple id="node-input-open_direction" >
                    <option value="UP" data-i18n="device.label.up"></option>
                    <option value="DOWN" data-i18n="device.label.down"></option>
                    <option value="LEFT" data-i18n="device.label.left"></option>
                    <option value="RIGHT" data-i18n="device.label.right"></option>
                    <option value="IN" data-i18n="device.label.in"></option>
                    <option value="OUT" data-i18n="device.label.out"></option>
                </select>
            </div>

            <div class="form-row device-advanced">
                <label style="width:auto" for="node-input-command_query_openclose"><i class="fa fa-tag"></i> <span data-i18n="device.label.command_query"></span></label>
                <select style="width: fit-content" id="node-input-command_query_openclose" >
                    <option value="" data-i18n="device.label.command_and_query"></option>
                    <option value="command" data-i18n="device.label.command_only"></option>
                    <option value="query" data-i18n="device.label.query_only"></option>
                </select>
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-ct_openclose"><i class="fa fa-tag"></i> <span data-i18n="device.label.challenge_type"></span></label>
                <select id="node-input-ct_openclose" class="challenge_type">
                    <option value="" data-i18n="device.label.no_challenge"></option>
                    <option value="ackNeeded" data-i18n="device.label.ackNeeded"></option>
                    <option value="pinNeeded" data-i18n="device.label.pinNeeded"></option>
                </select>
            </div>
            
            <div class="form-row challenge_pin">
                <label style="width:auto" for="node-input-pin_openclose"><i class="fa fa-tag"></i> <span data-i18n="device.label.pin"></span></label>
                <input type="text" id="node-input-pin_openclose" data-i18n="[placeholder]device.placeholder.pin">
            </div>
            
        </div>
    </div>

    <!-- Reboot Trait-->
    <div class="form-row red-ui-editableList-border div_trait" id="reboot" style="background: #fbfbfb; padding: 5px;">
        <div class="form-row" id="cb_trait_reboot">
            <b><label style="width:auto" for="node-input-trait_reboot"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.reboot"></span></label></b>
            <input type="checkbox" id="node-input-trait_reboot" style="display:inline-block; width:auto; vertical-align:top;" class="cb_trait">
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/reboot"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div class="form-row label_trait" id="label_trait_reboot">
            <b><label style="width:auto"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.reboot"></span></label></b>
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/reboot"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div id="trait_reboot">
            <div class="form-row">
                <label style="width:auto" for="node-input-ct_reboot"><i class="fa fa-tag"></i> <span data-i18n="device.label.challenge_type"></span></label>
                <select id="node-input-ct_reboot" class="challenge_type">
                    <option value="" data-i18n="device.label.no_challenge"></option>
                    <option value="ackNeeded" data-i18n="device.label.ackNeeded"></option>
                    <option value="pinNeeded" data-i18n="device.label.pinNeeded"></option>
                </select>
            </div>
            
            <div class="form-row challenge_pin">
                <label style="width:auto" for="node-input-pin_reboot"><i class="fa fa-tag"></i> <span data-i18n="device.label.pin"></span></label>
                <input type="text" id="node-input-pin_reboot" data-i18n="[placeholder]device.placeholder.pin">
            </div>
        </div>
    </div>

    <!-- Rotation Trait-->
    <div class="form-row red-ui-editableList-border div_trait" id="rotation" style="background: #fbfbfb; padding: 5px;">
        <div class="form-row" id="cb_trait_rotation">
            <b><label style="width:auto" for="node-input-trait_rotation"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.rotation"></span></label></b>
            <input type="checkbox" id="node-input-trait_rotation" style="display:inline-block; width:auto; vertical-align:top;" class="cb_trait">
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/rotation"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div class="form-row label_trait" id="label_trait_rotation">
            <b><label style="width:auto"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.rotation"></span></label></b>
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/rotation"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div id="trait_rotation">
            <div class="form-row">
                <label style="width:auto" for="node-input-supports_degrees"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.supports_degrees"></span></label>
                <input type="checkbox" id="node-input-supports_degrees" style="display:inline-block; width:auto; vertical-align:top;">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-supports_percent"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.supports_percent"></span></label>
                <input type="checkbox" id="node-input-supports_percent" style="display:inline-block; width:auto; vertical-align:top;">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-rotation_degrees_min"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.rotation_degrees_min"></span></label>
                <input type="text" id="node-input-rotation_degrees_min" data-i18n="[placeholder]device.placeholder.rotation_degrees_min">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-rotation_degrees_max"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.rotation_degrees_max"></span></label>
                <input type="text" id="node-input-rotation_degrees_max" data-i18n="[placeholder]device.placeholder.rotation_degrees_max">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-supports_continuous_rotation"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.supports_continuous_rotation"></span></label>
                <input type="checkbox" id="node-input-supports_continuous_rotation" style="display:inline-block; width:auto; vertical-align:top;">
            </div>

            <div class="form-row device-advanced">
                <label style="width:auto" for="node-input-command_only_rotation"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.command_only"></span></label>
                <input type="checkbox" id="node-input-command_only_rotation" style="display:inline-block; width:auto; vertical-align:top;">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-ct_rotation"><i class="fa fa-tag"></i> <span data-i18n="device.label.challenge_type"></span></label>
                <select id="node-input-ct_rotation" class="challenge_type">
                    <option value="" data-i18n="device.label.no_challenge"></option>
                    <option value="ackNeeded" data-i18n="device.label.ackNeeded"></option>
                    <option value="pinNeeded" data-i18n="device.label.pinNeeded"></option>
                </select>
            </div>
            
            <div class="form-row challenge_pin">
                <label style="width:auto" for="node-input-pin_rotation"><i class="fa fa-tag"></i> <span data-i18n="device.label.pin"></span></label>
                <input type="text" id="node-input-pin_rotation" data-i18n="[placeholder]device.placeholder.pin">
            </div>
            
        </div>
    </div>
    
    <!-- RunCycle Trait-->
    <div class="form-row red-ui-editableList-border div_trait" id="runcycle" style="background: #fbfbfb; padding: 5px;">
        <div class="form-row" id="cb_trait_runcycle">
            <b><label style="width:auto" for="node-input-trait_runcycle"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.runcycle"></span></label></b>
            <input type="checkbox" id="node-input-trait_runcycle" style="display:inline-block; width:auto; vertical-align:top;" class="cb_trait">
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/runcycle"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div class="form-row label_trait" id="label_trait_runcycle">
            <b><label style="width:auto"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.runcycle"></span></label></b>
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/runcycle"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div id="trait_runcycle">
            <div class="form-row">
                <label style="width:auto" for="node-input-ct_runcycle"><i class="fa fa-tag"></i> <span data-i18n="device.label.challenge_type"></span></label>
                <select id="node-input-ct_runcycle" class="challenge_type">
                    <option value="" data-i18n="device.label.no_challenge"></option>
                    <option value="ackNeeded" data-i18n="device.label.ackNeeded"></option>
                    <option value="pinNeeded" data-i18n="device.label.pinNeeded"></option>
                </select>
            </div>
            
            <div class="form-row challenge_pin">
                <label style="width:auto" for="node-input-pin_runcycle"><i class="fa fa-tag"></i> <span data-i18n="device.label.pin"></span></label>
                <input type="text" id="node-input-pin_runcycle" data-i18n="[placeholder]device.placeholder.pin">
            </div>
        </div>
    </div>

    <!-- Scene Trait-->
    <div class="form-row red-ui-editableList-border div_trait" id="scene" style="background: #fbfbfb; padding: 5px;">
        <div class="form-row" id="cb_trait_scene">
            <b><label style="width:auto" for="node-input-trait_scene"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.scene"></span></label></b>
            <input type="checkbox" id="node-input-trait_scene" style="display:inline-block; width:auto; vertical-align:top;" class="cb_trait">
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/scene"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div class="form-row label_trait" id="label_trait_scene">
            <b><label style="width:auto"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.scene"></span></label></b>
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/scene"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div id="trait_scene">
            <div class="form-row">
                <label style="width:auto" for="node-input-scene_reversible"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.scene_reversible"></span></label>
                <input type="checkbox" id="node-input-scene_reversible" style="display:inline-block; width:auto; vertical-align:top;">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-ct_scene"><i class="fa fa-tag"></i> <span data-i18n="device.label.challenge_type"></span></label>
                <select id="node-input-ct_scene" class="challenge_type">
                    <option value="" data-i18n="device.label.no_challenge"></option>
                    <option value="ackNeeded" data-i18n="device.label.ackNeeded"></option>
                    <option value="pinNeeded" data-i18n="device.label.pinNeeded"></option>
                </select>
            </div>
            
            <div class="form-row challenge_pin">
                <label style="width:auto" for="node-input-pin_scene"><i class="fa fa-tag"></i> <span data-i18n="device.label.pin"></span></label>
                <input type="text" id="node-input-pin_scene" data-i18n="[placeholder]device.placeholder.pin">
            </div>
            
        </div>
    </div>

    <!-- SensorState Trait-->
    <div class="form-row red-ui-editableList-border div_trait" id="sensorstate" style="background: #fbfbfb; padding: 5px;">
        <div class="form-row" id="cb_trait_sensorstate">
            <b><label style="width:auto" for="node-input-trait_sensorstate"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.sensorstate"></span></label></b>
            <input type="checkbox" id="node-input-trait_sensorstate" style="display:inline-block; width:auto; vertical-align:top;" class="cb_trait">
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/sensorstate"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div class="form-row label_trait" id="label_trait_sensorstate">
            <b><label style="width:auto"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.sensorstate"></span></label></b>
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/sensorstate"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div id="trait_sensorstate">
            <div class="form-row">
                <label style="width:auto" for="node-input-sensor_states_supported"><i class="fa fa-tag"></i> <span data-i18n="device.label.sensor_states_supported"></span></label>
                <select multiple id="node-input-sensor_states_supported" >
                    <option value="AirQuality" data-i18n="device.label.air_quality"></option>
                    <option value="CarbonMonoxideLevel" data-i18n="device.label.carbon_monoxide_level"></option>
                    <option value="SmokeLevel" data-i18n="device.label.smoke_level"></option>
                    <option value="FilterCleanliness" data-i18n="device.label.filter_cleanliness"></option>
                    <option value="WaterLeak" data-i18n="device.label.water_leak"></option>
                    <option value="RainDetection" data-i18n="device.label.rain_detection"></option>
                    <option value="FilterLifeTime" data-i18n="device.label.filter_life_time"></option>
                    <option value="PreFilterLifeTime" data-i18n="device.label.pre_filter_life_time"></option>
                    <option value="HEPAFilterLifeTime" data-i18n="device.label.hepa_filter_life_time"></option>
                    <option value="Max2FilterLifeTime" data-i18n="device.label.max2_filter_life_time"></option>
                    <option value="CarbonDioxideLevel" data-i18n="device.label.carbon_dioxide_level"></option>
                    <option value="PM2.5" data-i18n="device.label.PM2_5"></option>
                    <option value="PM10" data-i18n="device.label.PM10"></option>
                    <option value="VolatileOrganicCompounds" data-i18n="device.label.volatile_organic_compounds"></option>
                </select>
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-ct_sensorstate"><i class="fa fa-tag"></i> <span data-i18n="device.label.challenge_type"></span></label>
                <select id="node-input-ct_sensorstate" class="challenge_type">
                    <option value="" data-i18n="device.label.no_challenge"></option>
                    <option value="ackNeeded" data-i18n="device.label.ackNeeded"></option>
                    <option value="pinNeeded" data-i18n="device.label.pinNeeded"></option>
                </select>
            </div>
            
            <div class="form-row challenge_pin">
                <label style="width:auto" for="node-input-pin_sensorstate"><i class="fa fa-tag"></i> <span data-i18n="device.label.pin"></span></label>
                <input type="text" id="node-input-pin_sensorstate" data-i18n="[placeholder]device.placeholder.pin">
            </div>
            
        </div>
    </div>

    <!-- SoftwareUpdate Trait-->
    <div class="form-row red-ui-editableList-border div_trait" id="softwareupdate" style="background: #fbfbfb; padding: 5px;">
        <div class="form-row" id="cb_trait_softwareupdate">
            <b><label style="width:auto" for="node-input-trait_softwareupdate"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.softwareupdate"></span></label></b>
            <input type="checkbox" id="node-input-trait_softwareupdate" style="display:inline-block; width:auto; vertical-align:top;" class="cb_trait">
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/softwareupdate"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div class="form-row label_trait" id="label_trait_softwareupdate">
            <b><label style="width:auto"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.softwareupdate"></span></label></b>
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/softwareupdate"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div id="trait_softwareupdate">
            <div class="form-row">
                <label style="width:auto" for="node-input-ct_softwareupdate"><i class="fa fa-tag"></i> <span data-i18n="device.label.challenge_type"></span></label>
                <select id="node-input-ct_softwareupdate" class="challenge_type">
                    <option value="" data-i18n="device.label.no_challenge"></option>
                    <option value="ackNeeded" data-i18n="device.label.ackNeeded"></option>
                    <option value="pinNeeded" data-i18n="device.label.pinNeeded"></option>
                </select>
            </div>
            
            <div class="form-row challenge_pin">
                <label style="width:auto" for="node-input-pin_softwareupdate"><i class="fa fa-tag"></i> <span data-i18n="device.label.pin"></span></label>
                <input type="text" id="node-input-pin_softwareupdate" data-i18n="[placeholder]device.placeholder.pin">
            </div>
        </div>
    </div>

    <!-- StartStop Trait-->
    <div class="form-row red-ui-editableList-border div_trait" id="startstop" style="background: #fbfbfb; padding: 5px;">
        <div class="form-row" id="cb_trait_startstop">
            <b><label style="width:auto" for="node-input-trait_startstop"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.startstop"></span></label></b>
            <input type="checkbox" id="node-input-trait_startstop" style="display:inline-block; width:auto; vertical-align:top;" class="cb_trait">
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/startstop"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div class="form-row label_trait" id="label_trait_startstop">
            <b><label style="width:auto"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.startstop"></span></label></b>
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/startstop"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div id="trait_startstop">
            <div class="form-row">
                <label style="width:auto" for="node-input-pausable"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.pausable"></span></label>
                <input type="checkbox" id="node-input-pausable" style="display:inline-block; width:auto; vertical-align:top;">
            </div>

            <div class="form-row" style="margin-bottom:0;">
                <label><i class="fa fa-list"></i> <span data-i18n="device.label.available_zones"></span></label>
            </div>
            <div class="form-row node-input-device-zone-container-row">
                <ol id="node-input-device-zone-container"></ol>
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-ct_startstop"><i class="fa fa-tag"></i> <span data-i18n="device.label.challenge_type"></span></label>
                <select id="node-input-ct_startstop" class="challenge_type">
                    <option value="" data-i18n="device.label.no_challenge"></option>
                    <option value="ackNeeded" data-i18n="device.label.ackNeeded"></option>
                    <option value="pinNeeded" data-i18n="device.label.pinNeeded"></option>
                </select>
            </div>
            
            <div class="form-row challenge_pin">
                <label style="width:auto" for="node-input-pin_startstop"><i class="fa fa-tag"></i> <span data-i18n="device.label.pin"></span></label>
                <input type="text" id="node-input-pin_startstop" data-i18n="[placeholder]device.placeholder.pin">
            </div>
            
        </div>
    </div>
    
    <!-- StatusReport Trait-->
    <div class="form-row red-ui-editableList-border div_trait" id="statusreport" style="background: #fbfbfb; padding: 5px;">
        <div class="form-row" id="cb_trait_statusreport">
            <b><label style="width:auto" for="node-input-trait_statusreport"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.statusreport"></span></label></b>
            <input type="checkbox" id="node-input-trait_statusreport" style="display:inline-block; width:auto; vertical-align:top;" class="cb_trait">
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/statusreport"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div class="form-row label_trait" id="label_trait_statusreport">
            <b><label style="width:auto"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.statusreport"></span></label></b>
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/statusreport"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div id="trait_statusreport">
            <div class="form-row">
                <label style="width:auto" for="node-input-ct_statusreport"><i class="fa fa-tag"></i> <span data-i18n="device.label.challenge_type"></span></label>
                <select id="node-input-ct_statusreport" class="challenge_type">
                    <option value="" data-i18n="device.label.no_challenge"></option>
                    <option value="ackNeeded" data-i18n="device.label.ackNeeded"></option>
                    <option value="pinNeeded" data-i18n="device.label.pinNeeded"></option>
                </select>
            </div>
            
            <div class="form-row challenge_pin">
                <label style="width:auto" for="node-input-pin_statusreport"><i class="fa fa-tag"></i> <span data-i18n="device.label.pin"></span></label>
                <input type="text" id="node-input-pin_statusreport" data-i18n="[placeholder]device.placeholder.pin">
            </div>
        </div>
    </div>

    <!-- TemperatureControl Trait-->
    <div class="form-row red-ui-editableList-border div_trait" id="temperaturecontrol" style="background: #fbfbfb; padding: 5px;">
        <div class="form-row" id="cb_trait_temperaturecontrol">
            <b><label style="width:auto" for="node-input-trait_temperaturecontrol"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.temperaturecontrol"></span></label></b>
            <input type="checkbox" id="node-input-trait_temperaturecontrol" style="display:inline-block; width:auto; vertical-align:top;" class="cb_trait">
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/temperaturecontrol"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div class="form-row label_trait" id="label_trait_temperaturecontrol">
            <b><label style="width:auto"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.temperaturecontrol"></span></label></b>
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/temperaturecontrol"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div id="trait_temperaturecontrol">
            <div class="form-row">
                <label style="width:auto" for="node-input-tc_min_threshold_celsius"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.tc_min_threshold_celsius"></span></label>
                <input type="text" id="node-input-tc_min_threshold_celsius" data-i18n="[placeholder]device.placeholder.tc_min_threshold_celsius">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-tc_max_threshold_celsius"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.tc_max_threshold_celsius"></span></label>
                <input type="text" id="node-input-tc_max_threshold_celsius" data-i18n="[placeholder]device.placeholder.tc_max_threshold_celsius">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-tc_temperature_step_celsius"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.tc_temperature_step_celsius"></span></label>
                <input type="text" id="node-input-tc_temperature_step_celsius" data-i18n="[placeholder]device.placeholder.tc_temperature_step_celsius">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-tc_temperature_unit_for_ux"><i class="fa fa-tag"></i> <span data-i18n="device.label.tc_temperature_unit_for_ux"></span></label>
                <select id="node-input-tc_temperature_unit_for_ux" >
                    <option value="C" data-i18n="device.label._c"></option>
                    <option value="F" data-i18n="device.label._f"></option>
                </select>
            </div>

            <div class="form-row device-advanced">
                <label style="width:auto" for="node-input-tc_command_query_temperaturecontrol"><i class="fa fa-tag"></i> <span data-i18n="device.label.command_query"></span></label>
                <select style="width: fit-content" id="node-input-tc_command_query_temperaturecontrol" >
                    <option value="" data-i18n="device.label.command_and_query"></option>
                    <option value="command" data-i18n="device.label.command_only"></option>
                    <option value="query" data-i18n="device.label.query_only"></option>
                </select>
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-ct_temperaturecontrol"><i class="fa fa-tag"></i> <span data-i18n="device.label.challenge_type"></span></label>
                <select id="node-input-ct_temperaturecontrol" class="challenge_type">
                    <option value="" data-i18n="device.label.no_challenge"></option>
                    <option value="ackNeeded" data-i18n="device.label.ackNeeded"></option>
                    <option value="pinNeeded" data-i18n="device.label.pinNeeded"></option>
                </select>
            </div>
            
            <div class="form-row challenge_pin">
                <label style="width:auto" for="node-input-pin_temperaturecontrol"><i class="fa fa-tag"></i> <span data-i18n="device.label.pin"></span></label>
                <input type="text" id="node-input-pin_temperaturecontrol" data-i18n="[placeholder]device.placeholder.pin">
            </div>
            
        </div>
    </div>
    
    <!-- TemperatureSetting Trait-->
    <div class="form-row red-ui-editableList-border div_trait" id="temperaturesetting" style="background: #fbfbfb; padding: 5px;">
        <div class="form-row" id="cb_trait_temperaturesetting">
            <b><label style="width:auto" for="node-input-trait_temperaturesetting"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.temperaturesetting"></span></label></b>
            <input type="checkbox" id="node-input-trait_temperaturesetting" style="display:inline-block; width:auto; vertical-align:top;" class="cb_trait">
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/temperaturesetting"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div class="form-row label_trait" id="label_trait_temperaturesetting">
            <b><label style="width:auto"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.temperaturesetting"></span></label></b>
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/temperaturesetting"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div id="trait_temperaturesetting">
            <div class="form-row">
                <label style="width:auto" for="node-input-available_thermostat_modes"><i class="fa fa-tag"></i> <span data-i18n="device.label.available_thermostat_modes"></span></label>
                <select multiple id="node-input-available_thermostat_modes" >
                    <option value="off" data-i18n="device.label.off"></option>
                    <option value="heat" data-i18n="device.label.heat"></option>
                    <option value="cool" data-i18n="device.label.cool"></option>
                    <option value="on" data-i18n="device.label.on"></option>
                    <option value="heatcool" data-i18n="device.label.heatcool"></option>
                    <option value="auto" data-i18n="device.label.auto"></option>
                    <option value="fan-only" data-i18n="device.label.fan_only"></option>
                    <option value="purifier" data-i18n="device.label.purifier"></option>
                    <option value="eco" data-i18n="device.label.eco"></option>
                    <option value="dry" data-i18n="device.label.dry"></option>
                </select>
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-min_threshold_celsius"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.min_threshold_celsius"></span></label>
                <input type="text" id="node-input-min_threshold_celsius" data-i18n="[placeholder]device.placeholder.min_threshold_celsius">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-max_threshold_celsius"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.max_threshold_celsius"></span></label>
                <input type="text" id="node-input-max_threshold_celsius" data-i18n="[placeholder]device.placeholder.max_threshold_celsius">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-thermostat_temperature_unit"><i class="fa fa-tag"></i> <span data-i18n="device.label.thermostat_temperature_unit"></span></label>
                <select id="node-input-thermostat_temperature_unit" >
                    <option value="C" data-i18n="device.label._c"></option>
                    <option value="F" data-i18n="device.label._f"></option>
                </select>
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-buffer_range_celsius"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.buffer_range_celsius"></span></label>
                <input type="text" id="node-input-buffer_range_celsius" data-i18n="[placeholder]device.placeholder.buffer_range_celsius">
            </div>

            <div class="form-row device-advanced">
                <label style="width:auto" for="node-input-command_query_temperaturesetting"><i class="fa fa-tag"></i> <span data-i18n="device.label.command_query"></span></label>
                <select style="width: fit-content" id="node-input-command_query_temperaturesetting" >
                    <option value="" data-i18n="device.label.command_and_query"></option>
                    <option value="command" data-i18n="device.label.command_only"></option>
                    <option value="query" data-i18n="device.label.query_only"></option>
                </select>
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-ct_temperaturesetting"><i class="fa fa-tag"></i> <span data-i18n="device.label.challenge_type"></span></label>
                <select id="node-input-ct_temperaturesetting" class="challenge_type">
                    <option value="" data-i18n="device.label.no_challenge"></option>
                    <option value="ackNeeded" data-i18n="device.label.ackNeeded"></option>
                    <option value="pinNeeded" data-i18n="device.label.pinNeeded"></option>
                </select>
            </div>
            
            <div class="form-row challenge_pin">
                <label style="width:auto" for="node-input-pin_temperaturesetting"><i class="fa fa-tag"></i> <span data-i18n="device.label.pin"></span></label>
                <input type="text" id="node-input-pin_temperaturesetting" data-i18n="[placeholder]device.placeholder.pin">
            </div>
            
        </div>
    </div>

    <!-- Timer Trait-->
    <div class="form-row red-ui-editableList-border div_trait" id="timer" style="background: #fbfbfb; padding: 5px;">
        <div class="form-row" id="cb_trait_timer">
            <b><label style="width:auto" for="node-input-trait_timer"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.timer"></span></label></b>
            <input type="checkbox" id="node-input-trait_timer" style="display:inline-block; width:auto; vertical-align:top;" class="cb_trait">
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/timer"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div class="form-row label_trait" id="label_trait_timer">
            <b><label style="width:auto"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.timer"></span></label></b>
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/timer"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div id="trait_timer">
            <div class="form-row">
                <label style="width:auto" for="node-input-max_timer_limit_sec"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.max_timer_limit_sec"></span></label>
                <input type="text" id="node-input-max_timer_limit_sec" data-i18n="[placeholder]device.placeholder.max_timer_limit_sec">
            </div>

            <div class="form-row device-advanced">
                <label style="width:auto" for="node-input-command_only_timer"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.command_only"></span></label>
                <input type="checkbox" id="node-input-command_only_timer" style="display:inline-block; width:auto; vertical-align:top;">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-ct_timer"><i class="fa fa-tag"></i> <span data-i18n="device.label.challenge_type"></span></label>
                <select id="node-input-ct_timer" class="challenge_type">
                    <option value="" data-i18n="device.label.no_challenge"></option>
                    <option value="ackNeeded" data-i18n="device.label.ackNeeded"></option>
                    <option value="pinNeeded" data-i18n="device.label.pinNeeded"></option>
                </select>
            </div>
            
            <div class="form-row challenge_pin">
                <label style="width:auto" for="node-input-pin_timer"><i class="fa fa-tag"></i> <span data-i18n="device.label.pin"></span></label>
                <input type="text" id="node-input-pin_timer" data-i18n="[placeholder]device.placeholder.pin">
            </div>
            
        </div>
    </div>
    
    <!-- Toggles Trait-->
    <div class="form-row red-ui-editableList-border div_trait" id="toggles" style="background: #fbfbfb; padding: 5px;">
        <div class="form-row" id="cb_trait_toggles">
            <b><label style="width:auto" for="node-input-trait_toggles"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.toggles"></span></label></b>
            <input type="checkbox" id="node-input-trait_toggles" style="display:inline-block; width:auto; vertical-align:top;" class="cb_trait">
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/toggles"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div class="form-row label_trait" id="label_trait_toggles">
            <b><label style="width:auto"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.toggles"></span></label></b>
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/toggles"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div id="trait_toggles">
            <div class="form-row">
                <label style="width:auto" for="node-input-toggles_file"><i class="fa fa-file"></i> <span data-i18n="device.label.toggles_file"></span></label>
                <input type="text" id="node-input-toggles_file" data-i18n="[placeholder]device.placeholder.toggles_file">
                <input type="hidden" id="node-input-toggles_type">
            </div>

            <div class="form-row device-advanced">
                <label style="width:auto" for="node-input-command_query_toggles"><i class="fa fa-tag"></i> <span data-i18n="device.label.command_query"></span></label>
                <select style="width: fit-content" id="node-input-command_query_toggles" >
                    <option value="" data-i18n="device.label.command_and_query"></option>
                    <option value="command" data-i18n="device.label.command_only"></option>
                    <option value="query" data-i18n="device.label.query_only"></option>
                </select>
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-ct_toggles"><i class="fa fa-tag"></i> <span data-i18n="device.label.challenge_type"></span></label>
                <select id="node-input-ct_toggles" class="challenge_type">
                    <option value="" data-i18n="device.label.no_challenge"></option>
                    <option value="ackNeeded" data-i18n="device.label.ackNeeded"></option>
                    <option value="pinNeeded" data-i18n="device.label.pinNeeded"></option>
                </select>
            </div>
            
            <div class="form-row challenge_pin">
                <label style="width:auto" for="node-input-pin_toggles"><i class="fa fa-tag"></i> <span data-i18n="device.label.pin"></span></label>
                <input type="text" id="node-input-pin_toggles" data-i18n="[placeholder]device.placeholder.pin">
            </div>
            
        </div>
    </div>

    <!-- TransportControl Trait-->
    <div class="form-row red-ui-editableList-border div_trait" id="transportcontrol" style="background: #fbfbfb; padding: 5px;">
        <div class="form-row" id="cb_trait_transportcontrol">
            <b><label style="width:auto" for="node-input-trait_transportcontrol"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.transportcontrol"></span></label></b>
            <input type="checkbox" id="node-input-trait_transportcontrol" style="display:inline-block; width:auto; vertical-align:top;" class="cb_trait">
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/transportcontrol"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div class="form-row label_trait" id="label_trait_transportcontrol">
            <b><label style="width:auto"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.transportcontrol"></span></label></b>
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/transportcontrol"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div id="trait_transportcontrol">
            <div class="form-row">
                <label style="width:auto" for="node-input-supported_commands"><i class="fa fa-tag"></i> <span data-i18n="device.label.supported_commands"></span></label>
                <select multiple id="node-input-supported_commands" >
                    <option value="CAPTION_CONTROL" data-i18n="device.label.caption_control"></option>
                    <option value="NEXT" data-i18n="device.label.next"></option>
                    <option value="PAUSE" data-i18n="device.label.pause"></option>
                    <option value="PREVIOUS" data-i18n="device.label.previous"></option>
                    <option value="RESUME" data-i18n="device.label.resume"></option>
                    <option value="SEEK_RELATIVE" data-i18n="device.label.seek_relative"></option>
                    <option value="SEEK_TO_POSITION" data-i18n="device.label.seek_to_position"></option>
                    <option value="SET_REPEAT" data-i18n="device.label.set_repeat"></option>
                    <option value="SHUFFLE" data-i18n="device.label.shuffle"></option>
                    <option value="STOP" data-i18n="device.label.stop"></option>
                </select>
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-ct_transportcontrol"><i class="fa fa-tag"></i> <span data-i18n="device.label.challenge_type"></span></label>
                <select id="node-input-ct_transportcontrol" class="challenge_type">
                    <option value="" data-i18n="device.label.no_challenge"></option>
                    <option value="ackNeeded" data-i18n="device.label.ackNeeded"></option>
                    <option value="pinNeeded" data-i18n="device.label.pinNeeded"></option>
                </select>
            </div>
            
            <div class="form-row challenge_pin">
                <label style="width:auto" for="node-input-pin_transportcontrol"><i class="fa fa-tag"></i> <span data-i18n="device.label.pin"></span></label>
                <input type="text" id="node-input-pin_transportcontrol" data-i18n="[placeholder]device.placeholder.pin">
            </div>
            
        </div>
    </div>

    <!-- Volume Trait-->
    <div class="form-row red-ui-editableList-border div_trait" id="volume" style="background: #fbfbfb; padding: 5px;">
        <div class="form-row" id="cb_trait_volume">
            <b><label style="width:auto" for="node-input-trait_volume"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.volume"></span></label></b>
            <input type="checkbox" id="node-input-trait_volume" style="display:inline-block; width:auto; vertical-align:top;" class="cb_trait">
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/volume"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div class="form-row label_trait" id="label_trait_volume">
            <b><label style="width:auto"><i class="fa fa-arrow-right"></i> <span data-i18n="device.trait.volume"></span></label></b>
            <a target="_blank" class="red-ui-palette-module-link" href="https://developers.google.com/assistant/smarthome/traits/volume"><i class="fa fa-external-link"></i></a>
            <a class="pull-right" href="#"><i class="fa fa-caret-down oc_trait"></i></a>
        </div>

        <div id="trait_volume">
            <div class="form-row">
                <label style="width:auto" for="node-input-volume_max_level"><i class="fa fa-tag"></i> <span data-i18n="device.label.volume_max_level"></span></label>
                <input type="text" id="node-input-volume_max_level" data-i18n="[placeholder]device.placeholder.volume_max_level">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-volume_can_mute_and_unmute"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.volume_can_mute_and_unmute"></span></label>
                <input type="checkbox" id="node-input-volume_can_mute_and_unmute" style="display:inline-block; width:auto; vertical-align:top;">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-volume_default_percentage"><i class="fa fa-tag"></i> <span data-i18n="device.label.volume_default_percentage"></span></label>
                <input type="text" id="node-input-volume_default_percentage" data-i18n="[placeholder]device.placeholder.volume_default_percentage">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-level_step_size"><i class="fa fa-tag"></i> <span data-i18n="device.label.level_step_size"></span></label>
                <input type="text" id="node-input-level_step_size" data-i18n="[placeholder]device.placeholder.level_step_size">
            </div>

            <div class="form-row device-advanced">
                <label style="width:auto" for="node-input-command_only_volume"><i class="fa fa-arrow-right"></i> <span data-i18n="device.label.command_only"></span></label>
                <input type="checkbox" id="node-input-command_only_volume" style="display:inline-block; width:auto; vertical-align:top;">
            </div>

            <div class="form-row">
                <label style="width:auto" for="node-input-ct_volume"><i class="fa fa-tag"></i> <span data-i18n="device.label.challenge_type"></span></label>
                <select id="node-input-ct_volume" class="challenge_type">
                    <option value="" data-i18n="device.label.no_challenge"></option>
                    <option value="ackNeeded" data-i18n="device.label.ackNeeded"></option>
                    <option value="pinNeeded" data-i18n="device.label.pinNeeded"></option>
                </select>
            </div>
            
            <div class="form-row challenge_pin">
                <label style="width:auto" for="node-input-pin_volume"><i class="fa fa-tag"></i> <span data-i18n="device.label.pin"></span></label>
                <input type="text" id="node-input-pin_volume" data-i18n="[placeholder]device.placeholder.pin">
            </div>
            
        </div>
    </div>
    
    <!-- No Trait -->
    <div class="form-row red-ui-editableList-border" id="no_trait" style="background: #fbfbfb; padding: 5px;">
        <div class="form-row">
            <b><label style="width:auto"><i class="fa fa-exclamation-triangle"></i> <span data-i18n="device.errors.no-trait-selected"></span></label></b>
        </div>
    </div>
    
</script>

<script type="text/javascript">
    RED.nodes.registerType('google-device', {
        category: 'Google_SmartHome-function',
        paletteLabel: function () {
            return this._("device.label.node_name");
        },
        inputs: 1,
        outputs: 1,
        color: "#C0DEED",
        icon: "google-smarthome.png",
        label: function () {
            return this._('device.device_type.' + this.device_type) + " " + this.name;
        },
        labelStyle: function () {
            return this.name ? "node_label_italic" : ""
        },
        defaults: {
            client: {
                type: "googlesmarthome-client",
                required: true
            },
            name: {
                value: "", required: true
            },
            nicknames: {
                value: "", required: false
            },
            topic: {
                value: "", required: false
            },
            online: {
                value: true, required: false
            },
            room_hint: {
                value: "", required: false
            },
            device_type: {
                value: "UNKNOWN", required: true, validate: function (v) {
                    return v !== "UNKNOWN";
                }
            },
            trait_appselector: {
                value: false, required: false
            },
            trait_channel: {
                value: false, required: false
            },
            trait_inputselector: {
                value: false, required: false
            },
            trait_mediastate: {
                value: false, required: false
            },
            trait_onoff: {
                value: false, required: false
            },
            trait_transportcontrol: {
                value: false, required: false
            },
            trait_modes: {
                value: false, required: false
            },
            trait_volume: {
                value: false, required: false
            },
            trait_toggles: {
                value: false, required: false
            },
            trait_brightness: {
                value: false, required: false
            },
            trait_colorsetting: {
                value: false, required: false
            },
            appselector_file: {
                value: "applications_<id>.json", required: false, validate: RED.validators.typedInput('appselector_type')
            },
            appselector_type: {
                value: "str", required: false
            },
            channel_file: {
                value: "channels_<id>.json", required: false, validate: RED.validators.typedInput('channel_type')
            },
            channel_type: {
                value: "str", required: false
            },
            inputselector_file: {
                value: "inputs_<id>.json", required: false, validate: RED.validators.typedInput('inputselector_type')
            },
            inputselector_type: {
                value: "str", required: false
            },
            command_only_input_selector: {
                value: false, required: false
            },
            ordered_inputs: {
                value: false, required: false
            },
            support_activity_state: {
                value: false, required: false
            },
            support_playback_state: {
                value: false, required: false
            },
            command_query_onoff: {
                value: "", required: false
            },
            supported_commands: {
                value: ['CAPTION_CONTROL', 'NEXT', 'PAUSE', 'PREVIOUS', 'RESUME', 'SEEK_RELATIVE', 'SEEK_TO_POSITION', 'SET_REPEAT', 'SHUFFLE', 'STOP'], required: false
            },
            volume_max_level: {
                value: 100, required: true, validate: function (v) {
                    const n = parseInt(v);
                    const f = parseFloat(v);
                    return !isNaN(v) && Number.isInteger(f) && n >= 0;
                }
            },
            volume_can_mute_and_unmute: {
                value: true, required: false
            },
            volume_default_percentage: {
                value: 40, required: false, validate: function (v) {
                    const n = parseInt(v);
                    const f = parseFloat(v);
                    return !isNaN(v) && Number.isInteger(f) && n >= 0 && n <= 100;
                }
            },
            level_step_size: {
                value: 1, required: false, validate: function (v) {
                    const n = parseInt(v);
                    const f = parseFloat(v);
                    return !isNaN(v) && Number.isInteger(f) && n > 0;
                }
            },
            command_only_volume: {
                value: false, required: false
            },
            command_only_brightness: {
                value: false, required: false
            },
            command_only_colorsetting: {
                value: false, required: false
            },
            color_model: {
                value: "temp", required: false
            },
            temperature_min_k: {
                value: 2000, required: false, validate: function (v) {
                    const n = parseInt(v);
                    const f = parseFloat(v);
                    return !isNaN(v) && Number.isInteger(f) && n > 0;
                }
            },
            temperature_max_k: {
                value: 9000, required: false, function(v) {
                    const n = parseInt(v);
                    const f = parseFloat(v);
                    return !isNaN(v) && Number.isInteger(f) && n > 0;
                }
            },
            modes_file: {
                value: "modes_<id>.json", required: false, validate: RED.validators.typedInput('modes_type')
            },
            modes_type: {
                value: "str", required: false
            },
            command_query_modes: {
                value: "", required: false
            },
            toggles_file: {
                value: "toggles_<id>.json", required: false, validate: RED.validators.typedInput('toggles_type')
            },
            toggles_type: {
                value: "str", required: false
            },
            command_query_toggles: {
                value: "", required: false
            },
            trait_camerastream: {
                value: false, required: false
            },
            hls: {
                value: "", required: false
            },
            hls_app_id: {
                value: "", required: false
            },
            dash: {
                value: "", required: false
            },
            dash_app_id: {
                value: "", required: false
            },
            smooth_stream: {
                value: "", required: false
            },
            smooth_stream_app_id: {
                value: "", required: false
            },
            progressive_mp4: {
                value: "", required: false
            },
            progressive_mp4_app_id: {
                value: "", required: false
            },
            webrtc: {
                value: "", required: false
            },
            webrtc_offer: {
                value: "", required: false
            },
            webrtc_ice_servers: {
                value: "", required: false, validate: RED.validators.typedInput('webrtc_ice_servers_type')
            },
            webrtc_ice_servers_type: {
                value: "str", required: false
            },
            auth_token: {
                value: "", required: false
            },
            need_auth_token: {
                value: false, required: false
            },
            topic_filter: {
                value: false, required: false
            },
            passthru: {
                value: false, required: false
            },
            persistent_state: {
                value: false, required: false
            },
            trait_scene: {
                value: false, required: false
            },
            scene_reversible: {
                value: true, required: false
            },
            trait_timer: {
                value: false, required: false
            },
            trait_temperaturesetting: {
                value: false, required: false
            },
            max_timer_limit_sec: {
                value: 86400, required: false, validate: function (v) {
                    const n = parseInt(v);
                    const f = parseFloat(v);
                    return !isNaN(v) && Number.isInteger(f) && n > 0;
                }
            },
            command_only_timer: {
                value: false, required: false
            },
            available_thermostat_modes: {
                value: ["off", "heat", "cool", "on", "heatcool", "auto", "fan-only", "purifier", "eco", "dry"], required: false
            },
            min_threshold_celsius: {
                value: 0, required: false, validate: RED.validators.number()
            },
            max_threshold_celsius: {
                value: 40, required: false, validate: RED.validators.number()
            },
            thermostat_temperature_unit: {
                value: "C", required: false
            },
            buffer_range_celsius: {
                value: 2, required: false, validate: RED.validators.number()
            },
            command_query_temperaturesetting: {
                value: "", required: false
            },
            trait_temperaturecontrol: {
                value: false, required: false
            },
            tc_min_threshold_celsius: {
                value: 0, required: false, validate: RED.validators.number()
            },
            tc_max_threshold_celsius: {
                value: 40, required: false, validate: RED.validators.number()
            },
            tc_temperature_step_celsius: {
                value: 1, required: false, validate: RED.validators.number()
            },
            tc_temperature_unit_for_ux: {
                value: "C", required: false
            },
            tc_command_query_temperaturecontrol: {
                value: "", required: false
            },
            trait_humiditysetting: {
                value: false, required: false
            },
            min_percent: {
                value: 0, required: false, function(v) {
                    const n = parseInt(v);
                    const f = parseFloat(v);
                    return !isNaN(v) && Number.isInteger(f) && n > 0;
                }
            },
            max_percent: {
                value: 100, required: false, function(v) {
                    const n = parseInt(v);
                    const f = parseFloat(v);
                    return !isNaN(v) && Number.isInteger(f) && n > 0;
                }
            },
            command_query_humiditysetting: {
                value: "", required: false
            },
            trait_dock: {
                value: false, required: false
            },
            trait_locator: {
                value: false, required: false
            },
            trait_lockunlock: {
                value: false, required: false
            },
            trait_reboot: {
                value: false, required: false
            },
            trait_openclose: {
                value: false, required: false
            },
            discrete_only_openclose: {
                value: false, required: false
            },
            open_direction: {
                value: [], required: false
            },
            command_query_openclose: {
                value: "", required: false
            },
            trait_startstop: {
                value: false, required: false
            },
            pausable: {
                value: false, required: false
            },
            available_zones: {
                value: [], required: false
            },
            trait_runcycle: {
                value: false, required: false
            },
            trait_softwareupdate: {
                value: false, required: false
            },
            trait_rotation: {
                value: false, required: false
            },
            supports_degrees: {
                value: true, required: false
            },
            supports_percent: {
                value: true, required: false
            },
            rotation_degrees_min: {
                value: 0, required: false, function(v) {
                    const n = parseInt(v);
                    const f = parseFloat(v);
                    return !isNaN(v) && Number.isInteger(f) && n > 0;
                }
            },
            rotation_degrees_max: {
                value: 360, required: false, function(v) {
                    const n = parseInt(v);
                    const f = parseFloat(v);
                    return !isNaN(v) && Number.isInteger(f) && n > 0;
                }
            },
            supports_continuous_rotation: {
                value: false, required: false
            },
            command_only_rotation: {
                value: false, required: false
            },
            trait_lighteffects: {
                value: false, required: false
            },
            default_sleep_duration: {
                value: 1800, required: false, function(v) {
                    const n = parseInt(v);
                    const f = parseFloat(v);
                    return !isNaN(v) && Number.isInteger(f) && n > 0;
                }
            },
            default_wake_duration: {
                value: 1800, required: false, function(v) {
                    const n = parseInt(v);
                    const f = parseFloat(v);
                    return !isNaN(v) && Number.isInteger(f) && n > 0;
                }
            },
            supported_effects: {
                value: ["colorLoop", "sleep", "wake"], required: false
            },
            trait_statusreport: {
                value: false, required: false
            },
            trait_cook: {
                value: false, required: false
            },
            supported_cooking_modes: {
                value: [], required: false
            },
            food_presets_file: {
                value: 'foodPresets_<id>.json', required: false, validate: RED.validators.typedInput('food_presets_type')
            },
            food_presets_type: {
                value: "str", required: false
            },
            trait_fanspeed: {
                value: false, required: false
            },
            reversible: {
                value: false, required: false
            },
            supports_fan_speed_percent: {
                value: false, required: false
            },
            fan_speeds_ordered: {
                value: false, required: false
            },
            command_only_fanspeed: {
                value: false, required: false
            },
            available_fan_speeds_file: {
                value: 'availableFanSpeeds_<id>.json', required: false, validate: RED.validators.typedInput('available_fan_speeds_type')
            },
            available_fan_speeds_type: {
                value: "str", required: false
            },
            trait_sensorstate: {
                value: false, required: false
            },
            sensor_states_supported: {
                value: [], required: false
            },
            arm_levels_ordered: {
                value: false, required: false
            },
            trait_fill: {
                value: false, required: false
            },
            available_fill_levels_file: {
                value: 'availableFillLevels_<id>.json', required: false, validate: RED.validators.typedInput('available_fill_levels_type')
            },
            available_fill_levels_type: {
                value: "str", required: false
            },
            supports_fill_percent: {
                value: false, required: false
            },
            ordered_fill_levels: {
                value: true, required: false
            },
            trait_armdisarm: {
                value: false, required: false
            },
            available_arm_levels_file: {
                value: 'availableArmLevels_<id>.json', required: false, validate: RED.validators.typedInput('available_arm_levels_type')
            },
            available_arm_levels_type: {
                value: "str", required: false
            },
            trait_energystorage: {
                value: false, required: false
            },
            is_rechargeable: {
                value: false, required: false
            },
            query_only_energy_storage: {
                value: false, required: false
            },
            energy_storage_distance_unit_for_ux: {
                value: "", required: false
            },
            trait_dispense: {
                value: false, required: false
            },
            supported_dispense_items_file: {
                value: 'supportedDispenseItems_<id>.json', required: false, validate: RED.validators.typedInput('supported_dispense_items_type')
            },
            supported_dispense_items_type: {
                value: "str", required: false
            },
            supported_dispense_presets_file: {
                value: 'supportedDispensePresets_<id>.json', required: false, validate: RED.validators.typedInput('supported_dispense_presets_type')
            },
            supported_dispense_presets_type: {
                value: "str", required: false
            },
            trait_networkcontrol: {
                value: false, required: false
            },
            supports_enabling_guest_network: {
                value: false, required: false
            },
            supports_disabling_guest_network: {
                value: false, required: false
            },
            supports_getting_guest_network_password: {
                value: false, required: false
            },
            network_profiles: {
                value: [], required: false
            },
            supports_enabling_network_profile: {
                value: false, required: false
            },
            supports_disabling_network_profile: {
                value: false, required: false
            },
            supports_network_download_speedtest: {
                value: false, required: false
            },
            supports_network_upload_speedtest: {
                value: false, required: false
            },
            trait_objectdetection: {
                value: false, required: false
            },
            trait_occupancysensing: {
                value: false, required: false
            },
            occupancy_sensing_pir: {
                value: false, required: false
            },
            occupancy_sensing_ultrasonic: {
                value: false, required: false
            },
            occupancy_sensing_physical_contact: {
                value: false, required: false
            },
            occupied_to_unoccupied_delay_sec_pir: {
                value: '', required: false, validate: function (v) {
                    if (v === undefined || v.trim().length === 0)
                        return true;
                    const n = parseInt(v);
                    const f = parseFloat(v);
                    return !isNaN(v) && Number.isInteger(f) && n >= 0;
                }
            },
            unoccupied_to_occupied_delay_sec_pir: {
                value: '', required: false, validate: function (v) {
                    if (v === undefined || v.trim().length === 0)
                        return true;
                    const n = parseInt(v);
                    const f = parseFloat(v);
                    return !isNaN(v) && Number.isInteger(f) && n >= 0;
                }
            },
            unoccupied_to_occupied_event_threshold_pir: {
                value: '', required: false, validate: function (v) {
                    if (v === undefined || v.trim().length === 0)
                        return true;
                    const n = parseInt(v);
                    const f = parseFloat(v);
                    return !isNaN(v) && Number.isInteger(f) && n >= 0;
                }
            },
            occupied_to_unoccupied_delay_sec_ultrasonic: {
                value: '', required: false, validate: function (v) {
                    if (v === undefined || v.trim().length === 0)
                        return true;
                    const n = parseInt(v);
                    const f = parseFloat(v);
                    return !isNaN(v) && Number.isInteger(f) && n >= 0;
                }
            },
            unoccupied_to_occupied_delay_sec_ultrasonic: {
                value: '', required: false, validate: function (v) {
                    if (v === undefined || v.trim().length === 0)
                        return true;
                    const n = parseInt(v);
                    const f = parseFloat(v);
                    return !isNaN(v) && Number.isInteger(f) && n >= 0;
                }
            },
            unoccupied_to_occupied_event_threshold_ultrasonic: {
                value: '', required: false, validate: function (v) {
                    if (v === undefined || v.trim().length === 0)
                        return true;
                    const n = parseInt(v);
                    const f = parseFloat(v);
                    return !isNaN(v) && Number.isInteger(f) && n >= 0;
                }
            },
            occupied_to_unoccupied_delay_sec_physical_contact: {
                value: '', required: false, validate: function (v) {
                    if (v === undefined || v.trim().length === 0)
                        return true;
                    const n = parseInt(v);
                    const f = parseFloat(v);
                    return !isNaN(v) && Number.isInteger(f) && n >= 0;
                }
            },
            unoccupied_to_occupied_delay_sec_physical_contact: {
                value: '', required: false, validate: function (v) {
                    if (v === undefined || v.trim().length === 0)
                        return true;
                    const n = parseInt(v);
                    const f = parseFloat(v);
                    return !isNaN(v) && Number.isInteger(f) && n >= 0;
                }
            },
            unoccupied_to_occupied_event_threshold_physical_contact: {
                value: '', required: false, validate: function (v) {
                    if (v === undefined || v.trim().length === 0)
                        return true;
                    const n = parseInt(v);
                    const f = parseFloat(v);
                    return !isNaN(v) && Number.isInteger(f) && n >= 0;
                }
            },
            show_trait: {
                value: "selected", required: false
            },
            advanced_settings: {
                value: true, required: false
            },
            ct_appselector: {
                value: "", required: false
            },
            ct_armdisarm: {
                value: "", required: false
            },
            ct_brightness: {
                value: "", required: false
            },
            ct_camerastream: {
                value: "", required: false
            },
            ct_channel: {
                value: "", required: false
            },
            ct_colorsetting: {
                value: "", required: false
            },
            ct_cook: {
                value: "", required: false
            },
            ct_dispense: {
                value: "", required: false
            },
            ct_dock: {
                value: "", required: false
            },
            ct_energystorage: {
                value: "", required: false
            },
            ct_fanspeed: {
                value: "", required: false
            },
            ct_fill: {
                value: "", required: false
            },
            ct_humiditysetting: {
                value: "", required: false
            },
            ct_inputselector: {
                value: "", required: false
            },
            ct_lighteffects: {
                value: "", required: false
            },
            ct_locator: {
                value: "", required: false
            },
            ct_lockunlock: {
                value: "", required: false
            },
            ct_mediastate: {
                value: "", required: false
            },
            ct_modes: {
                value: "", required: false
            },
            ct_networkcontrol: {
                value: "", required: false
            },
            ct_objectdetection: {
                value: "", required: false
            },
            ct_onoff: {
                value: "", required: false
            },
            ct_openclose: {
                value: "", required: false
            },
            ct_reboot: {
                value: "", required: false
            },
            ct_rotation: {
                value: "", required: false
            },
            ct_runcycle: {
                value: "", required: false
            },
            ct_scene: {
                value: "", required: false
            },
            ct_sensorstate: {
                value: "", required: false
            },
            ct_softwareupdate: {
                value: "", required: false
            },
            ct_startstop: {
                value: "", required: false
            },
            ct_statusreport: {
                value: "", required: false
            },
            ct_temperaturecontrol: {
                value: "", required: false
            },
            ct_temperaturesetting: {
                value: "", required: false
            },
            ct_timer: {
                value: "", required: false
            },
            ct_toggles: {
                value: "", required: false
            },
            ct_transportcontrol: {
                value: "", required: false
            },
            ct_volume: {
                value: "", required: false
            },
            pin_appselector: {
                value: "", required: false
            },
            pin_armdisarm: {
                value: "", required: false
            },
            pin_brightness: {
                value: "", required: false
            },
            pin_camerastream: {
                value: "", required: false
            },
            pin_channel: {
                value: "", required: false
            },
            pin_colorsetting: {
                value: "", required: false
            },
            pin_cook: {
                value: "", required: false
            },
            pin_dispense: {
                value: "", required: false
            },
            pin_dock: {
                value: "", required: false
            },
            pin_energystorage: {
                value: "", required: false
            },
            pin_fanspeed: {
                value: "", required: false
            },
            pin_fill: {
                value: "", required: false
            },
            pin_humiditysetting: {
                value: "", required: false
            },
            pin_inputselector: {
                value: "", required: false
            },
            pin_lighteffects: {
                value: "", required: false
            },
            pin_locator: {
                value: "", required: false
            },
            pin_lockunlock: {
                value: "", required: false
            },
            pin_mediastate: {
                value: "", required: false
            },
            pin_modes: {
                value: "", required: false
            },
            pin_networkcontrol: {
                value: "", required: false
            },
            pin_objectdetection: {
                value: "", required: false
            },
            pin_onoff: {
                value: "", required: false
            },
            pin_openclose: {
                value: "", required: false
            },
            pin_reboot: {
                value: "", required: false
            },
            pin_rotation: {
                value: "", required: false
            },
            pin_runcycle: {
                value: "", required: false
            },
            pin_scene: {
                value: "", required: false
            },
            pin_sensorstate: {
                value: "", required: false
            },
            pin_softwareupdate: {
                value: "", required: false
            },
            pin_startstop: {
                value: "", required: false
            },
            pin_statusreport: {
                value: "", required: false
            },
            pin_temperaturecontrol: {
                value: "", required: false
            },
            pin_temperaturesetting: {
                value: "", required: false
            },
            pin_timer: {
                value: "", required: false
            },
            pin_toggles: {
                value: "", required: false
            },
            pin_transportcontrol: {
                value: "", required: false
            },
            pin_volume: {
                value: "", required: false
            },
        },
        oneditprepare: function () {
            $('#node-input-advanced_settings').prop('checked', true);
            $('#node-input-show_trait').val('selected');
            this.show_trait = 'selected';
            this.advanced_settings = true;
            if (typeof this.online !== 'boolean') {
                this.online = true;
                $('#node-input-online').prop('checked', true);
            }
            $("#node-input-appselector_file").typedInput({
                default: "str",
                typeField: $("#node-input-appselector_type"),
                types: ['str', 'json'],
            });
            $("#node-input-channel_file").typedInput({
                default: "str",
                typeField: $("#node-input-channel_type"),
                types: ['str', 'json'],
            });
            $("#node-input-inputselector_file").typedInput({
                default: "str",
                typeField: $("#node-input-inputselector_type"),
                types: ['str', 'json'],
            });
            $("#node-input-modes_file").typedInput({
                default: "str",
                typeField: $("#node-input-modes_type"),
                types: ['str', 'json'],
            });
            $("#node-input-toggles_file").typedInput({
                default: "str",
                typeField: $("#node-input-toggles_type"),
                types: ['str', 'json'],
            });
            $("#node-input-food_presets_file").typedInput({
                default: "str",
                typeField: $("#node-input-food_presets_type"),
                types: ['str', 'json'],
            });
            $("#node-input-available_fan_speeds_file").typedInput({
                default: "str",
                typeField: $("#node-input-available_fan_speeds_type"),
                types: ['str', 'json'],
            });
            $("#node-input-available_fill_levels_file").typedInput({
                default: "str",
                typeField: $("#node-input-available_fill_levels_type"),
                types: ['str', 'json'],
            });
            $("#node-input-available_arm_levels_file").typedInput({
                default: "str",
                typeField: $("#node-input-available_arm_levels_type"),
                types: ['str', 'json'],
            });
            $("#node-input-supported_dispense_items_file").typedInput({
                default: "str",
                typeField: $("#node-input-supported_dispense_items_type"),
                types: ['str', 'json'],
            });
            $("#node-input-supported_dispense_presets_file").typedInput({
                default: "str",
                typeField: $("#node-input-supported_dispense_presets_type"),
                types: ['str', 'json'],
            });
            $("#node-input-webrtc_ice_servers").typedInput({
                default: "str",
                typeField: $("#node-input-webrtc_ice_servers_type"),
                types: ['str', 'json'],
            });
            // Zones
            $('#node-input-device-zone-container').css('min-height', '150px').css('min-width', '450px').editableList({
                addItem: function (container, i, opt) {
                    let zone = opt;
                    if (!Object.prototype.hasOwnProperty.call(zone, 'name')) {
                        zone = { name: "" };
                    }
                    container.css({
                        overflow: 'hidden',
                        whiteSpace: 'nowrap'
                    });
                    let fragment = document.createDocumentFragment();
                    let row1 = $('<div/>', { style: "display:flex;" }).appendTo(fragment);
                    let propertyName = $('<input/>', { class: "node-input-device-zone-property-name", type: "text", style: "width: 100%" })
                        .appendTo(row1);
                    propertyName.val(zone.name);

                    container[0].appendChild(fragment);
                },
                removable: true,
                sortable: true
            });
            if (!this.available_zones) {
                this.available_zones = [];
            }
            for (let i = 0; i < this.available_zones.length; i++) {
                let zone = this.available_zones[i];
                $("#node-input-device-zone-container").editableList('addItem', { name: zone });
            }
            // Network profiles
            $('#node-input-device-network-profiles-container').css('min-height', '150px').css('min-width', '450px').editableList({
                addItem: function (container, i, opt) {
                    let network_profiles = opt;
                    if (!Object.prototype.hasOwnProperty.call(network_profiles, 'name')) {
                        network_profiles = { name: "" };
                    }
                    container.css({
                        overflow: 'hidden',
                        whiteSpace: 'nowrap'
                    });
                    let fragment = document.createDocumentFragment();
                    let row1 = $('<div/>', { style: "display:flex;" }).appendTo(fragment);
                    let propertyName = $('<input/>', { class: "node-input-device-network-profiles-property-name", type: "text", style: "width: 100%" })
                        .appendTo(row1);
                    propertyName.val(network_profiles.name);

                    container[0].appendChild(fragment);
                },
                removable: true,
                sortable: true
            });
            if (!this.network_profiles) {
                this.network_profiles = [];
            }
            for (let i = 0; i < this.network_profiles.length; i++) {
                let network_profiles = this.network_profiles[i];
                $("#node-input-device-network-profiles-container").editableList('addItem', { name: network_profiles });
            }

            $(".cb_trait").change(function () {
                //const checked = $(this).prop('checked');
                //const cb_id = $(this).attr('id');
                //const div_id = cb_id.substring(11);
                //const div_aid = div_id.substring(6);
                /*
                if (checked) {
                    $("#" + div_id).show();
                    $("#" + div_aid).find(".oc_trait").removeClass('fa-caret-right').addClass('fa-caret-down');
                } else {
                    $("#" + div_id).hide();
                    $("#" + div_aid).find(".oc_trait").removeClass('fa-caret-down').addClass('fa-caret-right');
                }
                */
            });
            $(".cb_trait").change();

            /*$(".label_trait").click(function() {
                const label_id =  $( this ).attr('id');
                const div_id = label_id.substring(6);
                $("#" + div_id).toggle();
                const div_aid = div_id.substring(6);
                if ($("#" + div_id).is(":visible")) {
                    $("#" + div_aid).find(".oc_trait").removeClass('fa-caret-right').addClass('fa-caret-down');
                } else {
                    $("#" + div_aid).find(".oc_trait").removeClass('fa-caret-down').addClass('fa-caret-right');
                }
            });*/

            $(".oc_trait").click(function () {
                const parent_id = $(this).parent().parent().attr('id');
                const div_id = parent_id.substring(parent_id.startsWith('cb_') ? 3 : 6);
                $("#" + div_id).toggle();
                const div_aid = div_id.substring(6);
                if ($("#" + div_id).is(":visible")) {
                    $("#" + div_aid).find(".oc_trait").removeClass('fa-caret-right').addClass('fa-caret-down');
                } else {
                    $("#" + div_aid).find(".oc_trait").removeClass('fa-caret-down').addClass('fa-caret-right');
                }
            });

            $("#node-input-advanced_settings").change(function () {
                const checked = $(this).prop('checked');
                if (checked) {
                    $(".device-advanced").show();
                } else {
                    $(".device-advanced").hide();
                }
            });
            $("#node-input-advanced_settings").change();

            $("#node-input-supports_fan_speed_percent").change(function () {
                const checked = $(this).prop('checked');
                if (checked) {
                    $(".no_fan_speed_percent").hide();
                } else {
                    $(".no_fan_speed_percent").show();
                }
            });
            $("#node-input-supports_fan_speed_percent").change();

            $("#node-input-occupancy_sensing_pir").change(function () {
                const checked = $(this).prop('checked');
                if (checked) {
                    $(".occupancy_sensing_pir").show();
                } else {
                    $(".occupancy_sensing_pir").hide();
                }
            });
            $("#node-input-occupancy_sensing_pir").change();

            $("#node-input-occupancy_sensing_ultrasonic").change(function () {
                const checked = $(this).prop('checked');
                if (checked) {
                    $(".occupancy_sensing_ultrasonic").show();
                } else {
                    $(".occupancy_sensing_ultrasonic").hide();
                }
            });
            $("#node-input-occupancy_sensing_ultrasonic").change();

            $("#node-input-occupancy_sensing_physical_contact").change(function () {
                const checked = $(this).prop('checked');
                if (checked) {
                    $(".occupancy_sensing_physical_contact").show();
                } else {
                    $(".occupancy_sensing_physical_contact").hide();
                }
            });
            $("#node-input-occupancy_sensing_physical_contact").change();

            let setTraitRecomended = function (name, recommended, show_traits) {
                $("#node-input-trait_" + name).show();
                $("#label_trait_" + name).hide();
                $("#cb_trait_" + name).show();
                /*if (typeof recommended === "boolean") {
                    $("#node-input-trait_" + name).prop('checked', recommended);
                }*/
                let show_trait = show_traits === "all";
                if (show_traits === "selected") {
                    show_trait = $("#node-input-trait_" + name).prop('checked');
                } else if (show_traits === "recommended") {
                    show_trait = recommended;
                }
                if (show_trait) {
                    $("#" + name).show();
                } else {
                    $("#" + name).hide();
                }
                if (recommended === true) {
                    $("#trait_" + name).show();
                    $("#" + name).find(".oc_trait").removeClass('fa-caret-right').addClass('fa-caret-down');
                } else {
                    $("#trait_" + name).hide();
                    $("#" + name).find(".oc_trait").removeClass('fa-caret-down').addClass('fa-caret-right');
                }
                return show_trait;
            };

            let setTraitRequired = function (name) {
                $("#node-input-trait_" + name).hide();
                $("#node-input-trait_" + name).prop('checked', true);
                $("#label_trait_" + name).show();
                $("#cb_trait_" + name).hide();
                $("#trait_" + name).show();
                $("#" + name).show();
            };

            // Device Type
            let deviceTypeChanged = function () {
                let device_type = $("#node-input-device_type").val();
                let show_trait = $("#node-input-show_trait").val();
                let required_traits = [];
                let recommended_traits = [];
                switch (device_type) {
                    case "AC_UNIT": // Air conditioning unit
                        recommended_traits = ["fanspeed"];
                        required_traits = ["temperaturesetting"];
                        break;
                    case "AIRCOOLER": // Air cooler
                        recommended_traits = ["fanspeed", "humiditysetting"];
                        required_traits = ["temperaturesetting"];
                        break;
                    case "AIRFRESHENER": // Air freshener
                        recommended_traits = ["modes", "toggles"];
                        required_traits = ["onoff"];
                        break;
                    case "AIRPURIFIER": // Air purifier
                        recommended_traits = ["fanspeed", "sensorstate"];
                        required_traits = ["onoff"];
                        break;
                    case "AUDIO_VIDEO_RECEIVER": // Audio-Video receiver
                        recommended_traits = ["appselector", "mediastate", "transportcontrol"];
                        required_traits = ["inputselector", "onoff", "volume"];
                        break;
                    case "AWNING": // Awning
                        recommended_traits = [];
                        required_traits = ["openclose"];
                        break;
                    case "BATHTUB": // Bathtub
                        recommended_traits = [];
                        required_traits = ["fill", "temperaturecontrol", "startstop"];
                        break;
                    case "BED": // Bed
                        recommended_traits = ["scene"];
                        required_traits = ["modes"];
                        break;
                    case "BLANKET": // Blanket
                        recommended_traits = ["onoff", "modes", "toggles"];
                        required_traits = [];
                        break;
                    case "BLENDER": // Blender
                        recommended_traits = ["cook", "startstop", "timer"];
                        required_traits = ["onoff"];
                        break;
                    case "BLINDS": // Blinds
                        recommended_traits = ["rotation"];
                        required_traits = ["openclose"];
                        break;
                    case "BOILER": // Boiler
                        recommended_traits = ["temperaturecontrol"];
                        required_traits = ["onoff"];
                        break;
                    case "CAMERA": // Camera
                        recommended_traits = [];
                        required_traits = ["camerastream"];
                        break;
                    case "CARBON_MONOXIDE_DETECTOR": // Carbon monoxide detector
                        recommended_traits = [];
                        required_traits = ["sensorstate"];
                        break;
                    case "CHARGER": // Charger
                        recommended_traits = [];
                        required_traits = ["energystorage"];
                        break;
                    case "CLOSET": // Closet
                        recommended_traits = [];
                        required_traits = ["openclose"];
                        break;
                    case "COFFEE_MAKER": // Coffee Maker
                        recommended_traits = ["cook", "temperaturecontrol"];
                        required_traits = ["onoff"];
                        break;
                    case "COOKTOP": // Cooktop
                        recommended_traits = ["cook", "timer"];
                        required_traits = ["onoff"];
                        break;
                    case "CURTAIN": // Curtain
                        recommended_traits = [];
                        required_traits = ["openclose"];
                        break;
                    case "DEHUMIDIFIER": // Dehumidifier
                        recommended_traits = ["fanspeed", "humiditysetting", "startstop"];
                        required_traits = ["onoff"];
                        break;
                    case "DEHYDRATOR": // Dehydrator
                        recommended_traits = ["cook", "startstop", "timer"];
                        required_traits = ["onoff"];
                        break;
                    case "DISHWASHER": // Dishwasher
                        recommended_traits = ["onoff", "runcycle"];
                        required_traits = ["startstop"];
                        break;
                    case "DOOR": // Door
                        recommended_traits = ["lockunlock"];
                        required_traits = ["openclose"];
                        break;
                    case "DOORBELL": // Doorbell
                        recommended_traits = ["camerastream", "objectdetection"];
                        required_traits = [];
                        break;
                    case "DRAWER": // Drawer
                        recommended_traits = [];
                        required_traits = ["openclose"];
                        break;
                    case "DRYER": // Dryer
                        recommended_traits = ["modes", "onoff", "runcycle", "toggles"];
                        required_traits = ["startstop"];
                        break;
                    case "FAN": // Fan
                        recommended_traits = ["fanspeed"];
                        required_traits = ["onoff"];
                        break;
                    case "FAUCET": // Faucet
                        recommended_traits = ["dispense", "startstop", "temperaturecontrol"];
                        required_traits = [];
                        break;
                    case "FIREPLACE": // Fireplace
                        recommended_traits = ["modes", "toggles", "onoff"];
                        required_traits = [];
                        break;
                    case "FREEZER": // Freezer
                        recommended_traits = [];
                        required_traits = ["temperaturecontrol"];
                        break;
                    case "FRYER": // Fryer
                        recommended_traits = ["cook", "startstop", "timer"];
                        required_traits = ["onoff"];
                        break;
                    case "GAME_CONSOLE": // Game console
                        recommended_traits = ["volume"];
                        required_traits = ["appselector", "mediastate", "onoff", "transportcontrol"];
                        break;
                    case "GARAGE": // Garage
                        recommended_traits = [];
                        required_traits = ["openclose"];
                        break;
                    case "GATE": // Gate
                        recommended_traits = ["lockunlock"];
                        required_traits = ["openclose"];
                        break;
                    case "GRILL": // Grill
                        recommended_traits = ["cook", "onoff", "timer"];
                        required_traits = ["startstop"];
                        break;
                    case "HEATER": // Heater
                        recommended_traits = ["fanspeed"];
                        required_traits = ["temperaturesetting"];
                        break;
                    case "HOOD": // Hood
                        recommended_traits = ["brightness", "fanspeed"];
                        required_traits = ["onoff"];
                        break;
                    case "HUMIDIFIER": // Humidifier
                        recommended_traits = ["fanspeed", "humiditysetting", "startstop"];
                        required_traits = ["onoff"];
                        break;
                    case "KETTLE": // Kettle
                        recommended_traits = ["temperaturecontrol"];
                        required_traits = ["onoff"];
                        break;
                    case "LIGHT": // Light
                        recommended_traits = ["colorsetting", "brightness"];
                        required_traits = ["onoff"];
                        break;
                    case "LOCK": // Lock
                        recommended_traits = [];
                        required_traits = ["lockunlock"];
                        break;
                    case "MICROWAVE": // Microwave
                        recommended_traits = ["cook", "timer"];
                        required_traits = ["startstop"];
                        break;
                    case "MOP": // Mop
                        recommended_traits = ["dock", "energystorage", "locator", "onoff", "runcycle"];
                        required_traits = ["startstop"];
                        break;
                    case "MOWER": // Mower
                        recommended_traits = ["dock", "energystorage", "locator", "onoff", "runcycle"];
                        required_traits = ["startstop"];
                        break;
                    case "MULTICOOKER": // Multicooker
                        recommended_traits = ["cook", "startstop", "timer"];
                        required_traits = ["onoff"];
                        break;
                    case "NETWORK": // Network
                        recommended_traits = ["reboot", "softwareupdate"];
                        required_traits = ["networkcontrol"];
                        break;
                    case "OUTLET": // Outlet
                        recommended_traits = [];
                        required_traits = ["onoff"];
                        break;
                    case "OVEN": // Oven
                        recommended_traits = ["cook", "temperaturecontrol", "timer"];
                        required_traits = ["onoff"];
                        break;
                    case "PERGOLA": // Pergola
                        recommended_traits = ["rotation"];
                        required_traits = ["openclose"];
                        break;
                    case "PETFEEDER": // Pet feeder
                        recommended_traits = ["onoff", "startstop"];
                        required_traits = ["dispense"];
                        break;
                    case "PRESSURECOOKER": // Pressure cooker
                        recommended_traits = ["cook", "timer"];
                        required_traits = ["onoff"];
                        break;
                    case "PUMP": // Pump
                        recommended_traits = [];
                        required_traits = ["onoff"];
                        break;
                    case "RADIATOR": // Radiator
                        recommended_traits = ["modes", "toggles"];
                        required_traits = ["onoff"];
                        break;
                    case "REFRIGERATOR": // Refrigerator
                        recommended_traits = [];
                        required_traits = ["temperaturecontrol"];
                        break;
                    case "REMOTECONTROL": // Remote control
                        recommended_traits = ["appselector", "channel"];
                        required_traits = ["inputselector", "mediastate", "onoff", "transportcontrol", "volume"];
                        break;
                    case "ROUTER": // Router
                        recommended_traits = ["reboot", "softwareupdate"];
                        required_traits = ["networkcontrol"];
                        break;
                    case "SCENE": // Scene
                        recommended_traits = [];
                        required_traits = ["scene"];
                        break;
                    case "SECURITYSYSTEM": // Security system
                        recommended_traits = ["statusreport"];
                        required_traits = ["armdisarm"];
                        break;
                    case "SENSOR": // Sensor
                        recommended_traits = ["sensorstate", "energystorage", 'humiditysetting', 'temperaturecontrol', 'openclose', 'brightness'];
                        required_traits = [];
                        break;
                    case "SETTOP": // Settop
                        recommended_traits = ["volume", "onoff"];
                        required_traits = ["appselector", "mediastate", "channel", "transportcontrol"];
                        break;
                    case "SHOWER": // Shower
                        recommended_traits = ["rotation"];
                        required_traits = ["openclose"];
                        break;
                    case "SHUTTER": // Shutter
                        recommended_traits = ["rotation"];
                        required_traits = ["openclose"];
                        break;
                    case "SMOKE_DETECTOR": // Smoke detector
                        recommended_traits = [];
                        required_traits = ["sensorstate"];
                        break;
                    case "SOUNDBAR": // Soundbar
                        recommended_traits = ["appselector", "inputselector", "mediastate", "onoff", "transportcontrol"];
                        required_traits = ["volume"];
                        break;
                    case "SOUSVIDE": // Sousvide
                        recommended_traits = ["cook", "startstop", "timer"];
                        required_traits = ["onoff"];
                        break;
                    case "SPEAKER": // Speaker
                        recommended_traits = ["appselector", "inputselector", "mediastate", "onoff", "transportcontrol"];
                        required_traits = ["volunme"];
                        break;
                    case "SPRINKLER": // Sprinkler
                        recommended_traits = ["timer"];
                        required_traits = ["startstop"];
                        break;
                    case "STANDMIXER": // Stand mixer
                        recommended_traits = ["cook", "startstop"];
                        required_traits = ["onoff"];
                        break;
                    case "STREAMING_BOX": // Streaming box
                        recommended_traits = ["inputselector", "onoff"];
                        required_traits = ["appselector", "mediastate", "transportcontrol", "volume"];
                        break;
                    case "STREAMING_SOUNDBAR": // Streaming soundbar
                        recommended_traits = ["inputselector", "onoff"];
                        required_traits = ["appselector", "mediastate", "transportcontrol", "volume"];
                        break;
                    case "STREAMING_STICK": // Streaming stick
                        recommended_traits = ["onoff"];
                        required_traits = ["appselector", "mediastate", "transportcontrol", "volume"];
                        break;
                    case "SWITCH": // Switch
                        recommended_traits = ["brightness"];
                        required_traits = ["onoff"];
                        break;
                    case "THERMOSTAT": // Thermostat
                        recommended_traits = [];
                        required_traits = ["temperaturesetting"];
                        break;
                    case "TV": // Television
                        recommended_traits = ["channel", "inputselector"];
                        required_traits = ["appselector", "mediastate", "onoff", "transportcontrol", "volume"];
                        break;
                    case "VACUUM": // Vacuum
                        recommended_traits = ["dock", "energystorage", "locator", "onoff", "runcycle"];
                        required_traits = ["startstop"];
                        break;
                    case "VALVE": // Valve
                        recommended_traits = [];
                        required_traits = ["openclose"];
                        break;
                    case "WASHER": // Washer
                        recommended_traits = ["modes", "onoff", "runcycle", "toggles"];
                        required_traits = ["startstop"];
                        break;
                    case "WATERHEATER": // Water heater
                        recommended_traits = ["temperaturecontrol"];
                        required_traits = ["onoff"];
                        break;
                    case "WATERPURIFIER": // Water purifier
                        recommended_traits = ["onoff", "sensorstate"];
                        required_traits = [];
                        break;
                    case "WATERSOFTENER": // Water softener
                        recommended_traits = ["onoff", "sensorstate"];
                        required_traits = [];
                        break;
                    case "WINDOW": // Window
                        recommended_traits = ["lockunlock"];
                        required_traits = ["openclose"];
                        break;
                    case "YOGURTMAKER": // Yogurt maker
                        recommended_traits = ["cook", "startstop", "timer"];
                        required_traits = ["onoff"];
                        break;
                }
                let trait_shown = false;
                $(".div_trait").each(function () {
                    let div_id = $(this).attr('id');
                    if (required_traits.includes(div_id)) {
                        setTraitRequired(div_id);
                        trait_shown = true;
                    } else {
                        if (setTraitRecomended(div_id,
                            recommended_traits.includes(div_id),
                            device_type === 'SCENE' ? 'none' : (div_id === 'scene' ? false : show_trait))) {
                            trait_shown = true;
                        }
                    }
                });
                if (trait_shown) {
                    $("#no_trait").hide();
                } else {
                    $("#no_trait").show();
                }
            };
            deviceTypeChanged();
            $("#node-input-device_type").change(deviceTypeChanged);
            $("#node-input-show_trait").change(deviceTypeChanged);
            let challenge_type_change = function () {
                let _this = $(this);
                let show = _this.val() === 'pinNeeded';
                if (show) {
                    _this.parent().parent().find(".challenge_pin").show();
                } else {
                    _this.parent().parent().find(".challenge_pin").hide();
                }
            };
            $(".challenge_type").change(challenge_type_change);
            $(".challenge_type").change();
        },
        oneditsave: function () {
            let me = this;
            me.advanced_settings = false;
            me.show_trait = 'selected';

            // Zone
            let available_zones = $("#node-input-device-zone-container").editableList('items');
            me.available_zones = [];
            available_zones.each(function () {
                let zone = $(this);
                let name = zone.find(".node-input-device-zone-property-name").val();
                me.available_zones.push(name);
            });

            // Network profiles
            let network_profiles = $("#node-input-device-network-profiles-container").editableList('items');
            me.network_profiles = [];
            network_profiles.each(function () {
                let network_profile = $(this);
                let name = network_profile.find(".node-input-device-network-profiles-property-name").val();
                me.network_profiles.push(name);
            });
        },
        oneditresize: function (size) {
            // Zone
            let rows = $("#dialog-form>div:not(.node-input-device-zone-container-row)");
            let height = size.height;
            for (let i = 0; i < rows.length; i++) {
                height -= $(rows[i]).outerHeight(true);
            }
            let editorRow = $("#dialog-form>div.node-input-device-zone-container-row");
            height -= (parseInt(editorRow.css("marginTop")) + parseInt(editorRow.css("marginBottom")));
            height += 16;
            $("#node-input-device-zone-container").editableList('height', height);

            // Network profiles
            rows = $("#dialog-form>div:not(.node-input-device-network-profiles-container-row)");
            height = size.height;
            for (let i = 0; i < rows.length; i++) {
                height -= $(rows[i]).outerHeight(true);
            }
            editorRow = $("#dialog-form>div.node-input-device-network-profiles-container-row");
            height -= (parseInt(editorRow.css("marginTop")) + parseInt(editorRow.css("marginBottom")));
            height += 16;
            $("#node-input-device-network-profiles-container").editableList('height', height);
        }
    });
</script>