コード例 #1
0
ファイル: thermostat.py プロジェクト: krzysztofz1/gateway
 def deserialize(api_data):  # type: (Dict) -> ThermostatGroupDTO
     thermostat_group_dto = ThermostatGroupDTO(id=0)
     SerializerToolbox.deserialize(
         dto=thermostat_group_dto,  # Referenced
         api_data=api_data,
         mapping={
             'outside_sensor':
             ('outside_sensor_id', ThermostatGroupSerializer.BYTE_MAX),
             'threshold_temp':
             ('threshold_temperature', ThermostatGroupSerializer.BYTE_MAX),
             'pump_delay':
             ('pump_delay', ThermostatGroupSerializer.BYTE_MAX)
         })
     for mode in ['heating', 'cooling']:
         for i in range(4):
             output_field = 'switch_to_{0}_output_{1}'.format(mode, i)
             value_field = 'switch_to_{0}_value_{1}'.format(mode, i)
             dto_field = 'switch_to_{0}_{1}'.format(mode, i)
             if output_field in api_data and value_field in api_data:
                 output = Toolbox.nonify(api_data[output_field],
                                         ThermostatGroupSerializer.BYTE_MAX)
                 value = api_data[value_field]
                 if output is None:
                     setattr(thermostat_group_dto, dto_field, None)
                 else:
                     setattr(thermostat_group_dto, dto_field,
                             [output, value])
     return thermostat_group_dto
コード例 #2
0
 def deserialize(api_data):  # type: (Dict) -> OutputDTO
     output_dto = OutputDTO(api_data['id'])
     SerializerToolbox.deserialize(
         dto=output_dto,  # Referenced
         api_data=api_data,
         mapping={
             'module_type': ('module_type', None),
             'name': ('name', None),
             'type': ('output_type', None),
             'lock_bit_id': ('lock_bit_id', OutputSerializer.BYTE_MAX),
             'timer': ('timer', OutputSerializer.WORD_MAX),
             'floor': ('floor', OutputSerializer.BYTE_MAX),
             'room': ('room', OutputSerializer.BYTE_MAX)
         })
     for i in range(4):
         base_field = 'can_led_{0}'.format(i + 1)
         id_field = '{0}_id'.format(base_field)
         function_field = '{0}_function'.format(base_field)
         if id_field in api_data and function_field in api_data:
             setattr(
                 output_dto, base_field,
                 FeedbackLedDTO(id=Toolbox.nonify(
                     api_data[id_field], OutputSerializer.BYTE_MAX),
                                function=api_data[function_field]))
     return output_dto
コード例 #3
0
 def deserialize(api_data):  # type: (Dict) -> ShutterGroupDTO
     shutter_group_dto = ShutterGroupDTO(api_data['id'])
     SerializerToolbox.deserialize(
         dto=shutter_group_dto,  # Referenced
         api_data=api_data,
         mapping={
             'timer_up': ('timer_up', ShutterGroupSerializer.BYTE_MAX),
             'timer_down': ('timer_down', ShutterGroupSerializer.BYTE_MAX),
             'room': ('room', ShutterGroupSerializer.BYTE_MAX)
         })
     return shutter_group_dto
コード例 #4
0
ファイル: group_action.py プロジェクト: krzysztofz1/gateway
 def deserialize(api_data):  # type: (Dict) -> GroupActionDTO
     group_action_dto = GroupActionDTO(api_data['id'])
     SerializerToolbox.deserialize(
         dto=group_action_dto,  # Referenced
         api_data=api_data,
         mapping={
             'name': ('name', None),
             'actions': ('actions', lambda s: []
                         if s == '' else [int(a) for a in s.split(',')])
         })
     return group_action_dto
コード例 #5
0
ファイル: pulse_counter.py プロジェクト: krzysztofz1/gateway
 def deserialize(api_data):  # type: (Dict) -> PulseCounterDTO
     pulse_counter_dto = PulseCounterDTO(api_data['id'])
     SerializerToolbox.deserialize(
         dto=pulse_counter_dto,  # Referenced
         api_data=api_data,
         mapping={
             'name': ('name', None),
             'persistent': ('persistent', None),
             'input': ('input_id', PulseCounterSerializer.BYTE_MAX),
             'room': ('room', PulseCounterSerializer.BYTE_MAX)
         })
     return pulse_counter_dto
コード例 #6
0
ファイル: sensor.py プロジェクト: krzysztofz1/gateway
 def deserialize(api_data):  # type: (Dict) -> SensorDTO
     sensor_dto = SensorDTO(api_data['id'])
     SerializerToolbox.deserialize(
         dto=sensor_dto,  # Referenced
         api_data=api_data,
         mapping={
             'name': ('name', None),
             'offset': ('offset', 0),
             'room': ('room', SensorSerializer.BYTE_MAX),
             'virtual': ('virtual', None)
         })
     return sensor_dto
コード例 #7
0
 def deserialize(api_data):
     # type: (Dict) -> OutputStateDTO
     output_state_dto = OutputStateDTO(api_data['id'])
     SerializerToolbox.deserialize(
         dto=output_state_dto,  # Referenced
         api_data=api_data,
         mapping={
             'status': ('status', bool),
             'ctimer': ('ctimer', lambda x: x or 0),
             'dimmer': ('dimmer', lambda x: x or 0),
             'locked': ('locked', lambda x: x or False)
         })
     return output_state_dto
コード例 #8
0
ファイル: thermostat.py プロジェクト: krzysztofz1/gateway
 def deserialize(api_data):  # type: (Dict) -> PumpGroupDTO
     pump_group_dto = PumpGroupDTO(id=0)
     SerializerToolbox.deserialize(
         dto=pump_group_dto,  # Referenced
         api_data=api_data,
         mapping={
             'output': ('pump_output_id', PumpGroupSerializer.BYTE_MAX),
             'rooom': ('room_id', PumpGroupSerializer.BYTE_MAX)
         })
     if 'outputs' in api_data:
         pump_group_dto.valve_output_ids = [
             int(output_id) for output_id in api_data['outputs'].split(',')
         ]
     return pump_group_dto
コード例 #9
0
ファイル: rtd10.py プロジェクト: krzysztofz1/gateway
 def deserialize(api_data):  # type: (Dict) -> RTD10DTO
     shutter_dto = RTD10DTO(api_data['id'])
     SerializerToolbox.deserialize(
         dto=shutter_dto,  # Referenced
         api_data=api_data,
         mapping={
             field: (field, RTD10Serializer.BYTE_MAX)
             for field in [
                 'temp_setpoint_output', 'ventilation_speed_output',
                 'ventilation_speed_value', 'mode_output', 'mode_value',
                 'on_off_output', 'poke_angle_output', 'poke_angle_value',
                 'room'
             ]
         })
     return shutter_dto
コード例 #10
0
 def serialize(
         global_feedback_dto,
         fields):  # type: (GlobalFeedbackDTO, Optional[List[str]]) -> Dict
     data = {
         'id':
         global_feedback_dto.id,
         'can_led_1_id':
         Toolbox.denonify(global_feedback_dto.can_led_1.id,
                          GlobalFeedbackSerializer.BYTE_MAX),
         'can_led_1_function':
         global_feedback_dto.can_led_1.function,
         'can_led_2_id':
         Toolbox.denonify(global_feedback_dto.can_led_2.id,
                          GlobalFeedbackSerializer.BYTE_MAX),
         'can_led_2_function':
         global_feedback_dto.can_led_2.function,
         'can_led_3_id':
         Toolbox.denonify(global_feedback_dto.can_led_3.id,
                          GlobalFeedbackSerializer.BYTE_MAX),
         'can_led_3_function':
         global_feedback_dto.can_led_3.function,
         'can_led_4_id':
         Toolbox.denonify(global_feedback_dto.can_led_4.id,
                          GlobalFeedbackSerializer.BYTE_MAX),
         'can_led_4_function':
         global_feedback_dto.can_led_4.function
     }
     return SerializerToolbox.filter_fields(data, fields)
コード例 #11
0
ファイル: ventilation.py プロジェクト: krzysztofz1/gateway
 def serialize(ventilation_dto, fields):
     # type: (VentilationDTO, Optional[List[str]]) -> Dict[str,Any]
     data = {
         'id':
         ventilation_dto.id,
         'external_id':
         Toolbox.denonify(ventilation_dto.external_id, ''),
         'source': {
             'type': ventilation_dto.source.type,
             'name': ventilation_dto.source.name
         },
         'name':
         Toolbox.denonify(ventilation_dto.name, ''),
         'amount_of_levels':
         Toolbox.denonify(ventilation_dto.amount_of_levels, 0),
         'device': {
             'vendor': Toolbox.denonify(ventilation_dto.device_vendor, ''),
             'type': Toolbox.denonify(ventilation_dto.device_type, '')
         }
     }
     if ventilation_dto.device_serial:
         data['device'].update({
             'serial':
             Toolbox.denonify(ventilation_dto.device_serial, '')
         })
     return SerializerToolbox.filter_fields(data, fields)
コード例 #12
0
ファイル: thermostat.py プロジェクト: rolaya/gateway
 def serialize(
         thermostat_group_dto,
         fields):  # type: (ThermostatGroupDTO, Optional[List[str]]) -> Dict
     data = {
         'id':
         thermostat_group_dto.id,
         'outside_sensor':
         Toolbox.denonify(thermostat_group_dto.outside_sensor_id,
                          ThermostatGroupSerializer.BYTE_MAX),
         'threshold_temp':
         Toolbox.denonify(thermostat_group_dto.threshold_temperature,
                          ThermostatGroupSerializer.BYTE_MAX),
         'pump_delay':
         Toolbox.denonify(thermostat_group_dto.pump_delay,
                          ThermostatGroupSerializer.BYTE_MAX)
     }
     for mode in ['heating', 'cooling']:
         for i in range(4):
             output = 'switch_to_{0}_output_{1}'.format(mode, i)
             value = 'switch_to_{0}_value_{1}'.format(mode, i)
             field = 'switch_to_{0}_{1}'.format(mode, i)
             dto_value = getattr(thermostat_group_dto,
                                 field)  # type: Optional[Tuple[int, int]]
             data[output] = Toolbox.denonify(
                 None if dto_value is None else dto_value[0],
                 ThermostatGroupSerializer.BYTE_MAX)
             data[value] = Toolbox.denonify(
                 None if dto_value is None else dto_value[1],
                 ThermostatGroupSerializer.BYTE_MAX)
     return SerializerToolbox.filter_fields(data, fields)
コード例 #13
0
ファイル: shutter.py プロジェクト: rolaya/gateway
 def serialize(shutter_dto,
               fields):  # type: (ShutterDTO, Optional[List[str]]) -> Dict
     data = {
         'id':
         shutter_dto.id,
         'name':
         shutter_dto.name,
         'timer_up':
         Toolbox.denonify(shutter_dto.timer_up, ShutterSerializer.BYTE_MAX),
         'timer_down':
         Toolbox.denonify(shutter_dto.timer_down,
                          ShutterSerializer.BYTE_MAX),
         'up_down_config':
         Toolbox.denonify(shutter_dto.up_down_config,
                          ShutterSerializer.BYTE_MAX),
         'group_1':
         Toolbox.denonify(shutter_dto.group_1, ShutterSerializer.BYTE_MAX),
         'group_2':
         Toolbox.denonify(shutter_dto.group_2, ShutterSerializer.BYTE_MAX),
         'room':
         Toolbox.denonify(shutter_dto.room, ShutterSerializer.BYTE_MAX),
         'steps':
         Toolbox.denonify(shutter_dto.steps, ShutterSerializer.WORD_MAX)
     }
     return SerializerToolbox.filter_fields(data, fields)
コード例 #14
0
ファイル: thermostat.py プロジェクト: krzysztofz1/gateway
 def serialize(
         thermostat_dto,
         fields):  # type: (ThermostatDTO, Optional[List[str]]) -> Dict
     data = {
         'id':
         thermostat_dto.id,
         'name':
         thermostat_dto.name,
         'room':
         Toolbox.denonify(thermostat_dto.room,
                          ThermostatSerializer.BYTE_MAX),
         'setp0':
         thermostat_dto.setp0,
         'setp1':
         thermostat_dto.setp1,
         'setp2':
         thermostat_dto.setp2,
         'setp3':
         thermostat_dto.setp3,
         'setp4':
         thermostat_dto.setp4,
         'setp5':
         thermostat_dto.setp5,
         'sensor':
         Toolbox.denonify(thermostat_dto.sensor,
                          ThermostatSerializer.BYTE_MAX),
         'output0':
         Toolbox.denonify(thermostat_dto.output0,
                          ThermostatSerializer.BYTE_MAX),
         'output1':
         Toolbox.denonify(thermostat_dto.output1,
                          ThermostatSerializer.BYTE_MAX),
         'pid_p':
         Toolbox.denonify(thermostat_dto.pid_p,
                          ThermostatSerializer.BYTE_MAX),
         'pid_i':
         Toolbox.denonify(thermostat_dto.pid_i,
                          ThermostatSerializer.BYTE_MAX),
         'pid_d':
         Toolbox.denonify(thermostat_dto.pid_d,
                          ThermostatSerializer.BYTE_MAX),
         'pid_int':
         Toolbox.denonify(thermostat_dto.pid_int,
                          ThermostatSerializer.BYTE_MAX),
         'permanent_manual':
         thermostat_dto.permanent_manual
     }
     for day in ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun']:
         field = 'auto_{0}'.format(day)
         dto_data = getattr(thermostat_dto,
                            field)  # type: ThermostatScheduleDTO
         if dto_data is None:
             raise RuntimeError(
                 'Schedules are mandatory in the ThermostatSerializer')
         data[field] = [
             dto_data.temp_night, dto_data.start_day_1, dto_data.end_day_1,
             dto_data.temp_day_1, dto_data.start_day_2, dto_data.end_day_2,
             dto_data.temp_day_2
         ]
     return SerializerToolbox.filter_fields(data, fields)
コード例 #15
0
ファイル: room.py プロジェクト: rolaya/gateway
 def serialize(room_dto,
               fields):  # type: (RoomDTO, Optional[List[str]]) -> Dict
     data = {
         'id': room_dto.id,
         'name': Toolbox.denonify(room_dto.name, ''),
         'floor': 255 if room_dto.floor is None else room_dto.floor.id
     }
     return SerializerToolbox.filter_fields(data, fields)
コード例 #16
0
ファイル: shutter.py プロジェクト: krzysztofz1/gateway
 def deserialize(api_data):  # type: (Dict) -> ShutterDTO
     shutter_dto = ShutterDTO(api_data['id'])
     SerializerToolbox.deserialize(
         dto=shutter_dto,  # Referenced
         api_data=api_data,
         mapping={
             'name': ('name', None),
             'timer_up': ('timer_up', ShutterSerializer.BYTE_MAX),
             'timer_down': ('timer_down', ShutterSerializer.BYTE_MAX),
             'up_down_config':
             ('up_down_config', ShutterSerializer.BYTE_MAX),
             'group_1': ('group_1', ShutterSerializer.BYTE_MAX),
             'group_2': ('group_2', ShutterSerializer.BYTE_MAX),
             'room': ('room', ShutterSerializer.BYTE_MAX),
             'steps': ('steps', ShutterSerializer.WORD_MAX)
         })
     return shutter_dto
コード例 #17
0
 def deserialize(api_data):  # type: (Dict) -> InputDTO
     input_dto = InputDTO(api_data['id'])
     SerializerToolbox.deserialize(
         dto=input_dto,  # Referenced
         api_data=api_data,
         mapping={
             'module_type': ('module_type', None),
             'name': ('name', None),
             'action': ('action', InputSerializer.BYTE_MAX),
             'basic_actions':
             ('basic_actions', lambda s: []
              if s == '' else [int(a) for a in s.split(',')]),
             'invert': ('invert', lambda i: i != 255),
             'can': ('can', lambda s: s == 'C'),
             'event_enabled': ('event_enabled', None),
             'room': ('room', InputSerializer.BYTE_MAX)
         })
     return input_dto
コード例 #18
0
ファイル: ventilation.py プロジェクト: rolaya/gateway
 def serialize(status_dto, fields):
     # type: (VentilationStatusDTO, Optional[List[str]]) -> Dict[str,Any]
     data = {
         'id': status_dto.id,
         'mode': status_dto.mode,
         'level': status_dto.level,
         # timer value is write only
         'remaining_time': status_dto.remaining_time
     }
     return SerializerToolbox.filter_fields(data, fields)
コード例 #19
0
ファイル: output.py プロジェクト: rolaya/gateway
 def serialize(output_state_dto, fields):
     # type: (OutputStateDTO, Optional[List[str]]) -> Dict
     data = {
         'id': output_state_dto.id,
         'status': 1 if output_state_dto.status else 0,
         'ctimer': output_state_dto.ctimer,
         'dimmer': output_state_dto.dimmer,
         'locked': output_state_dto.locked
     }
     return SerializerToolbox.filter_fields(data, fields)
コード例 #20
0
ファイル: shutter_group.py プロジェクト: rolaya/gateway
 def deserialize(api_data):  # type: (Dict) -> Tuple[ShutterGroupDTO, List[str]]
     loaded_fields = ['id']
     shutter_group_dto = ShutterGroupDTO(api_data['id'])
     loaded_fields += SerializerToolbox.deserialize(
         dto=shutter_group_dto,  # Referenced
         api_data=api_data,
         mapping={'timer_up': ('timer_up', ShutterGroupSerializer.BYTE_MAX),
                  'timer_down': ('timer_down', ShutterGroupSerializer.BYTE_MAX),
                  'room': ('room', ShutterGroupSerializer.BYTE_MAX)}
     )
     return shutter_group_dto, loaded_fields
コード例 #21
0
ファイル: ventilation.py プロジェクト: krzysztofz1/gateway
 def serialize(status_dto, fields):
     # type: (VentilationStatusDTO, Optional[List[str]]) -> Dict[str,Any]
     data = {
         'id': status_dto.id,
         'mode': status_dto.mode,
         'level': status_dto.level,
         'remaining_time': status_dto.remaining_time,
         'timer': status_dto.timer,
         'connected': status_dto.is_connected
     }
     return SerializerToolbox.filter_fields(data, fields)
コード例 #22
0
ファイル: sensor.py プロジェクト: krzysztofz1/gateway
 def serialize(sensor_dto,
               fields):  # type: (SensorDTO, Optional[List[str]]) -> Dict
     data = {
         'id': sensor_dto.id,
         'name': sensor_dto.name,
         'offset': Toolbox.denonify(sensor_dto.offset, 0),
         'room': Toolbox.denonify(sensor_dto.room,
                                  SensorSerializer.BYTE_MAX),
         'virtual': sensor_dto.virtual
     }
     return SerializerToolbox.filter_fields(data, fields)
コード例 #23
0
ファイル: rtd10.py プロジェクト: rolaya/gateway
 def serialize(rtd10_dto,
               fields):  # type: (RTD10DTO, Optional[List[str]]) -> Dict
     data = {'id': rtd10_dto.id}
     for field in [
             'temp_setpoint_output', 'ventilation_speed_output',
             'ventilation_speed_value', 'mode_output', 'mode_value',
             'on_off_output', 'poke_angle_output', 'poke_angle_value',
             'room'
     ]:
         data[field] = Toolbox.denonify(getattr(rtd10_dto, field),
                                        RTD10Serializer.BYTE_MAX)
     return SerializerToolbox.filter_fields(data, fields)
コード例 #24
0
ファイル: module.py プロジェクト: krzysztofz1/gateway
 def serialize(module_dto,
               fields):  # type: (ModuleDTO, Optional[List[str]]) -> Dict
     data = {'address': module_dto.address}  # type: Dict[str, Any]
     if module_dto.source == ModuleDTO.Source.MASTER:
         category_map = {
             ModuleDTO.ModuleType.CAN_CONTROL: 'INPUT',
             ModuleDTO.ModuleType.SENSOR: 'INPUT',
             ModuleDTO.ModuleType.INPUT: 'INPUT',
             ModuleDTO.ModuleType.SHUTTER: 'SHUTTER',
             ModuleDTO.ModuleType.OUTPUT: 'OUTPUT',
             ModuleDTO.ModuleType.DIM_CONTROL: 'OUTPUT',
             ModuleDTO.ModuleType.OPEN_COLLECTOR: 'OUTPUT',
             None: 'UNKNOWN'
         }
         type_int = int(module_dto.address.split('.')[0])
         data.update({
             'type':
             chr(type_int) if 32 <= type_int <= 126 else None,
             'hardware_type':
             module_dto.hardware_type,
             'module_nr':
             module_dto.order,
             'is_can':
             (module_dto.hardware_type == ModuleDTO.HardwareType.EMULATED or
              module_dto.module_type == ModuleDTO.ModuleType.CAN_CONTROL),
             'is_virtual':
             module_dto.hardware_type == ModuleDTO.HardwareType.VIRTUAL,
             'category':
             category_map.get(module_dto.module_type, 'UNKNOWN')
         })
         if module_dto.hardware_type == ModuleDTO.HardwareType.PHYSICAL:
             data.update({
                 'firmware': module_dto.firmware_version,
                 'hardware': module_dto.hardware_version
             })
     else:
         module_type_map = {
             ModuleDTO.ModuleType.ENERGY: 'E',
             ModuleDTO.ModuleType.POWER: 'P',
             ModuleDTO.ModuleType.P1_CONCENTRATOR: 'C',
             None: 'U'
         }
         data.update({
             'type':
             module_type_map.get(module_dto.module_type, 'U'),
             'firmware':
             module_dto.firmware_version,
             'address':
             module_dto.address,
             'id':
             module_dto.order
         })
     return SerializerToolbox.filter_fields(data, fields)
コード例 #25
0
 def serialize(
         group_action_dto,
         fields):  # type: (GroupActionDTO, Optional[List[str]]) -> Dict
     data = {
         'id':
         group_action_dto.id,
         'name':
         group_action_dto.name,
         'actions':
         ','.join([str(action) for action in group_action_dto.actions])
     }
     return SerializerToolbox.filter_fields(data, fields)
コード例 #26
0
 def deserialize(
         api_data):  # type: (Dict) -> Tuple[GroupActionDTO, List[str]]
     loaded_fields = ['id']
     group_action_dto = GroupActionDTO(api_data['id'])
     loaded_fields += SerializerToolbox.deserialize(
         dto=group_action_dto,  # Referenced
         api_data=api_data,
         mapping={
             'name': ('name', None),
             'actions': ('actions', lambda s: []
                         if s == '' else [int(a) for a in s.split(',')])
         })
     return group_action_dto, loaded_fields
コード例 #27
0
ファイル: rtd10.py プロジェクト: rolaya/gateway
 def serialize(
     global_rtd10_dto, fields
 ):  # type: (GlobalRTD10DTO, Optional[List[str]]) -> Dict[str, Any]
     data = {}
     for temperature in GlobalRTD10DTO.TEMPERATURES:
         formatted_temp = GlobalRTD10Serializer._temp_to_str(temperature)
         data['output_value_heating_{0}'.format(
             formatted_temp)] = global_rtd10_dto.heating_values.get(
                 temperature, GlobalRTD10Serializer.BYTE_MAX)
         data['output_value_cooling_{0}'.format(
             formatted_temp)] = global_rtd10_dto.cooling_values.get(
                 temperature, GlobalRTD10Serializer.BYTE_MAX)
     return SerializerToolbox.filter_fields(data, fields)
コード例 #28
0
 def deserialize(api_data):  # type: (Dict) -> Tuple[SensorDTO, List[str]]
     loaded_fields = ['id']
     sensor_dto = SensorDTO(api_data['id'])
     loaded_fields += SerializerToolbox.deserialize(
         dto=sensor_dto,  # Referenced
         api_data=api_data,
         mapping={
             'name': ('name', None),
             'offset': ('offset', 0),
             'room': ('room', SensorSerializer.BYTE_MAX),
             'virtual': ('virtual', None)
         })
     return sensor_dto, loaded_fields
コード例 #29
0
ファイル: pulse_counter.py プロジェクト: rolaya/gateway
 def deserialize(
         api_data):  # type: (Dict) -> Tuple[PulseCounterDTO, List[str]]
     loaded_fields = ['id']
     pulse_counter_dto = PulseCounterDTO(api_data['id'])
     loaded_fields += SerializerToolbox.deserialize(
         dto=pulse_counter_dto,  # Referenced
         api_data=api_data,
         mapping={
             'name': ('name', None),
             'persistent': ('persistent', None),
             'input': ('input_id', PulseCounterSerializer.BYTE_MAX),
             'room': ('room', PulseCounterSerializer.BYTE_MAX)
         })
     return pulse_counter_dto, loaded_fields
コード例 #30
0
ファイル: output.py プロジェクト: rolaya/gateway
 def deserialize(api_data):
     # type: (Dict) -> Tuple[OutputStateDTO, List[str]]
     loaded_fields = ['id']
     output_state_dto = OutputStateDTO(api_data['id'])
     loaded_fields += SerializerToolbox.deserialize(
         dto=output_state_dto,  # Referenced
         api_data=api_data,
         mapping={
             'status': ('status', bool),
             'ctimer': ('ctimer', lambda x: x or 0),
             'dimmer': ('dimmer', lambda x: x or 0),
             'locked': ('locked', lambda x: x or False)
         })
     return output_state_dto, loaded_fields