async def set_target_temp(self, temp, temporary=True,
                              timeout=OTGW_DEFAULT_TIMEOUT):
        """
        Set the thermostat setpoint and return the newly accepted
        value.
        kwarg @temporary specifies whether or not the thermostat
            program may override this temperature.

        This method is a coroutine
        """
        cmd = (OTGW_CMD_TARGET_TEMP if temporary
               else OTGW_CMD_TARGET_TEMP_CONST)
        value = '{:2.1f}'.format(temp)
        status = {}
        ret = await self._wait_for_cmd(cmd, value, timeout)
        if ret is None:
            return
        ret = float(ret)
        if 0 <= ret <= 30:
            if ret == 0:
                status[OTGW_SETP_OVRD_MODE] = OTGW_SETP_OVRD_DISABLED
                status[DATA_ROOM_SETPOINT_OVRD] = None
            else:
                if temporary:
                    ovrd_mode = OTGW_SETP_OVRD_TEMPORARY
                else:
                    ovrd_mode = OTGW_SETP_OVRD_PERMANENT
                status[OTGW_SETP_OVRD_MODE] = ovrd_mode
                status[DATA_ROOM_SETPOINT_OVRD] = ret
            self._update_status(status)
            return ret
Set the thermostat setpoint and return the newly accepted
        value.
        kwarg @temporary specifies whether or not the thermostat
            program may override this temperature.

        This method is a coroutine