411 lines
20 KiB
Python
411 lines
20 KiB
Python
import config
|
|
import random
|
|
import report
|
|
import time
|
|
|
|
from mqtt import mqtt_client
|
|
from simulation.rooms import house
|
|
|
|
from .help import testSession
|
|
from .help import STATES_SW, STATES_BR, STATES_CT, STATES_TEMP
|
|
from tests.common_testcases import device_follow, device_flash, FLASH_TRIGGER_LONGPUSH, FLASH_TRIGGER_ACTIVATE
|
|
|
|
|
|
def rand_tcel():
|
|
return random.choice(5 * [report.TCEL_FULL] + 3 * [report.TCEL_SHORT] + 2 * [report.TCEL_SMOKE])
|
|
|
|
|
|
def device_follow_sw_with_keys(ts, master, master_key, slave, slave_key, single=False):
|
|
master_name = master.get_name(master_key)
|
|
slave_name = slave.get_name(slave_key)
|
|
#
|
|
testcase_id = master_name + " -> " + slave_name
|
|
ts.testCase(
|
|
testcase_id, report.TCEL_SINGLE if single else rand_tcel(), device_follow,
|
|
master, master_key,
|
|
slave, slave_key,
|
|
STATES_SW, None
|
|
)
|
|
|
|
|
|
def device_follow_sw(ts, master, slave, single=False):
|
|
device_follow_sw_with_keys(ts, master, master.KEY_OUTPUT_0, slave, slave.KEY_OUTPUT_0)
|
|
|
|
|
|
def device_follow_br(ts, master, slave, switch_on=None, single=False):
|
|
master_name = master.get_name(master.KEY_BRIGHTNESS)
|
|
slave_name = slave.get_name(slave.KEY_BRIGHTNESS)
|
|
#
|
|
testcase_id = master_name + " -> " + slave_name
|
|
ts.testCase(
|
|
testcase_id, report.TCEL_SINGLE if single else rand_tcel(), device_follow,
|
|
master, master.KEY_BRIGHTNESS,
|
|
slave, slave.KEY_BRIGHTNESS,
|
|
STATES_BR, switch_on
|
|
)
|
|
|
|
|
|
def device_follow_ct(ts, master, slave, switch_on=None, single=False):
|
|
master_name = master.get_name(master.KEY_COLOR_TEMP)
|
|
slave_name = slave.get_name(slave.KEY_COLOR_TEMP)
|
|
#
|
|
testcase_id = master_name + " -> " + slave_name
|
|
ts.testCase(
|
|
testcase_id, report.TCEL_SINGLE if single else rand_tcel(), device_follow,
|
|
master, master.KEY_COLOR_TEMP,
|
|
slave, slave.KEY_COLOR_TEMP,
|
|
STATES_CT, switch_on
|
|
)
|
|
|
|
|
|
def device_follow_temp(ts, master, slave, single=False):
|
|
master_name = master.get_name(master.KEY_USER_TEMPERATURE_SETPOINT)
|
|
slave_name = slave.get_name(slave.KEY_TEMPERATURE_SETPOINT)
|
|
#
|
|
testcase_id = master_name + " -> " + slave_name
|
|
ts.testCase(
|
|
testcase_id, report.TCEL_SINGLE if single else rand_tcel(), device_follow,
|
|
master, master.KEY_USER_TEMPERATURE_SETPOINT,
|
|
slave, slave.KEY_TEMPERATURE_SETPOINT,
|
|
STATES_TEMP, None
|
|
)
|
|
|
|
|
|
def device_flash_by_vers(ts, flash_device, trigger_device, start_state, trigger_vers, single=False):
|
|
flash_device_flash_key = flash_device.KEY_OUTPUT_0
|
|
if trigger_vers == FLASH_TRIGGER_LONGPUSH:
|
|
trigger_device_key = trigger_device.KEY_LONGPUSH_0
|
|
elif trigger_vers == FLASH_TRIGGER_ACTIVATE:
|
|
trigger_device_key = trigger_device.KEY_OUTPUT_0
|
|
else:
|
|
raise AttributeError("Unknown trigger_vers in device_flash: %s", repr(trigger_vers))
|
|
|
|
trigger_name = trigger_device.get_name(trigger_device_key)
|
|
flash_name = flash_device.get_name(flash_device_flash_key) + " from %s" % repr(start_state)
|
|
#
|
|
testcase_id = trigger_name + " -> " + flash_name
|
|
ts.testCase(
|
|
testcase_id, report.TCEL_SINGLE if single else report.TCEL_SHORT, device_flash,
|
|
flash_device, flash_device_flash_key, trigger_device, trigger_device_key, start_state,
|
|
)
|
|
|
|
|
|
def preconditions(ts: testSession, mc: mqtt_client, h: house):
|
|
def precond_test(tLogger):
|
|
mc.send("videv/all/oof", True)
|
|
time.sleep(0.5)
|
|
tLogger.debug("Collecting precondition logs...")
|
|
|
|
# Clean-Up
|
|
ts.testCase('Clean-Up', report.TCEL_SINGLE, precond_test)
|
|
|
|
|
|
def ffe(ts: testSession, mc: mqtt_client, h: house):
|
|
#
|
|
# ffe.livingroom
|
|
#
|
|
room = h.ffe.livingroom
|
|
# Switching devices ##################################
|
|
# main_light videv<-->shelly
|
|
device_follow_sw(ts, room.videv_main_light, room.switch_main_light)
|
|
device_follow_sw(ts, room.switch_main_light, room.videv_main_light)
|
|
# floor_lamp videv<->zigbee + main_light->zigbee
|
|
device_follow_sw(ts, room.videv_floor_light, room.light_floor_light)
|
|
device_follow_sw(ts, room.light_floor_light, room.videv_floor_light)
|
|
device_follow_sw(ts, room.switch_main_light, room.light_floor_light)
|
|
# xmas_tree videv<-->shelly
|
|
if config.CHRISTMAS:
|
|
device_follow_sw(ts, room.videv_xmas_tree_light, room.switch_xmas_tree_light)
|
|
device_follow_sw(ts, room.switch_xmas_tree_light, room.videv_xmas_tree_light)
|
|
# Brightness and Colortemperature ####################
|
|
device_follow_br(ts, room.videv_main_light, room.light_main_light, room.switch_main_light)
|
|
device_follow_br(ts, room.light_main_light, room.videv_main_light, room.switch_main_light)
|
|
device_follow_ct(ts, room.videv_main_light, room.light_main_light, room.switch_main_light)
|
|
device_follow_ct(ts, room.light_main_light, room.videv_main_light, room.switch_main_light)
|
|
device_follow_br(ts, room.videv_floor_light, room.light_floor_light, room.light_floor_light)
|
|
device_follow_br(ts, room.light_floor_light, room.videv_floor_light, room.light_floor_light)
|
|
device_follow_ct(ts, room.videv_floor_light, room.light_floor_light, room.light_floor_light)
|
|
device_follow_ct(ts, room.light_floor_light, room.videv_floor_light, room.light_floor_light)
|
|
# Temperature ########################################
|
|
device_follow_temp(ts, room.videv_heating, room.valve_heating)
|
|
|
|
#
|
|
# ffe.sleep
|
|
#
|
|
room = h.ffe.sleep
|
|
# Switching devices ##################################
|
|
# main_light videv<-->shelly
|
|
device_follow_sw(ts, room.videv_main_light, room.switch_main_light)
|
|
device_follow_sw(ts, room.switch_main_light, room.videv_main_light)
|
|
# bed_light_di videv<-->zigbee
|
|
device_follow_sw(ts, room.videv_bed_dirk_light, room.light_bed_dirk_light)
|
|
device_follow_sw(ts, room.light_bed_dirk_light, room.videv_bed_dirk_light)
|
|
# bed_light_ma videv<-->zigbee
|
|
device_follow_sw(ts, room.videv_bed_marion_light, room.switch_bed_marion_light)
|
|
device_follow_sw(ts, room.switch_bed_marion_light, room.videv_bed_marion_light)
|
|
# wardrobe videv<-->zigbee
|
|
device_follow_sw(ts, room.videv_wardrobe_light, room.light_wardrobe_light)
|
|
device_follow_sw(ts, room.light_wardrobe_light, room.videv_wardrobe_light)
|
|
# Brightness and Colortemperature ####################
|
|
device_follow_br(ts, room.videv_main_light, room.light_main_light, room.switch_main_light)
|
|
device_follow_br(ts, room.light_main_light, room.videv_main_light, room.switch_main_light)
|
|
device_follow_ct(ts, room.videv_main_light, room.light_main_light, room.switch_main_light)
|
|
device_follow_ct(ts, room.light_main_light, room.videv_main_light, room.switch_main_light)
|
|
device_follow_br(ts, room.videv_bed_dirk_light, room.light_bed_dirk_light, room.light_bed_dirk_light)
|
|
device_follow_br(ts, room.light_bed_dirk_light, room.videv_bed_dirk_light, room.light_bed_dirk_light)
|
|
device_follow_br(ts, room.videv_wardrobe_light, room.light_wardrobe_light, room.light_wardrobe_light)
|
|
device_follow_br(ts, room.light_wardrobe_light, room.videv_wardrobe_light, room.light_wardrobe_light)
|
|
|
|
# Temperature ########################################
|
|
device_follow_temp(ts, room.videv_heating, room.valve_heating)
|
|
|
|
#
|
|
# ffe.diningroom
|
|
#
|
|
room = h.ffe.diningroom
|
|
# Switching devices ##################################
|
|
# main_light videv<-->shelly
|
|
device_follow_sw(ts, room.videv_main_light, room.switch_main_light)
|
|
device_follow_sw(ts, room.switch_main_light, room.videv_main_light)
|
|
# floor_lamp videv<->zigbee + main_light->zigbee
|
|
device_follow_sw(ts, room.videv_floor_light, room.switch_floor_light)
|
|
device_follow_sw(ts, room.switch_floor_light, room.videv_floor_light)
|
|
device_follow_sw(ts, room.switch_main_light, room.switch_floor_light)
|
|
# garland
|
|
if config.CHRISTMAS:
|
|
device_follow_sw(ts, room.videv_garland_light, room.switch_garland_light)
|
|
device_follow_sw(ts, room.switch_garland_light, room.videv_garland_light)
|
|
|
|
#
|
|
# ffe.kitchen
|
|
#
|
|
room = h.ffe.kitchen
|
|
# Switching devices ##################################
|
|
# main_light videv<-->shelly
|
|
device_follow_sw(ts, room.videv_main_light, room.switch_main_light)
|
|
device_follow_sw(ts, room.switch_main_light, room.videv_main_light)
|
|
# circulation_pump
|
|
device_follow_sw(ts, room.videv_circulation_pump, room.switch_circulation_pump)
|
|
device_follow_sw(ts, room.switch_circulation_pump, room.videv_circulation_pump)
|
|
# circulation pump feedback (flash test)
|
|
device_flash_by_vers(ts, room.switch_main_light, room.switch_circulation_pump, True, FLASH_TRIGGER_ACTIVATE)
|
|
device_flash_by_vers(ts, room.switch_main_light, room.switch_circulation_pump, False, FLASH_TRIGGER_ACTIVATE)
|
|
# Brightness and Colortemperature ####################
|
|
device_follow_br(ts, room.videv_main_light, room.light_main_light, room.switch_main_light)
|
|
device_follow_br(ts, room.light_main_light, room.videv_main_light, room.switch_main_light)
|
|
device_follow_ct(ts, room.videv_main_light, room.light_main_light, room.switch_main_light)
|
|
device_follow_ct(ts, room.light_main_light, room.videv_main_light, room.switch_main_light)
|
|
# Temperature ########################################
|
|
device_follow_temp(ts, room.videv_heating, room.valve_heating)
|
|
|
|
#
|
|
# ffe.floor
|
|
#
|
|
# Switching devices ##################################
|
|
room = h.ffe.floor
|
|
# main_light videv<-->shelly
|
|
device_follow_sw(ts, room.videv_main_light, room.switch_main_light)
|
|
device_follow_sw(ts, room.switch_main_light, room.videv_main_light)
|
|
# area all_off (flash test)
|
|
device_flash_by_vers(ts, room.switch_main_light, room.switch_main_light, True, FLASH_TRIGGER_LONGPUSH)
|
|
device_flash_by_vers(ts, room.switch_main_light, room.switch_main_light, False, FLASH_TRIGGER_LONGPUSH)
|
|
|
|
|
|
def ffw(ts: testSession, mc: mqtt_client, h: house):
|
|
#
|
|
# ffw.livingroom
|
|
#
|
|
room = h.ffw.livingroom
|
|
# Switching devices ##################################
|
|
# main_light videv<-->shelly
|
|
device_follow_sw(ts, room.videv_main_light, room.switch_main_light)
|
|
device_follow_sw(ts, room.switch_main_light, room.videv_main_light)
|
|
# Brightness and Colortemperature ####################
|
|
device_follow_br(ts, room.videv_main_light, room.light_main_light, room.switch_main_light)
|
|
device_follow_br(ts, room.light_main_light, room.videv_main_light, room.switch_main_light)
|
|
device_follow_ct(ts, room.videv_main_light, room.light_main_light, room.switch_main_light)
|
|
device_follow_ct(ts, room.light_main_light, room.videv_main_light, room.switch_main_light)
|
|
# Temperature ########################################
|
|
device_follow_temp(ts, room.videv_heating, room.valve_heating)
|
|
|
|
#
|
|
# ffw.sleep
|
|
#
|
|
room = h.ffw.sleep
|
|
# Switching devices ##################################
|
|
# main_light videv<-->shelly
|
|
device_follow_sw(ts, room.videv_main_light, room.switch_main_light)
|
|
device_follow_sw(ts, room.switch_main_light, room.videv_main_light)
|
|
device_follow_sw(ts, room.videv_window_light, room.light_window_light)
|
|
device_follow_sw(ts, room.light_window_light, room.videv_window_light)
|
|
device_follow_sw(ts, room.switch_main_light, room.light_window_light)
|
|
|
|
# Brightness and Colortemperature ####################
|
|
device_follow_br(ts, room.videv_main_light, room.light_main_light, room.switch_main_light)
|
|
device_follow_br(ts, room.light_main_light, room.videv_main_light, room.switch_main_light)
|
|
device_follow_br(ts, room.videv_window_light, room.light_window_light, room.light_window_light)
|
|
device_follow_br(ts, room.light_window_light, room.videv_window_light, room.light_window_light)
|
|
device_follow_ct(ts, room.videv_window_light, room.light_window_light, room.light_window_light)
|
|
device_follow_ct(ts, room.light_window_light, room.videv_window_light, room.light_window_light)
|
|
# Temperature ########################################
|
|
device_follow_temp(ts, room.videv_heating, room.valve_heating)
|
|
|
|
#
|
|
# ffw.julian
|
|
#
|
|
room = h.ffw.julian
|
|
# Switching devices ##################################
|
|
# main_light videv<-->shelly
|
|
device_follow_sw(ts, room.videv_main_light, room.switch_main_light)
|
|
device_follow_sw(ts, room.switch_main_light, room.videv_main_light)
|
|
# Brightness and Colortemperature ####################
|
|
device_follow_br(ts, room.videv_main_light, room.light_main_light, room.switch_main_light)
|
|
device_follow_br(ts, room.light_main_light, room.videv_main_light, room.switch_main_light)
|
|
device_follow_ct(ts, room.videv_main_light, room.light_main_light, room.switch_main_light)
|
|
device_follow_ct(ts, room.light_main_light, room.videv_main_light, room.switch_main_light)
|
|
# Temperature ########################################
|
|
device_follow_temp(ts, room.videv_heating, room.valve_heating)
|
|
|
|
#
|
|
# ffw.bath
|
|
#
|
|
room = h.ffw.bath
|
|
# Switching devices ##################################
|
|
# main_light videv<-->shelly
|
|
device_follow_sw(ts, room.videv_main_light, room.switch_main_light)
|
|
device_follow_sw(ts, room.switch_main_light, room.videv_main_light)
|
|
# Temperature ########################################
|
|
device_follow_temp(ts, room.videv_heating, room.valve_heating)
|
|
|
|
#
|
|
# ffw.floor
|
|
#
|
|
room = h.ffw.floor
|
|
# Switching devices ##################################
|
|
# main_light videv<-->shelly
|
|
device_follow_sw(ts, room.videv_main_light, room.switch_main_light)
|
|
device_follow_sw(ts, room.switch_main_light, room.videv_main_light)
|
|
# area all_off (flash test)
|
|
device_flash_by_vers(ts, room.switch_main_light, room.switch_main_light, True, FLASH_TRIGGER_LONGPUSH)
|
|
device_flash_by_vers(ts, room.switch_main_light, room.switch_main_light, False, FLASH_TRIGGER_LONGPUSH)
|
|
|
|
|
|
def gar(ts: testSession, mc: mqtt_client, h: house):
|
|
#
|
|
# ffw.livingroom
|
|
#
|
|
room = h.gar.garden
|
|
# Switching devices ##################################
|
|
# main_light videv<-->shelly
|
|
device_follow_sw(ts, room.videv_garland_light, room.switch_garland_light)
|
|
device_follow_sw(ts, room.switch_garland_light, room.videv_garland_light)
|
|
device_follow_sw(ts, room.videv_repeater, room.switch_repeater)
|
|
device_follow_sw(ts, room.switch_repeater, room.videv_repeater)
|
|
|
|
|
|
def gfe(ts: testSession, mc: mqtt_client, h: house):
|
|
#
|
|
# gfe.
|
|
#
|
|
# room = h.gfe
|
|
# Switching devices ##################################
|
|
pass
|
|
|
|
|
|
def gfw(ts: testSession, mc: mqtt_client, h: house):
|
|
#
|
|
# gfw.dirk
|
|
#
|
|
room = h.gfw.dirk
|
|
# Switching devices ##################################
|
|
# main_light videv<-->shelly
|
|
device_follow_sw(ts, room.videv_main_light, room.switch_main_light)
|
|
device_follow_sw(ts, room.switch_main_light, room.videv_main_light)
|
|
# desk_light videv<-->tradfri
|
|
device_follow_sw(ts, room.videv_desk_light, room.light_desk_light)
|
|
device_follow_sw(ts, room.light_desk_light, room.videv_desk_light)
|
|
# desk_light videv<-->powerplug
|
|
device_follow_sw(ts, room.videv_pc_dock, room.switch_pc_dock)
|
|
device_follow_sw(ts, room.switch_pc_dock, room.videv_pc_dock)
|
|
# powerplug videv <-> channel
|
|
device_follow_sw_with_keys(ts, room.videv_amplifier, room.videv_amplifier.KEY_OUTPUT_0, room.switch_powerplug_4, room.KEY_POWERPLUG_AMPLIFIER)
|
|
device_follow_sw_with_keys(ts, room.switch_powerplug_4, room.KEY_POWERPLUG_AMPLIFIER, room.videv_amplifier, room.videv_amplifier.KEY_OUTPUT_0)
|
|
device_follow_sw_with_keys(ts, room.videv_phono, room.videv_phono.KEY_OUTPUT_0, room.switch_powerplug_4, room.KEY_POWERPLUG_PHONO)
|
|
device_follow_sw_with_keys(ts, room.switch_powerplug_4, room.KEY_POWERPLUG_PHONO, room.videv_phono, room.videv_phono.KEY_OUTPUT_0)
|
|
device_follow_sw_with_keys(ts, room.videv_cd_player, room.videv_cd_player.KEY_OUTPUT_0, room.switch_powerplug_4, room.KEY_POWERPLUG_CD_PLAYER)
|
|
device_follow_sw_with_keys(ts, room.switch_powerplug_4, room.KEY_POWERPLUG_CD_PLAYER, room.videv_cd_player, room.videv_cd_player.KEY_OUTPUT_0)
|
|
device_follow_sw_with_keys(ts, room.videv_bluetooth, room.videv_bluetooth.KEY_OUTPUT_0, room.switch_powerplug_4, room.KEY_POWERPLUG_BT)
|
|
device_follow_sw_with_keys(ts, room.switch_powerplug_4, room.KEY_POWERPLUG_BT, room.videv_bluetooth, room.videv_bluetooth.KEY_OUTPUT_0)
|
|
# powerplug follow
|
|
device_follow_sw_with_keys(ts, room.switch_powerplug_4, room.KEY_POWERPLUG_BT, room.switch_powerplug_4, room.KEY_POWERPLUG_AMPLIFIER)
|
|
device_follow_sw_with_keys(ts, room.switch_powerplug_4, room.KEY_POWERPLUG_CD_PLAYER, room.switch_powerplug_4, room.KEY_POWERPLUG_AMPLIFIER)
|
|
device_follow_sw_with_keys(ts, room.switch_powerplug_4, room.KEY_POWERPLUG_PHONO, room.switch_powerplug_4, room.KEY_POWERPLUG_AMPLIFIER)
|
|
# Brightness and Colortemperature ####################
|
|
device_follow_br(ts, room.videv_main_light, room.light_main_light, room.switch_main_light)
|
|
device_follow_br(ts, room.light_main_light, room.videv_main_light, room.switch_main_light)
|
|
device_follow_ct(ts, room.videv_main_light, room.light_main_light, room.switch_main_light)
|
|
device_follow_ct(ts, room.light_main_light, room.videv_main_light, room.switch_main_light)
|
|
device_follow_br(ts, room.videv_desk_light, room.light_desk_light, room.light_desk_light)
|
|
device_follow_br(ts, room.light_desk_light, room.videv_desk_light, room.light_desk_light)
|
|
device_follow_ct(ts, room.videv_desk_light, room.light_desk_light, room.light_desk_light)
|
|
device_follow_ct(ts, room.light_desk_light, room.videv_desk_light, room.light_desk_light)
|
|
# Temperature ########################################
|
|
device_follow_temp(ts, room.videv_heating, room.valve_heating)
|
|
|
|
#
|
|
# gfw.marion
|
|
#
|
|
room = h.gfw.marion
|
|
# Switching devices ##################################
|
|
# main_light videv<-->shelly
|
|
device_follow_sw(ts, room.videv_main_light, room.switch_main_light)
|
|
device_follow_sw(ts, room.switch_main_light, room.videv_main_light)
|
|
# floor_lamp videv<->zigbee + main_light->zigbee
|
|
device_follow_sw(ts, room.videv_window_light, room.light_window_light)
|
|
device_follow_sw(ts, room.light_window_light, room.videv_window_light)
|
|
device_follow_sw(ts, room.switch_main_light, room.light_window_light)
|
|
# Brightness and Colortemperature ####################
|
|
device_follow_br(ts, room.videv_window_light, room.light_window_light, room.light_window_light)
|
|
device_follow_br(ts, room.light_window_light, room.videv_window_light, room.light_window_light)
|
|
device_follow_ct(ts, room.videv_window_light, room.light_window_light, room.light_window_light)
|
|
device_follow_ct(ts, room.light_window_light, room.videv_window_light, room.light_window_light)
|
|
# Temperature ########################################
|
|
device_follow_temp(ts, room.videv_heating, room.valve_heating)
|
|
|
|
#
|
|
# gfw.floor
|
|
#
|
|
room = h.gfw.floor
|
|
# Switching devices ##################################
|
|
# main_light videv<-->shelly
|
|
device_follow_sw(ts, room.videv_main_light, room.switch_main_light)
|
|
device_follow_sw(ts, room.switch_main_light, room.videv_main_light)
|
|
# Brightness and Colortemperature ####################
|
|
device_follow_br(ts, room.videv_main_light, room.light_main_light, room.switch_main_light)
|
|
device_follow_br(ts, room.light_main_light, room.videv_main_light, room.switch_main_light)
|
|
device_follow_ct(ts, room.videv_main_light, room.light_main_light, room.switch_main_light)
|
|
device_follow_ct(ts, room.light_main_light, room.videv_main_light, room.switch_main_light)
|
|
|
|
|
|
def stw(ts: testSession, mc: mqtt_client, h: house):
|
|
#
|
|
# stairways
|
|
#
|
|
room = h.stw.stairway
|
|
# Switching devices ##################################
|
|
# main_light videv<-->shelly
|
|
device_follow_sw(ts, room.videv_main_light, room.switch_main_light)
|
|
device_follow_sw(ts, room.switch_main_light, room.videv_main_light)
|
|
# area all_off (flash test)
|
|
device_flash_by_vers(ts, room.switch_main_light, room.switch_main_light, True, FLASH_TRIGGER_LONGPUSH)
|
|
device_flash_by_vers(ts, room.switch_main_light, room.switch_main_light, False, FLASH_TRIGGER_LONGPUSH)
|
|
|
|
|
|
def inter_room(ts: testSession, mc: mqtt_client, h: house):
|
|
#
|
|
# gfw.dirk.swith -> ffw.floor.switch
|
|
#
|
|
input = h.gfw.dirk.switch_main_light
|
|
output = h.gfw.floor.switch_main_light
|
|
device_follow_sw_with_keys(ts, input, input.KEY_INPUT_1, output, output.KEY_OUTPUT_0)
|